| Index: runtime/vm/scavenger.cc
|
| ===================================================================
|
| --- runtime/vm/scavenger.cc (revision 24564)
|
| +++ runtime/vm/scavenger.cc (working copy)
|
| @@ -16,7 +16,6 @@
|
| #include "vm/store_buffer.h"
|
| #include "vm/verifier.h"
|
| #include "vm/visitor.h"
|
| -#include "vm/weak_table.h"
|
|
|
| namespace dart {
|
|
|
| @@ -557,31 +556,19 @@
|
| }
|
|
|
|
|
| -void Scavenger::ProcessWeakTables() {
|
| - for (int sel = 0;
|
| - sel < Heap::kNumWeakSelectors;
|
| - sel++) {
|
| - WeakTable* table = heap_->GetWeakTable(
|
| - Heap::kNew, static_cast<Heap::WeakSelector>(sel));
|
| - intptr_t size = table->size();
|
| - heap_->SetWeakTable(Heap::kNew,
|
| - static_cast<Heap::WeakSelector>(sel),
|
| - WeakTable::NewFrom(table));
|
| - for (intptr_t i = 0; i < size; i++) {
|
| - if (table->IsValidEntryAt(i)) {
|
| - RawObject* raw_obj = table->ObjectAt(i);
|
| - ASSERT(raw_obj->IsHeapObject());
|
| - uword raw_addr = RawObject::ToAddr(raw_obj);
|
| - uword header = *reinterpret_cast<uword*>(raw_addr);
|
| - if (IsForwarding(header)) {
|
| - // The object has survived. Preserve its record.
|
| - uword new_addr = ForwardedAddr(header);
|
| - raw_obj = RawObject::FromAddr(new_addr);
|
| - heap_->SetWeakEntry(raw_obj,
|
| - static_cast<Heap::WeakSelector>(sel),
|
| - table->ValueAt(i));
|
| - }
|
| - }
|
| +void Scavenger::ProcessPeerReferents() {
|
| + PeerTable prev;
|
| + std::swap(prev, peer_table_);
|
| + for (PeerTable::iterator it = prev.begin(); it != prev.end(); ++it) {
|
| + RawObject* raw_obj = it->first;
|
| + ASSERT(raw_obj->IsHeapObject());
|
| + uword raw_addr = RawObject::ToAddr(raw_obj);
|
| + uword header = *reinterpret_cast<uword*>(raw_addr);
|
| + if (IsForwarding(header)) {
|
| + // The object has survived. Preserve its record.
|
| + uword new_addr = ForwardedAddr(header);
|
| + raw_obj = RawObject::FromAddr(new_addr);
|
| + heap_->SetPeer(raw_obj, it->second);
|
| }
|
| }
|
| }
|
| @@ -638,7 +625,7 @@
|
| ScavengerWeakVisitor weak_visitor(this);
|
| IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks);
|
| visitor.Finalize();
|
| - ProcessWeakTables();
|
| + ProcessPeerReferents();
|
| int64_t end = OS::GetCurrentTimeMicros();
|
| heap_->RecordTime(kProcessToSpace, middle - start);
|
| heap_->RecordTime(kIterateWeaks, end - middle);
|
| @@ -662,4 +649,23 @@
|
| }
|
|
|
|
|
| +void Scavenger::SetPeer(RawObject* raw_obj, void* peer) {
|
| + if (peer == NULL) {
|
| + peer_table_.erase(raw_obj);
|
| + } else {
|
| + peer_table_[raw_obj] = peer;
|
| + }
|
| +}
|
| +
|
| +
|
| +void* Scavenger::GetPeer(RawObject* raw_obj) {
|
| + PeerTable::iterator it = peer_table_.find(raw_obj);
|
| + return (it == peer_table_.end()) ? NULL : it->second;
|
| +}
|
| +
|
| +
|
| +int64_t Scavenger::PeerCount() const {
|
| + return static_cast<int64_t>(peer_table_.size());
|
| +}
|
| +
|
| } // namespace dart
|
|
|