From 284837daa07b29d6a63a748544a90b1f5842ac5c Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Mon, 10 Sep 2012 19:10:20 +0200 Subject: Imported WebKit commit 68645295d2e3e09af2c942f092556f06aa5f8b0d (http://svn.webkit.org/repository/webkit/trunk@128073) New snapshot --- Source/JavaScriptCore/heap/Heap.cpp | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'Source/JavaScriptCore/heap/Heap.cpp') diff --git a/Source/JavaScriptCore/heap/Heap.cpp b/Source/JavaScriptCore/heap/Heap.cpp index 669178804..4ab8ccb31 100644 --- a/Source/JavaScriptCore/heap/Heap.cpp +++ b/Source/JavaScriptCore/heap/Heap.cpp @@ -753,6 +753,9 @@ void Heap::collect(SweepToggle sweepToggle) m_objectSpace.resetAllocators(); } + if (Options::useZombieMode()) + zombifyDeadObjects(); + size_t currentHeapSize = size(); if (fullGC) { m_sizeAfterLastCollect = currentHeapSize; @@ -844,4 +847,49 @@ void Heap::didStartVMShutdown() lastChanceToFinalize(); } +class ZombifyCellFunctor : public MarkedBlock::VoidFunctor { +public: + ZombifyCellFunctor(size_t cellSize) + : m_cellSize(cellSize) + { + } + + void operator()(JSCell* cell) + { + if (Options::zombiesAreImmortal()) + MarkedBlock::blockFor(cell)->setMarked(cell); + + void** current = reinterpret_cast(cell); + + // We want to maintain zapped-ness because that's how we know if we've called + // the destructor. + if (cell->isZapped()) + current++; + + void* limit = static_cast(reinterpret_cast(cell) + m_cellSize); + for (; current < limit; current++) + *current = reinterpret_cast(0xbbadbeef); + } + +private: + size_t m_cellSize; +}; + +class ZombifyBlockFunctor : public MarkedBlock::VoidFunctor { +public: + void operator()(MarkedBlock* block) + { + ZombifyCellFunctor functor(block->cellSize()); + block->forEachDeadCell(functor); + } +}; + +void Heap::zombifyDeadObjects() +{ + m_objectSpace.sweep(); + + ZombifyBlockFunctor functor; + m_objectSpace.forEachBlock(functor); +} + } // namespace JSC -- cgit v1.2.1