Index: runtime/vm/scavenger.cc |
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc |
index 81aae4d8736f84445e522a85eb336dc2935d9f92..460aabe35d8c59766e283e2fa308d9d372f8d795 100644 |
--- a/runtime/vm/scavenger.cc |
+++ b/runtime/vm/scavenger.cc |
@@ -403,6 +403,17 @@ void Scavenger::IterateStoreBuffers(Isolate* isolate, |
} |
+void Scavenger::IterateObjectIdTable(Isolate* isolate, |
+ ScavengerVisitor* visitor) { |
+ 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; |
+ } |
+ visitor->VisitPointers(&table[0], &table[table_size]); |
+} |
+ |
+ |
void Scavenger::IterateRoots(Isolate* isolate, |
ScavengerVisitor* visitor, |
bool visit_prologue_weak_persistent_handles) { |
@@ -412,6 +423,7 @@ void Scavenger::IterateRoots(Isolate* isolate, |
StackFrameIterator::kDontValidateFrames); |
int64_t middle = OS::GetCurrentTimeMicros(); |
IterateStoreBuffers(isolate, visitor); |
+ IterateObjectIdTable(isolate, visitor); |
int64_t end = OS::GetCurrentTimeMicros(); |
heap_->RecordTime(kVisitIsolateRoots, middle - start); |
heap_->RecordTime(kIterateStoreBuffers, end - middle); |
@@ -574,6 +586,31 @@ void Scavenger::ProcessPeerReferents() { |
} |
+void Scavenger::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->IsOldObject()) { |
+ // SKip old objects. |
+ continue; |
+ } |
+ uword raw_addr = RawObject::ToAddr(raw_obj); |
+ uword header = *reinterpret_cast<uword*>(raw_addr); |
+ if (IsForwarding(header)) { |
+ // The object has survived. Update its address in the table. |
+ uword new_addr = ForwardedAddr(header); |
+ raw_obj = RawObject::FromAddr(new_addr); |
+ table[i] = raw_obj; |
+ } |
+ } |
+} |
+ |
+ |
void Scavenger::VisitObjectPointers(ObjectPointerVisitor* visitor) const { |
uword cur = FirstObjectStart(); |
while (cur < top_) { |
@@ -626,6 +663,7 @@ void Scavenger::Scavenge(bool invoke_api_callbacks) { |
IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks); |
visitor.Finalize(); |
ProcessPeerReferents(); |
+ ProcessObjectIdTable(); |
int64_t end = OS::GetCurrentTimeMicros(); |
heap_->RecordTime(kProcessToSpace, middle - start); |
heap_->RecordTime(kIterateWeaks, end - middle); |