| 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()));
|
| + }
|
| }
|
| }
|
|
|
|
|