Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index e537689c4a5ca4ba35530fc8d81a55f3bfd37596..3a68110fb4f030ff243b44211349aa2673fa70c8 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -59,6 +59,7 @@ MarkCompactCollector::MarkCompactCollector(Heap* heap) |
marking_deque_memory_(NULL), |
marking_deque_memory_committed_(0), |
code_flusher_(nullptr), |
+ embedder_heap_tracer_(nullptr), |
have_code_to_deoptimize_(false), |
compacting_(false), |
sweeping_in_progress_(false), |
@@ -1961,7 +1962,6 @@ void MarkCompactCollector::ProcessMarkingDeque() { |
} |
} |
- |
// Mark all objects reachable (transitively) from objects on the marking |
// stack including references only considered in the atomic marking pause. |
void MarkCompactCollector::ProcessEphemeralMarking( |
@@ -1969,7 +1969,11 @@ void MarkCompactCollector::ProcessEphemeralMarking( |
bool work_to_do = true; |
DCHECK(marking_deque_.IsEmpty() && !marking_deque_.overflowed()); |
while (work_to_do) { |
- if (!only_process_harmony_weak_collections) { |
+ if (UsingEmbedderHeapTracer()) { |
+ embedder_heap_tracer()->TraceWrappableFrom( |
+ reinterpret_cast<v8::Isolate*>(isolate()), wrappers_to_trace_); |
+ wrappers_to_trace_.clear(); |
+ } else if (!only_process_harmony_weak_collections) { |
isolate()->global_handles()->IterateObjectGroups( |
visitor, &IsUnmarkedHeapObjectWithHeap); |
MarkImplicitRefGroups(&MarkCompactMarkingVisitor::MarkObject); |
@@ -1980,7 +1984,6 @@ void MarkCompactCollector::ProcessEphemeralMarking( |
} |
} |
- |
void MarkCompactCollector::ProcessTopOptimizedFrame(ObjectVisitor* visitor) { |
for (StackFrameIterator it(isolate(), isolate()->thread_local_top()); |
!it.done(); it.Advance()) { |
@@ -2079,6 +2082,11 @@ void MarkingDeque::Uninitialize(bool aborting) { |
in_use_ = false; |
} |
+void MarkCompactCollector::SetEmbedderHeapTracer(EmbedderHeapTracer* tracer) { |
+ DCHECK_NOT_NULL(tracer); |
+ CHECK_NULL(embedder_heap_tracer_); |
+ embedder_heap_tracer_ = tracer; |
+} |
void MarkCompactCollector::MarkLiveObjects() { |
TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_MARK); |
@@ -2135,6 +2143,10 @@ void MarkCompactCollector::MarkLiveObjects() { |
{ |
TRACE_GC(heap()->tracer(), |
GCTracer::Scope::MC_MARK_WEAK_CLOSURE_EPHEMERAL); |
+ if (UsingEmbedderHeapTracer()) { |
+ embedder_heap_tracer()->TraceRoots( |
+ reinterpret_cast<v8::Isolate*>(isolate())); |
+ } |
ProcessEphemeralMarking(&root_visitor, false); |
ProcessMarkingDeque(); |
} |
@@ -2171,6 +2183,10 @@ void MarkCompactCollector::MarkLiveObjects() { |
TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_MARK_WEAK_CLOSURE_HARMONY); |
ProcessEphemeralMarking(&root_visitor, true); |
ProcessMarkingDeque(); |
+ if (UsingEmbedderHeapTracer()) { |
+ embedder_heap_tracer()->ClearTracingMarks( |
+ reinterpret_cast<v8::Isolate*>(isolate())); |
+ } |
} |
} |