| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index 400e1e49d66b61f6933efc356fa081df074220e6..42307cd84cf5b2789e136fac80fef789f837d45b 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -2140,23 +2140,32 @@ void MarkCompactCollector::ProcessEphemeralMarking(
|
| DCHECK(marking_deque()->IsEmpty() && !marking_deque()->overflowed());
|
| bool work_to_do = true;
|
| while (work_to_do) {
|
| - if (heap_->UsingEmbedderHeapTracer()) {
|
| - TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_MARK_WRAPPER_TRACING);
|
| - heap_->RegisterWrappersWithEmbedderHeapTracer();
|
| - heap_->embedder_heap_tracer()->AdvanceTracing(
|
| - 0, EmbedderHeapTracer::AdvanceTracingActions(
|
| - EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION));
|
| - }
|
| if (!only_process_harmony_weak_collections) {
|
| - TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_MARK_OBJECT_GROUPING);
|
| - isolate()->global_handles()->IterateObjectGroups(
|
| - visitor, &IsUnmarkedHeapObjectWithHeap);
|
| - MarkImplicitRefGroups(&MarkCompactMarkingVisitor::MarkObject);
|
| + if (heap_->UsingEmbedderHeapTracer()) {
|
| + TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_MARK_WRAPPER_TRACING);
|
| + heap_->RegisterWrappersWithEmbedderHeapTracer();
|
| + heap_->embedder_heap_tracer()->AdvanceTracing(
|
| + 0,
|
| + EmbedderHeapTracer::AdvanceTracingActions(
|
| + EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION));
|
| + } else {
|
| + TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_MARK_OBJECT_GROUPING);
|
| + isolate()->global_handles()->IterateObjectGroups(
|
| + visitor, &IsUnmarkedHeapObjectWithHeap);
|
| + MarkImplicitRefGroups(&MarkCompactMarkingVisitor::MarkObject);
|
| + }
|
| + } else {
|
| + // TODO(mlippautz): We currently do not trace through blink when
|
| + // discovering new objects reachable from weak roots (that have been made
|
| + // strong). This is a limitation of not having a separate handle type
|
| + // that doesn't require zapping before this phase. See crbug.com/668060.
|
| + heap_->clear_wrappers_to_trace();
|
| }
|
| ProcessWeakCollections();
|
| work_to_do = !marking_deque()->IsEmpty();
|
| ProcessMarkingDeque<MarkCompactMode::FULL>();
|
| }
|
| + CHECK(heap_->MarkingDequesAreEmpty());
|
| }
|
|
|
| void MarkCompactCollector::ProcessTopOptimizedFrame(ObjectVisitor* visitor) {
|
|
|