// 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_VISITOR_H_ #define RUNTIME_VM_VISITOR_H_ #include "vm/allocation.h" #include "vm/class_table.h" #include "vm/globals.h" #include "vm/growable_array.h" namespace dart { // Forward declarations. class Isolate; class IsolateGroup; // An object pointer visitor interface. class ObjectPointerVisitor { public: explicit ObjectPointerVisitor(IsolateGroup* isolate_group); virtual ~ObjectPointerVisitor() {} IsolateGroup* isolate_group() const { return isolate_group_; } // Visit pointers inside the given typed data [view]. // // Range of pointers to visit 'first' <= pointer <= 'last'. virtual void VisitTypedDataViewPointers(TypedDataViewPtr view, CompressedObjectPtr* first, CompressedObjectPtr* last) { VisitCompressedPointers(view->heap_base(), first, last); } // Range of pointers to visit 'first' <= pointer <= 'last'. virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) = 0; #if defined(DART_COMPRESSED_POINTERS) virtual void VisitCompressedPointers(uword heap_base, CompressedObjectPtr* first, CompressedObjectPtr* last) = 0; #else void VisitCompressedPointers(uword heap_base, CompressedObjectPtr* first, CompressedObjectPtr* last) { VisitPointers(first, last); } #endif // len argument is the number of pointers to visit starting from 'p'. void VisitPointers(ObjectPtr* p, intptr_t len) { VisitPointers(p, (p + len - 1)); } void VisitPointer(ObjectPtr* p) { VisitPointers(p, p); } const char* gc_root_type() const { return gc_root_type_; } void set_gc_root_type(const char* gc_root_type) { gc_root_type_ = gc_root_type; } void clear_gc_root_type() { gc_root_type_ = "unknown"; } virtual bool visit_weak_persistent_handles() const { return false; } // When visiting objects to build retaining paths, trace field values // through fields. // Otherwise trace field values through isolate's field_table. virtual bool trace_values_through_fields() const { return false; } const ClassTable* class_table() const { return class_table_; } // Returns true if pointers of the given SuspendState object can be visited. // Compactor overrides this method in order to postpone visiting SuspendState // objects with evacuated frames, as visiting them may touch other Dart // objects (array of InstructionsTables) which have inconsistent state // until compaction is finished. virtual bool CanVisitSuspendStatePointers(SuspendStatePtr suspend_state) { return true; } private: IsolateGroup* isolate_group_; const char* gc_root_type_; ClassTable* class_table_; DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectPointerVisitor); }; class PredicateObjectPointerVisitor { public: PredicateObjectPointerVisitor() {} virtual ~PredicateObjectPointerVisitor() {} virtual bool PredicateVisitPointers(ObjectPtr* first, ObjectPtr* last) = 0; #if defined(DART_COMPRESSED_POINTERS) virtual bool PredicateVisitCompressedPointers(uword heap_base, CompressedObjectPtr* first, CompressedObjectPtr* last) = 0; #else bool PredicateVisitCompressedPointers(uword heap_base, CompressedObjectPtr* first, CompressedObjectPtr* last) { return PredicateVisitPointers(first, last); } #endif }; // An object visitor interface. class ObjectVisitor { public: ObjectVisitor() {} virtual ~ObjectVisitor() {} // Invoked for each object. virtual void VisitObject(ObjectPtr obj) = 0; private: DISALLOW_COPY_AND_ASSIGN(ObjectVisitor); }; } // namespace dart #endif // RUNTIME_VM_VISITOR_H_