X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..4be4e30906bcb8ee30b4d189205cb70bad6707ce:/heap/WeakSet.cpp?ds=sidebyside diff --git a/heap/WeakSet.cpp b/heap/WeakSet.cpp index d9c773c..e62e66e 100644 --- a/heap/WeakSet.cpp +++ b/heap/WeakSet.cpp @@ -27,6 +27,7 @@ #include "WeakSet.h" #include "Heap.h" +#include "VM.h" namespace JSC { @@ -35,59 +36,17 @@ WeakSet::~WeakSet() WeakBlock* next = 0; for (WeakBlock* block = m_blocks.head(); block; block = next) { next = block->next(); - WeakBlock::destroy(block); + heap()->blockAllocator().deallocate(WeakBlock::destroy(block)); } m_blocks.clear(); } -void WeakSet::finalizeAll() -{ - for (WeakBlock* block = m_blocks.head(); block; block = block->next()) - block->finalizeAll(); -} - -void WeakSet::visitLiveWeakImpls(HeapRootVisitor& visitor) -{ - for (WeakBlock* block = m_blocks.head(); block; block = block->next()) - block->visitLiveWeakImpls(visitor); -} - -void WeakSet::visitDeadWeakImpls(HeapRootVisitor& visitor) -{ - for (WeakBlock* block = m_blocks.head(); block; block = block->next()) - block->visitDeadWeakImpls(visitor); -} - 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->sweepResult().isNull() && block->sweepResult().blockIsFree) - continue; - - block->takeSweepResult(); // Force a new sweep by discarding the last sweep. + for (WeakBlock* block = m_blocks.head(); block; block = block->next()) block->sweep(); - } -} - -void WeakSet::shrink() -{ - WeakBlock* next; - for (WeakBlock* block = m_blocks.head(); block; block = next) { - next = block->next(); - if (!block->sweepResult().isNull() && block->sweepResult().blockIsFree) - removeAllocator(block); - } -} - -void WeakSet::resetAllocator() -{ - m_allocator = 0; - m_nextAllocator = m_blocks.head(); + resetAllocator(); } WeakBlock::FreeCell* WeakSet::findAllocator() @@ -104,7 +63,6 @@ WeakBlock::FreeCell* WeakSet::tryFindAllocator() WeakBlock* block = m_nextAllocator; m_nextAllocator = m_nextAllocator->next(); - block->sweep(); WeakBlock::SweepResult sweepResult = block->takeSweepResult(); if (sweepResult.freeList) return sweepResult.freeList; @@ -115,8 +73,8 @@ WeakBlock::FreeCell* WeakSet::tryFindAllocator() WeakBlock::FreeCell* WeakSet::addAllocator() { - WeakBlock* block = WeakBlock::create(); - m_heap->didAllocate(WeakBlock::blockSize); + WeakBlock* block = WeakBlock::create(heap()->blockAllocator().allocate()); + heap()->didAllocate(WeakBlock::blockSize); m_blocks.append(block); WeakBlock::SweepResult sweepResult = block->takeSweepResult(); ASSERT(!sweepResult.isNull() && sweepResult.freeList); @@ -126,7 +84,7 @@ WeakBlock::FreeCell* WeakSet::addAllocator() void WeakSet::removeAllocator(WeakBlock* block) { m_blocks.remove(block); - WeakBlock::destroy(block); + heap()->blockAllocator().deallocate(WeakBlock::destroy(block)); } } // namespace JSC