| // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #ifndef RUNTIME_VM_HEAP_VERIFIER_H_ |
| #define RUNTIME_VM_HEAP_VERIFIER_H_ |
| |
| #include "vm/flags.h" |
| #include "vm/globals.h" |
| #include "vm/handle_visitor.h" |
| #include "vm/handles.h" |
| #include "vm/thread.h" |
| #include "vm/visitor.h" |
| |
| namespace dart { |
| |
| // Forward declarations. |
| class IsolateGroup; |
| class ObjectSet; |
| |
| enum MarkExpectation { kForbidMarked, kAllowMarked, kRequireMarked }; |
| |
| class VerifyObjectVisitor : public ObjectVisitor { |
| public: |
| VerifyObjectVisitor(IsolateGroup* isolate_group, |
| ObjectSet* allocated_set, |
| MarkExpectation mark_expectation) |
| : isolate_group_(isolate_group), |
| allocated_set_(allocated_set), |
| mark_expectation_(mark_expectation) {} |
| |
| virtual void VisitObject(ObjectPtr obj); |
| |
| private: |
| IsolateGroup* isolate_group_; |
| ObjectSet* allocated_set_; |
| MarkExpectation mark_expectation_; |
| |
| DISALLOW_COPY_AND_ASSIGN(VerifyObjectVisitor); |
| }; |
| |
| // A sample object pointer visitor implementation which verifies that |
| // the pointers visited are contained in the isolate heap. |
| class VerifyPointersVisitor : public ObjectPointerVisitor { |
| public: |
| explicit VerifyPointersVisitor(IsolateGroup* isolate_group, |
| ObjectSet* allocated_set) |
| : ObjectPointerVisitor(isolate_group), allocated_set_(allocated_set) {} |
| |
| void VisitPointers(ObjectPtr* first, ObjectPtr* last); |
| void VisitCompressedPointers(uword heap_base, |
| CompressedObjectPtr* first, |
| CompressedObjectPtr* last); |
| |
| static void VerifyPointers(MarkExpectation mark_expectation = kForbidMarked); |
| |
| private: |
| ObjectSet* allocated_set_; |
| |
| DISALLOW_COPY_AND_ASSIGN(VerifyPointersVisitor); |
| }; |
| |
| class VerifyWeakPointersVisitor : public HandleVisitor { |
| public: |
| explicit VerifyWeakPointersVisitor(VerifyPointersVisitor* visitor) |
| : HandleVisitor(Thread::Current()), visitor_(visitor) {} |
| |
| virtual void VisitHandle(uword addr); |
| |
| private: |
| ObjectPointerVisitor* visitor_; |
| |
| ObjectSet* allocated_set; |
| |
| DISALLOW_COPY_AND_ASSIGN(VerifyWeakPointersVisitor); |
| }; |
| |
| #if defined(DEBUG) |
| class VerifyCanonicalVisitor : public ObjectVisitor { |
| public: |
| explicit VerifyCanonicalVisitor(Thread* thread); |
| virtual void VisitObject(ObjectPtr obj); |
| |
| private: |
| Thread* thread_; |
| Instance& instanceHandle_; |
| |
| DISALLOW_COPY_AND_ASSIGN(VerifyCanonicalVisitor); |
| }; |
| #endif // defined(DEBUG) |
| |
| } // namespace dart |
| |
| #endif // RUNTIME_VM_HEAP_VERIFIER_H_ |