| // 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 VM_VISITOR_H_ | 
 | #define VM_VISITOR_H_ | 
 |  | 
 | #include "vm/allocation.h" | 
 | #include "vm/globals.h" | 
 | #include "vm/growable_array.h" | 
 |  | 
 | namespace dart { | 
 |  | 
 | // Forward declarations. | 
 | class Isolate; | 
 | class RawObject; | 
 |  | 
 | // An object pointer visitor interface. | 
 | class ObjectPointerVisitor { | 
 |  public: | 
 |   explicit ObjectPointerVisitor(Isolate* isolate) : isolate_(isolate) {} | 
 |   virtual ~ObjectPointerVisitor() {} | 
 |  | 
 |   Isolate* isolate() const { return isolate_; } | 
 |  | 
 |   // Range of pointers to visit 'first' <= pointer <= 'last'. | 
 |   virtual void VisitPointers(RawObject** first, RawObject** last) = 0; | 
 |  | 
 |   virtual bool visit_function_code() const { return true; } | 
 |   virtual void add_skipped_code_function(RawFunction* funct) { | 
 |     UNREACHABLE(); | 
 |   } | 
 |   // len argument is the number of pointers to visit starting from 'p'. | 
 |   void VisitPointers(RawObject** p, intptr_t len) { | 
 |     VisitPointers(p, (p + len - 1)); | 
 |   } | 
 |  | 
 |   void VisitPointer(RawObject** p) { VisitPointers(p , p); } | 
 |  | 
 |  private: | 
 |   Isolate* isolate_; | 
 |   NoSafepointScope no_safepoints_; | 
 |  | 
 |   DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectPointerVisitor); | 
 | }; | 
 |  | 
 |  | 
 | // An object visitor interface. | 
 | class ObjectVisitor { | 
 |  public: | 
 |   explicit ObjectVisitor(Isolate* isolate) : isolate_(isolate) {} | 
 |  | 
 |   virtual ~ObjectVisitor() {} | 
 |  | 
 |   Isolate* isolate() const { return isolate_; } | 
 |  | 
 |   // Invoked for each object. | 
 |   virtual void VisitObject(RawObject* obj) = 0; | 
 |  | 
 |  private: | 
 |   Isolate* isolate_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(ObjectVisitor); | 
 | }; | 
 |  | 
 |  | 
 | // An object finder visitor interface. | 
 | class FindObjectVisitor { | 
 |  public: | 
 |   explicit FindObjectVisitor(Isolate* isolate) : isolate_(isolate) {} | 
 |   virtual ~FindObjectVisitor() {} | 
 |  | 
 |   // Allow to specify a address filter. | 
 |   virtual uword filter_addr() const { return 0; } | 
 |   bool VisitRange(uword begin_addr, uword end_addr) const { | 
 |     uword addr = filter_addr(); | 
 |     return (addr == 0) || ((begin_addr <= addr) && (addr < end_addr)); | 
 |   } | 
 |  | 
 |   // Check if object matches find condition. | 
 |   virtual bool FindObject(RawObject* obj) const = 0; | 
 |  | 
 |  private: | 
 |   Isolate* isolate_; | 
 |  | 
 |   DISALLOW_IMPLICIT_CONSTRUCTORS(FindObjectVisitor); | 
 | }; | 
 |  | 
 | }  // namespace dart | 
 |  | 
 | #endif  // VM_VISITOR_H_ |