Chromium Code Reviews| Index: src/heap/mark-compact.cc |
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
| index ed10bf906cd77a73873b605221d2f42476db6433..5a1fdfaa09d96244e3c22f235c0d5ccbf9ff39c1 100644 |
| --- a/src/heap/mark-compact.cc |
| +++ b/src/heap/mark-compact.cc |
| @@ -298,8 +298,12 @@ void MarkCompactCollector::CollectGarbage() { |
| if (FLAG_collect_maps) ClearNonLiveReferences(); |
| + ProcessAndClearWeakCells(); |
| + |
| ClearWeakCollections(); |
| + heap_->set_encountered_weak_cells(heap_->undefined_value()); |
| + |
| #ifdef VERIFY_HEAP |
| if (FLAG_verify_heap) { |
| VerifyMarking(heap_); |
| @@ -822,6 +826,7 @@ void MarkCompactCollector::Prepare() { |
| heap()->incremental_marking()->Abort(); |
| ClearMarkbits(); |
| AbortWeakCollections(); |
| + AbortWeakCells(); |
| AbortCompaction(); |
| was_marked_incrementally_ = false; |
| } |
| @@ -2727,6 +2732,37 @@ void MarkCompactCollector::AbortWeakCollections() { |
| } |
| +void MarkCompactCollector::ProcessAndClearWeakCells() { |
| + HeapObject* undefined = heap()->undefined_value(); |
| + Object* weak_cell_obj = heap()->encountered_weak_cells(); |
| + while (weak_cell_obj != undefined) { |
| + WeakCell* weak_cell = reinterpret_cast<WeakCell*>(weak_cell_obj); |
| + HeapObject* value = weak_cell->value(); |
| + if (!MarkCompactCollector::IsMarked(value)) { |
| + weak_cell->update_value_from_gc(undefined); |
| + } else { |
| + Object** slot = HeapObject::RawField(weak_cell, WeakCell::kValueOffset); |
| + heap()->mark_compact_collector()->RecordSlot(slot, slot, value); |
| + } |
| + weak_cell_obj = weak_cell->next(); |
| + weak_cell->set_next(undefined); |
|
Erik Corry
2014/10/13 15:56:17
No write barrier needed.
ulan
2014/10/14 10:17:22
Done.
|
| + } |
| + heap()->set_encountered_weak_cells(undefined); |
| +} |
| + |
| + |
| +void MarkCompactCollector::AbortWeakCells() { |
| + Object* undefined = heap()->undefined_value(); |
| + Object* weak_cell_obj = heap()->encountered_weak_cells(); |
| + while (weak_cell_obj != undefined) { |
| + WeakCell* weak_cell = reinterpret_cast<WeakCell*>(weak_cell_obj); |
| + weak_cell_obj = weak_cell->next(); |
| + weak_cell->set_next(undefined); |
|
Erik Corry
2014/10/13 15:56:17
No write barrier needed
ulan
2014/10/14 10:17:22
Done.
|
| + } |
| + heap()->set_encountered_weak_cells(undefined); |
| +} |
| + |
| + |
| void MarkCompactCollector::RecordMigratedSlot(Object* value, Address slot) { |
| if (heap_->InNewSpace(value)) { |
| heap_->store_buffer()->Mark(slot); |