CheckedBoolean CopiedSpace::getFreshBlock(AllocationEffort allocationEffort, CopiedBlock** outBlock) { CopiedBlock* block = 0; if (allocationEffort == AllocationMustSucceed) { if (HeapBlock* heapBlock = m_heap->blockAllocator().allocate()) block = new (NotNull, heapBlock) CopiedBlock(heapBlock->m_allocation); else if (!allocateNewBlock(&block)) { *outBlock = 0; ASSERT_NOT_REACHED(); return false; } } else { ASSERT(allocationEffort == AllocationCanFail); if (m_heap->shouldCollect()) m_heap->collect(Heap::DoNotSweep); if (!getFreshBlock(AllocationMustSucceed, &block)) { *outBlock = 0; ASSERT_NOT_REACHED(); return false; } } ASSERT(block); ASSERT(is8ByteAligned(block->m_offset)); *outBlock = block; return true; }
CopiedBlock::CopiedBlock(size_t capacity) : DoublyLinkedListNode<CopiedBlock>() , m_capacity(capacity) , m_remaining(payloadCapacity()) , m_isPinned(false) , m_isOld(false) , m_liveBytes(0) #ifndef NDEBUG , m_liveObjects(0) #endif { ASSERT(is8ByteAligned(reinterpret_cast<void*>(m_remaining))); }