| Index: runtime/vm/scavenger.cc
|
| ===================================================================
|
| --- runtime/vm/scavenger.cc (revision 24817)
|
| +++ runtime/vm/scavenger.cc (working copy)
|
| @@ -16,6 +16,7 @@
|
| #include "vm/store_buffer.h"
|
| #include "vm/verifier.h"
|
| #include "vm/visitor.h"
|
| +#include "vm/weak_table.h"
|
|
|
| namespace dart {
|
|
|
| @@ -556,20 +557,35 @@
|
| }
|
|
|
|
|
| -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);
|
| +void Scavenger::ProcessWeakTables() {
|
| + for (int sel = 0;
|
| + sel < Heap::kNumWeakSelectors;
|
| + sel++) {
|
| + WeakTable* table = heap_->GetWeakTable(
|
| + Heap::kNew, static_cast<Heap::WeakSelector>(sel));
|
| + heap_->SetWeakTable(Heap::kNew,
|
| + static_cast<Heap::WeakSelector>(sel),
|
| + WeakTable::NewFrom(table));
|
| + intptr_t size = table->size();
|
| + 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));
|
| + }
|
| + }
|
| }
|
| + // Remove the old table as it has been replaced with the newly allocated
|
| + // table above.
|
| + delete table;
|
| }
|
| }
|
|
|
| @@ -625,7 +641,7 @@
|
| ScavengerWeakVisitor weak_visitor(this);
|
| IterateWeakRoots(isolate, &weak_visitor, invoke_api_callbacks);
|
| visitor.Finalize();
|
| - ProcessPeerReferents();
|
| + ProcessWeakTables();
|
| int64_t end = OS::GetCurrentTimeMicros();
|
| heap_->RecordTime(kProcessToSpace, middle - start);
|
| heap_->RecordTime(kIterateWeaks, end - middle);
|
| @@ -649,23 +665,4 @@
|
| }
|
|
|
|
|
| -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
|
|
|