Index: src/heap/objects-visiting-inl.h |
diff --git a/src/heap/objects-visiting-inl.h b/src/heap/objects-visiting-inl.h |
index 29a5afc320a370d4e9ee2802865353eb8054fe80..55734fd463a4e538baa0ad353167f2091bb148de 100644 |
--- a/src/heap/objects-visiting-inl.h |
+++ b/src/heap/objects-visiting-inl.h |
@@ -354,9 +354,21 @@ void StaticMarkingVisitor<StaticVisitor>::VisitWeakCell(Map* map, |
// We can ignore weak cells with cleared values because they will always |
// contain smi zero. |
if (weak_cell->next_cleared() && !weak_cell->cleared()) { |
- weak_cell->set_next(heap->encountered_weak_cells(), |
- UPDATE_WEAK_WRITE_BARRIER); |
- heap->set_encountered_weak_cells(weak_cell); |
+ HeapObject* value = HeapObject::cast(weak_cell->value()); |
+ if (MarkCompactCollector::IsMarked(value)) { |
+ // Weak cells with live values are directly processed here to reduce |
+ // the processing time of weak cells during the main GC pause. |
+ Object** slot = HeapObject::RawField(weak_cell, WeakCell::kValueOffset); |
+ map->GetHeap()->mark_compact_collector()->RecordSlot(weak_cell, slot, |
+ *slot); |
+ } else { |
+ // If we do not know about liveness of values of weak cells, we have to |
+ // process them when we know the liveness of the whole transitive |
+ // closure. |
+ weak_cell->set_next(heap->encountered_weak_cells(), |
+ UPDATE_WEAK_WRITE_BARRIER); |
+ heap->set_encountered_weak_cells(weak_cell); |
+ } |
} |
} |