Index: runtime/vm/gc_marker.cc |
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc |
index 509f422cd9e89abf188f60e0af4e7504cff9e517..c4a7b1afe3a127e4607af8ca624d7343c4fe0453 100644 |
--- a/runtime/vm/gc_marker.cc |
+++ b/runtime/vm/gc_marker.cc |
@@ -396,6 +396,23 @@ void GCMarker::ProcessPeerReferents(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) { |
@@ -409,6 +426,7 @@ void GCMarker::MarkObjects(Isolate* isolate, |
IterateWeakRoots(isolate, &mark_weak, invoke_api_callbacks); |
mark.Finalize(); |
ProcessPeerReferents(page_space); |
+ ProcessObjectIdTable(); |
Epilogue(isolate, invoke_api_callbacks); |
} |