| Index: Source/platform/heap/Heap.cpp
|
| diff --git a/Source/platform/heap/Heap.cpp b/Source/platform/heap/Heap.cpp
|
| index d0471e8e65a72f20f77f826261b864025b3970de..48bf7051a7483c3ac17a5ce5ea83858c03f4602f 100644
|
| --- a/Source/platform/heap/Heap.cpp
|
| +++ b/Source/platform/heap/Heap.cpp
|
| @@ -456,18 +456,10 @@ private:
|
| bool m_parkedAllThreads; // False if we fail to park all threads
|
| };
|
|
|
| -NO_SANITIZE_ADDRESS inline
|
| -bool HeapObjectHeader::isMarked() const
|
| -{
|
| - checkHeader();
|
| - return m_size & markBitMask;
|
| -}
|
| -
|
| -NO_SANITIZE_ADDRESS inline
|
| -void HeapObjectHeader::unmark()
|
| +inline bool HeapObjectHeader::isMarked() const
|
| {
|
| checkHeader();
|
| - m_size &= ~markBitMask;
|
| + return pageHeaderFromObject(this)->objectIsMarked(reinterpret_cast<Address>(const_cast<HeapObjectHeader*>(this)));
|
| }
|
|
|
| NO_SANITIZE_ADDRESS inline
|
| @@ -539,12 +531,6 @@ void FinalizedHeapObjectHeader::finalize()
|
| }
|
|
|
| template<typename Header>
|
| -void LargeHeapObject<Header>::unmark()
|
| -{
|
| - return heapObjectHeader()->unmark();
|
| -}
|
| -
|
| -template<typename Header>
|
| bool LargeHeapObject<Header>::isMarked()
|
| {
|
| return heapObjectHeader()->isMarked();
|
| @@ -1172,6 +1158,7 @@ OrphanedPagePool::~OrphanedPagePool()
|
|
|
| void OrphanedPagePool::addOrphanedPage(int index, BaseHeapPage* page)
|
| {
|
| + page->clearObjectMarkBitMap();
|
| page->markOrphaned();
|
| PoolEntry* entry = new PoolEntry(page, m_pool[index]);
|
| m_pool[index] = entry;
|
| @@ -1414,7 +1401,6 @@ void ThreadHeap<Header>::sweepLargePages()
|
| for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current;) {
|
| if (current->isMarked()) {
|
| Heap::increaseMarkedObjectSize(current->size());
|
| - current->unmark();
|
| previousNext = ¤t->m_next;
|
| current = current->next();
|
| } else {
|
| @@ -1496,20 +1482,31 @@ void ThreadHeap<Header>::makeConsistentForSweeping()
|
| }
|
|
|
| template<typename Header>
|
| -void ThreadHeap<Header>::clearLiveAndMarkDead()
|
| +void ThreadHeap<Header>::makeUnmarkedObjectsDead()
|
| {
|
| ASSERT(isConsistentForSweeping());
|
| - for (HeapPage<Header>* page = m_firstPage; page; page = page->next())
|
| - page->clearLiveAndMarkDead();
|
| + for (HeapPage<Header>* page = m_firstPage; page; page = page->next()) {
|
| + page->makeUnmarkedObjectsDead();
|
| + }
|
| for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current; current = current->next()) {
|
| - if (current->isMarked())
|
| - current->unmark();
|
| - else
|
| + if (!current->isMarked())
|
| current->setDeadMark();
|
| }
|
| }
|
|
|
| template<typename Header>
|
| +void ThreadHeap<Header>::clearObjectMarkBitMaps()
|
| +{
|
| + ASSERT(isConsistentForSweeping());
|
| + for (HeapPage<Header>* page = m_firstPage; page; page = page->next()) {
|
| + page->clearObjectMarkBitMap();
|
| + }
|
| + for (LargeHeapObject<Header>* current = m_firstLargeHeapObject; current; current = current->next()) {
|
| + current->clearObjectMarkBitMap();
|
| + }
|
| +}
|
| +
|
| +template<typename Header>
|
| void ThreadHeap<Header>::clearFreeLists()
|
| {
|
| m_promptlyFreedCount = 0;
|
| @@ -1549,6 +1546,12 @@ HeapPage<Header>::HeapPage(PageMemory* storage, ThreadHeap<Header>* heap, const
|
| }
|
|
|
| template<typename Header>
|
| +void HeapPage<Header>::clearObjectMarkBitMap()
|
| +{
|
| + memset(&m_objectMarkBitMap, 0, reservedForObjectMarkBitMap);
|
| +}
|
| +
|
| +template<typename Header>
|
| void HeapPage<Header>::link(HeapPage** prevNext)
|
| {
|
| m_next = *prevNext;
|
| @@ -1634,7 +1637,6 @@ void HeapPage<Header>::sweep(ThreadHeap<Header>* heap)
|
|
|
| if (startOfGap != headerAddress)
|
| heap->addToFreeList(startOfGap, headerAddress - startOfGap);
|
| - header->unmark();
|
| headerAddress += header->size();
|
| Heap::increaseMarkedObjectSize(header->size());
|
| startOfGap = headerAddress;
|
| @@ -1644,7 +1646,7 @@ void HeapPage<Header>::sweep(ThreadHeap<Header>* heap)
|
| }
|
|
|
| template<typename Header>
|
| -void HeapPage<Header>::clearLiveAndMarkDead()
|
| +void HeapPage<Header>::makeUnmarkedObjectsDead()
|
| {
|
| for (Address headerAddress = payload(); headerAddress < end();) {
|
| Header* header = reinterpret_cast<Header*>(headerAddress);
|
| @@ -1655,9 +1657,7 @@ void HeapPage<Header>::clearLiveAndMarkDead()
|
| headerAddress += header->size();
|
| continue;
|
| }
|
| - if (header->isMarked())
|
| - header->unmark();
|
| - else
|
| + if (!header->isMarked())
|
| header->setDeadMark();
|
| headerAddress += header->size();
|
| }
|
|
|