Chromium Code Reviews| Index: runtime/vm/scavenger.cc |
| =================================================================== |
| --- runtime/vm/scavenger.cc (revision 24504) |
| +++ 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,19 +557,26 @@ |
| } |
| -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 (Heap::WeakSelector sel = static_cast<Heap::WeakSelector>(0); |
| + sel < Heap::kNumWeakSelectors; |
| + sel++) { |
| + WeakTable* table = heap_->GetWeakTable(Heap::kNew, sel); |
| + intptr_t size = table->size(); |
| + heap_->SetWeakTable(Heap::kNew, 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); |
|
siva
2013/06/27 22:11:33
how does this work for deleted entries (they are c
Ivan Posva
2013/06/27 23:59:12
ditto.
|
| + 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, sel, table->ValueAt(i)); |
| + } |
| + } |
| } |
| } |
| } |
| @@ -625,7 +633,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 +657,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 |