WeakBlock::FreeCell* WeakSet::addAllocator() { WeakBlock* block = WeakBlock::create(); m_heap->didAllocate(WeakBlock::blockSize); m_blocks.append(block); WeakBlock::SweepResult sweepResult = block->takeSweepResult(); ASSERT(!sweepResult.isNull() && sweepResult.freeList); return sweepResult.freeList; }
WeakBlock::FreeCell* WeakSet::addAllocator() { if (!isOnList()) heap()->objectSpace().addActiveWeakSet(this); WeakBlock* block = WeakBlock::create(*heap(), m_container); heap()->didAllocate(WeakBlock::blockSize); m_blocks.append(block); WeakBlock::SweepResult sweepResult = block->takeSweepResult(); ASSERT(!sweepResult.isNull() && sweepResult.freeList); return sweepResult.freeList; }
WeakBlock::FreeCell* WeakSet::tryFindAllocator() { while (m_nextAllocator) { WeakBlock* block = m_nextAllocator; m_nextAllocator = m_nextAllocator->next(); WeakBlock::SweepResult sweepResult = block->takeSweepResult(); if (sweepResult.freeList) return sweepResult.freeList; } return 0; }
void WeakSet::sweep() { WeakBlock* next; for (WeakBlock* block = m_blocks.head(); block; block = next) { next = block->next(); // If a block is completely empty, a new sweep won't have any effect. if (block->isEmpty()) continue; block->takeSweepResult(); // Force a new sweep by discarding the last sweep. block->sweep(); } }