Index: runtime/vm/heap.cc |
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc |
index 0bd0e666937aa0004f9b37d8cb875cfbb7d81cbf..7c80225a362bc512ffa2fd756843a47c3bcefba6 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::IterateObjects(ObjectVisitor* visitor) { |
+ new_space_->VisitObjects(visitor); |
+ old_space_->VisitObjects(visitor); |
+ code_space_->VisitObjects(visitor); |
+} |
+ |
+ |
+void Heap::IteratePointers(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::CreateAllocatedObjectSet() const { |
+ 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()->IterateObjects(&object_visitor); |
+ vm_isolate->heap()->IterateObjects(&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()->CreateAllocatedObjectSet(); |
+ VerifyPointersVisitor visitor(isolate, allocated_set); |
+ isolate->heap()->IteratePointers(&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()->IterateObjects(&object_visitor); |
+ vm_isolate->heap()->IterateObjects(&object_visitor); |
} |