| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index fa127db6129c0f1598eb2140f3d1fdb294ff4e90..d20377753b47505c014d7d8b2f8caaf0285ecc7c 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -2682,12 +2682,21 @@ void MarkCompactCollector::ProcessAndClearWeakCells() {
|
| WeakCell* weak_cell = reinterpret_cast<WeakCell*>(weak_cell_obj);
|
| // We do not insert cleared weak cells into the list, so the value
|
| // cannot be a Smi here.
|
| - HeapObject* value = HeapObject::cast(weak_cell->value());
|
| - if (!MarkCompactCollector::IsMarked(value)) {
|
| + Object* value = ReadBarrierUntag(
|
| + *HeapObject::RawField(weak_cell,
|
| + WeakCell::kValueOffsetDontForgetTheReadBarrier));
|
| + if (!MarkCompactCollector::IsMarked(HeapObject::cast(weak_cell->value()))) {
|
| weak_cell->clear();
|
| } else {
|
| - Object** slot = HeapObject::RawField(weak_cell, WeakCell::kValueOffset);
|
| - heap()->mark_compact_collector()->RecordSlot(slot, slot, value);
|
| + Object** slot = HeapObject::RawField(
|
| + weak_cell, WeakCell::kValueOffsetDontForgetTheReadBarrier);
|
| + if (value != Smi::FromInt(0)) {
|
| + heap()->mark_compact_collector()->RecordSlot(slot, slot, value);
|
| + // Tag for the next round of GC.
|
| + *HeapObject::RawField(weak_cell,
|
| + WeakCell::kValueOffsetDontForgetTheReadBarrier) =
|
| + ReadBarrierTag(value);
|
| + }
|
| }
|
| weak_cell_obj = weak_cell->next();
|
| weak_cell->set_next(undefined, SKIP_WRITE_BARRIER);
|
|
|