Index: runtime/vm/gc_marker.cc |
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc |
index b7ae253b911a5eccc7bdf976d9632b9e8b6e38e3..14225e73bb3a52041884b8448b812a57d8ba8a48 100644 |
--- a/runtime/vm/gc_marker.cc |
+++ b/runtime/vm/gc_marker.cc |
@@ -399,6 +399,23 @@ void GCMarker::ProcessWeakTables(PageSpace* page_space) { |
} |
+void GCMarker::ProcessObjectIdTable() { |
+ RawObject** table = heap_->get_object_id_ring_table(); |
+ const intptr_t table_size = heap_->get_object_id_ring_table_size(); |
+ if ((table == NULL) || (table_size <= 0)) { |
+ return; |
+ } |
+ for (intptr_t i = 0; i < table_size; i++) { |
+ RawObject* raw_obj = table[i]; |
+ ASSERT(raw_obj->IsHeapObject()); |
+ if (!raw_obj->IsMarked()) { |
+ // Object has become garbage. Replace it will null. |
+ table[i] = Object::null(); |
+ } |
+ } |
+} |
+ |
+ |
void GCMarker::MarkObjects(Isolate* isolate, |
PageSpace* page_space, |
bool invoke_api_callbacks) { |
@@ -412,6 +429,9 @@ void GCMarker::MarkObjects(Isolate* isolate, |
IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); |
mark.Finalize(); |
ProcessWeakTables(page_space); |
+ ProcessObjectIdTable(); |
+ |
+ |
Epilogue(isolate, invoke_api_callbacks); |
} |