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