| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index e537689c4a5ca4ba35530fc8d81a55f3bfd37596..bffbc5c33e886f5be54bc5efa0d536268d03a72f 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,30 @@ 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::TracePossibleWrapper(JSObject* js_object) {
|
| + DCHECK(js_object->WasConstructedFromApiFunction());
|
| + if (js_object->GetInternalFieldCount() >= 2 &&
|
| + js_object->GetInternalField(0) != heap_->undefined_value() &&
|
| + js_object->GetInternalField(1) != heap_->undefined_value()) {
|
| + wrappers_to_trace().push_back(std::pair<void*, void*>(
|
| + reinterpret_cast<void*>(js_object->GetInternalField(0)),
|
| + reinterpret_cast<void*>(js_object->GetInternalField(1))));
|
| + }
|
| +}
|
| +
|
| +void MarkCompactCollector::RegisterExternallyReferencedObject(Object** object) {
|
| + DCHECK(in_use());
|
| + HeapObject* heap_object = HeapObject::cast(*object);
|
| + DCHECK(heap_->Contains(heap_object));
|
| + MarkBit mark_bit = Marking::MarkBitFrom(heap_object);
|
| + MarkObject(heap_object, mark_bit);
|
| +}
|
|
|
| void MarkCompactCollector::MarkLiveObjects() {
|
| TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_MARK);
|
| @@ -2135,6 +2162,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 +2202,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()));
|
| + }
|
| }
|
| }
|
|
|
|
|