Index: Source/platform/heap/ThreadState.cpp |
diff --git a/Source/platform/heap/ThreadState.cpp b/Source/platform/heap/ThreadState.cpp |
index d3bc5cf73f62b1ae1a609758caa3d729b47f007e..3bbda6d783a25f32e49b2d8ab12e5066e9477b1c 100644 |
--- a/Source/platform/heap/ThreadState.cpp |
+++ b/Source/platform/heap/ThreadState.cpp |
@@ -1114,6 +1114,10 @@ void ThreadState::performPendingSweep() |
// Perform thread-specific weak processing. |
while (popAndInvokeWeakPointerCallback(Heap::s_markingVisitor)) { } |
} |
+ { |
+ TRACE_EVENT0("blink_gc", "ThreadState::invokePreFinalizers"); |
+ invokePreFinalizers(*Heap::s_markingVisitor); |
haraken
2014/10/06 01:55:27
Just to confirm: The main difference between weak
|
+ } |
leaveNoAllocationScope(); |
// Perform sweeping and finalization. |
@@ -1247,6 +1251,25 @@ ThreadState::AttachedThreadStateSet& ThreadState::attachedThreads() |
return threads; |
} |
+void ThreadState::unregisterPreFinalizerInternal(void* target) |
+{ |
+ if (isSweepInProgress()) |
+ return; |
+ auto it = m_preFinalizers.find(target); |
+ ASSERT(it != m_preFinalizers.end()); |
+ m_preFinalizers.remove(it); |
+} |
+ |
+void ThreadState::invokePreFinalizers(Visitor& visitor) |
+{ |
+ Vector<void*> deadObjects; |
+ for (auto& entry : m_preFinalizers) { |
+ if (entry.value(entry.key, visitor)) |
+ deadObjects.append(entry.key); |
+ } |
+ m_preFinalizers.removeAll(deadObjects); |
+} |
+ |
#if ENABLE(GC_PROFILE_MARKING) |
const GCInfo* ThreadState::findGCInfoFromAllThreads(Address address) |
{ |