Chromium Code Reviews| Index: runtime/vm/heap.cc |
| diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc |
| index 0bd0e666937aa0004f9b37d8cb875cfbb7d81cbf..ddd2b68ace3cce983d8ee9df60bb13ef4a9d4eb6 100644 |
| --- a/runtime/vm/heap.cc |
| +++ b/runtime/vm/heap.cc |
| @@ -11,6 +11,7 @@ |
| #include "vm/heap_profiler.h" |
| #include "vm/isolate.h" |
| #include "vm/object.h" |
| +#include "vm/object_set.h" |
| #include "vm/os.h" |
| #include "vm/pages.h" |
| #include "vm/scavenger.h" |
| @@ -114,6 +115,20 @@ bool Heap::CodeContains(uword addr) const { |
| } |
| +void Heap::VisitObjects(ObjectVisitor* visitor) { |
| + new_space_->VisitObjects(visitor); |
| + old_space_->VisitObjects(visitor); |
| + code_space_->VisitObjects(visitor); |
| +} |
| + |
| + |
| +void Heap::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
| + new_space_->VisitObjectPointers(visitor); |
| + old_space_->VisitObjectPointers(visitor); |
| + code_space_->VisitObjectPointers(visitor); |
| +} |
| + |
| + |
| void Heap::IterateNewPointers(ObjectPointerVisitor* visitor) { |
| new_space_->VisitObjectPointers(visitor); |
| } |
| @@ -218,11 +233,53 @@ void Heap::Init(Isolate* isolate) { |
| } |
| +void Heap::StartEndAddress(uword* start, uword* end) const { |
| + ASSERT(new_space_->capacity() != 0); |
| + new_space_->StartEndAddress(start, end); |
| + if (old_space_->capacity() != 0) { |
| + uword old_start; |
| + uword old_end; |
| + old_space_->StartEndAddress(&old_start, &old_end); |
| + *start = Utils::Minimum(old_start, *start); |
| + *end = Utils::Maximum(old_end, *end); |
| + } |
| + if (code_space_->capacity() != 0) { |
| + uword code_start; |
| + uword code_end; |
| + code_space_->StartEndAddress(&code_start, &code_end); |
| + *start = Utils::Minimum(code_start, *start); |
| + *end = Utils::Maximum(code_end, *end); |
| + } |
| + ASSERT(*start <= *end); |
| +} |
| + |
| + |
| +ObjectSet* Heap::GetAllocatedObjects() const { |
|
Ivan Posva
2012/06/29 22:20:41
GenerateAllocatedObjectSet or similar to indicate
cshapiro
2012/07/10 21:48:17
That is reasonable. Renamed. Done.
|
| + Isolate* isolate = Isolate::Current(); |
| + uword start, end; |
| + isolate->heap()->StartEndAddress(&start, &end); |
| + |
| + Isolate* vm_isolate = Dart::vm_isolate(); |
| + uword vm_start, vm_end; |
| + vm_isolate->heap()->StartEndAddress(&vm_start, &vm_end); |
| + |
| + ObjectSet* allocated_set = new ObjectSet(Utils::Minimum(start, vm_start), |
| + Utils::Maximum(end, vm_end)); |
| + |
| + VerifyObjectVisitor object_visitor(isolate, allocated_set); |
| + isolate->heap()->VisitObjects(&object_visitor); |
| + vm_isolate->heap()->VisitObjects(&object_visitor); |
| + |
| + return allocated_set; |
| +} |
| + |
| + |
| bool Heap::Verify() const { |
| - VerifyPointersVisitor visitor(Isolate::Current()); |
| - new_space_->VisitObjectPointers(&visitor); |
| - old_space_->VisitObjectPointers(&visitor); |
| - code_space_->VisitObjectPointers(&visitor); |
| + Isolate* isolate = Isolate::Current(); |
| + ObjectSet* allocated_set = isolate->heap()->GetAllocatedObjects(); |
| + VerifyPointersVisitor visitor(isolate, allocated_set); |
| + isolate->heap()->VisitObjectPointers(&visitor); |
| + delete allocated_set; |
| // Only returning a value so that Heap::Validate can be called from an ASSERT. |
| return true; |
| } |
| @@ -251,12 +308,9 @@ void Heap::Profile(Dart_HeapProfileWriteCallback callback, void* stream) const { |
| isolate->VisitWeakPersistentHandles(&weak_root_visitor, true); |
| // Dump the current and VM isolate heaps. |
| - HeapProfilerObjectVisitor object_visitor(&profiler); |
| - isolate->heap()->new_space_->VisitObjects(&object_visitor); |
| - isolate->heap()->old_space_->VisitObjects(&object_visitor); |
| - isolate->heap()->code_space_->VisitObjects(&object_visitor); |
| - vm_isolate->heap()->new_space_->VisitObjects(&object_visitor); |
| - vm_isolate->heap()->old_space_->VisitObjects(&object_visitor); |
| + HeapProfilerObjectVisitor object_visitor(isolate, &profiler); |
| + isolate->heap()->VisitObjects(&object_visitor); |
| + vm_isolate->heap()->VisitObjects(&object_visitor); |
| } |