Chromium Code Reviews| Index: runtime/vm/gc_marker.cc |
| =================================================================== |
| --- runtime/vm/gc_marker.cc (revision 24504) |
| +++ runtime/vm/gc_marker.cc (working copy) |
| @@ -379,18 +379,20 @@ |
| } |
| -void GCMarker::ProcessPeerReferents(PageSpace* page_space) { |
| - PageSpace::PeerTable* peer_table = page_space->GetPeerTable(); |
| - PageSpace::PeerTable::iterator it = peer_table->begin(); |
| - while (it != peer_table->end()) { |
| - RawObject* raw_obj = it->first; |
| - ASSERT(raw_obj->IsHeapObject()); |
| - if (raw_obj->IsMarked()) { |
| - // The object has survived. Do nothing. |
| - ++it; |
| - } else { |
| - // The object has become garbage. Remove its record. |
| - peer_table->erase(it++); |
| +void GCMarker::ProcessWeakTables(PageSpace* page_space) { |
| + for (Heap::WeakSelector sel = static_cast<Heap::WeakSelector>(0); |
| + sel < Heap::kNumWeakSelectors; |
| + sel++) { |
| + WeakTable* table = heap_->GetWeakTable(Heap::kOld, sel); |
| + intptr_t size = table->size(); |
| + for (intptr_t i = 0; i < size; i++) { |
| + if (table->IsValidEntryAt(i)) { |
| + RawObject* raw_obj = table->ObjectAt(i); |
| + ASSERT(raw_obj->IsHeapObject()); |
| + if (!raw_obj->IsMarked()) { |
|
siva
2013/06/27 22:11:33
how does this work for deleted entries (they are c
Ivan Posva
2013/06/27 23:59:12
IsValidEntryAt(i) is "return (data_[ValueIndex(i)]
|
| + table->InvalidateAt(i); |
| + } |
| + } |
| } |
| } |
| } |
| @@ -408,7 +410,7 @@ |
| MarkingWeakVisitor mark_weak; |
| IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); |
| mark.Finalize(); |
| - ProcessPeerReferents(page_space); |
| + ProcessWeakTables(page_space); |
| Epilogue(isolate, invoke_api_callbacks); |
| } |