%PDF- %PDF-
Direktori : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/ |
Current File : /home/vacivi36/vittasync.vacivitta.com.br/vittasync/node/deps/v8/src/heap/main-allocator-inl.h |
// Copyright 2023 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_HEAP_MAIN_ALLOCATOR_INL_H_ #define V8_HEAP_MAIN_ALLOCATOR_INL_H_ #include "src/base/sanitizer/msan.h" #include "src/heap/heap-inl.h" #include "src/heap/main-allocator.h" namespace v8 { namespace internal { AllocationResult MainAllocator::AllocateRaw(int size_in_bytes, AllocationAlignment alignment, AllocationOrigin origin) { DCHECK(!v8_flags.enable_third_party_heap); size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes); AllocationResult result; if (USE_ALLOCATION_ALIGNMENT_BOOL && alignment != kTaggedAligned) { result = AllocateFastAligned(size_in_bytes, nullptr, alignment, origin); } else { result = AllocateFastUnaligned(size_in_bytes, origin); } return result.IsFailure() ? AllocateRawSlow(size_in_bytes, alignment, origin) : result; } AllocationResult MainAllocator::AllocateFastUnaligned(int size_in_bytes, AllocationOrigin origin) { size_in_bytes = ALIGN_TO_ALLOCATION_ALIGNMENT(size_in_bytes); if (!allocation_info().CanIncrementTop(size_in_bytes)) { return AllocationResult::Failure(); } Tagged<HeapObject> obj = HeapObject::FromAddress(allocation_info().IncrementTop(size_in_bytes)); MSAN_ALLOCATED_UNINITIALIZED_MEMORY(obj.address(), size_in_bytes); return AllocationResult::FromObject(obj); } AllocationResult MainAllocator::AllocateFastAligned( int size_in_bytes, int* result_aligned_size_in_bytes, AllocationAlignment alignment, AllocationOrigin origin) { Address top = allocation_info().top(); int filler_size = Heap::GetFillToAlign(top, alignment); int aligned_size_in_bytes = size_in_bytes + filler_size; if (!allocation_info().CanIncrementTop(aligned_size_in_bytes)) { return AllocationResult::Failure(); } Tagged<HeapObject> obj = HeapObject::FromAddress( allocation_info().IncrementTop(aligned_size_in_bytes)); if (result_aligned_size_in_bytes) *result_aligned_size_in_bytes = aligned_size_in_bytes; if (filler_size > 0) { obj = heap()->PrecedeWithFiller(obj, filler_size); } MSAN_ALLOCATED_UNINITIALIZED_MEMORY(obj.address(), size_in_bytes); return AllocationResult::FromObject(obj); } bool MainAllocator::TryFreeLast(Address object_address, int object_size) { if (top() != kNullAddress) { return allocation_info().DecrementTopIfAdjacent(object_address, object_size); } return false; } } // namespace internal } // namespace v8 #endif // V8_HEAP_MAIN_ALLOCATOR_INL_H_