blob: 9e8780b8c1951016abe06a33871b7d43c04d4811 [file] [log] [blame]
// 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_