Index: runtime/vm/heap.cc |
=================================================================== |
--- runtime/vm/heap.cc (revision 24817) |
+++ runtime/vm/heap.cc (working copy) |
@@ -19,6 +19,7 @@ |
#include "vm/stack_frame.h" |
#include "vm/verifier.h" |
#include "vm/virtual_memory.h" |
+#include "vm/weak_table.h" |
namespace dart { |
@@ -35,7 +36,13 @@ |
"old gen heap size in MB," |
"e.g: --old_gen_heap_size=1024 allocates a 1024MB old gen heap"); |
-Heap::Heap() : read_only_(false), gc_in_progress_(false) { |
+ Heap::Heap() : read_only_(false), gc_in_progress_(false) { |
+ for (int sel = 0; |
+ sel < kNumWeakSelectors; |
+ sel++) { |
+ new_weak_tables_[sel] = new WeakTable(); |
+ old_weak_tables_[sel] = new WeakTable(); |
+ } |
new_space_ = new Scavenger(this, |
(FLAG_new_gen_heap_size * MB), |
kNewObjectAlignmentOffset); |
@@ -47,6 +54,12 @@ |
Heap::~Heap() { |
delete new_space_; |
delete old_space_; |
+ for (int sel = 0; |
+ sel < kNumWeakSelectors; |
+ sel++) { |
+ delete new_weak_tables_[sel]; |
+ delete old_weak_tables_[sel]; |
+ } |
} |
@@ -360,27 +373,33 @@ |
} |
-void Heap::SetPeer(RawObject* raw_obj, void* peer) { |
- if (raw_obj->IsNewObject()) { |
- new_space_->SetPeer(raw_obj, peer); |
- } else { |
- ASSERT(raw_obj->IsOldObject()); |
- old_space_->SetPeer(raw_obj, peer); |
- } |
+int64_t Heap::PeerCount() const { |
+ return new_weak_tables_[kPeers]->count() + old_weak_tables_[kPeers]->count(); |
} |
-void* Heap::GetPeer(RawObject* raw_obj) { |
+int64_t Heap::HashCount() const { |
+ return |
+ new_weak_tables_[kHashes]->count() + old_weak_tables_[kHashes]->count(); |
+} |
+ |
+ |
+intptr_t Heap::GetWeakEntry(RawObject* raw_obj, WeakSelector sel) const { |
if (raw_obj->IsNewObject()) { |
- return new_space_->GetPeer(raw_obj); |
+ return new_weak_tables_[sel]->GetValue(raw_obj); |
} |
ASSERT(raw_obj->IsOldObject()); |
- return old_space_->GetPeer(raw_obj); |
+ return old_weak_tables_[sel]->GetValue(raw_obj); |
} |
-int64_t Heap::PeerCount() const { |
- return new_space_->PeerCount() + old_space_->PeerCount(); |
+void Heap::SetWeakEntry(RawObject* raw_obj, WeakSelector sel, intptr_t val) { |
+ if (raw_obj->IsNewObject()) { |
+ new_weak_tables_[sel]->SetValue(raw_obj, val); |
+ } else { |
+ ASSERT(raw_obj->IsOldObject()); |
+ old_weak_tables_[sel]->SetValue(raw_obj, val); |
+ } |
} |