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); |