dart-sdk/runtime/vm/visitor.h
Ryan Macnak 5918b3a4ee [vm, gc] Don't double-visit remembered cards to decide if they should remain remembered.
TEST=ci
Change-Id: Ib92dbbabf90f80c6e984c21b9eaee67fd4205f8f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/365543
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Aprelev <aam@google.com>
2024-05-07 17:04:29 +00:00

125 lines
4 KiB
C++

// 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_