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