dart-sdk/runtime/vm/visitor.h
Vyacheslav Egorov 4a4eedd860 [vm] Clean up ClassTable
* Merge ClassTable and SharedClassTable back together;
* Simplify handling of multiple arrays growing in sync;
* Refactor how reload deals with ClassTable.

The last change is the most important because it makes it
much easier to reason about the code. We move away from
copying bits and pieces of the class table and shared
class table into reload contexts.

Having two class table fields in the isolate group makes
it easier to reason about. One field contains program
class table (one modified by kernel loader and accessed
by various program structure cid lookups) and heap
walk class table (used by GC visitors). Normally these
two fields point to the same class table, but during
hot reload we temporary split them apart: original
class table is kept as a heap walk class table, while
program class table is replaced by a clone and updated
by reload.

If reload succeeds we drop original class table and
set program class table as heap walk one.

If reload fails we drop the program class table and
restore original one from heap walk table.

TEST=ci

Cq-Include-Trybots: luci.dart.try:vm-kernel-reload-linux-release-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-reload-rollback-linux-release-x64-try,vm-kernel-linux-debug-x64-try,vm-kernel-precomp-tsan-linux-release-x64-try,vm-kernel-tsan-linux-release-x64-try,vm-kernel-precomp-asan-linux-release-x64-try,vm-kernel-asan-linux-release-x64-try
Change-Id: I8b66259fcc474dea7dd2af063e4772df99be06c4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/258361
Commit-Queue: Slava Egorov <vegorov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2022-09-10 15:12:35 +00:00

118 lines
3.6 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;
virtual void VisitCompressedPointers(uword heap_base,
CompressedObjectPtr* first,
CompressedObjectPtr* last) = 0;
// 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);
};
// 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);
};
// An object finder visitor interface.
class FindObjectVisitor {
public:
FindObjectVisitor() {}
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(ObjectPtr obj) const = 0;
private:
DISALLOW_COPY_AND_ASSIGN(FindObjectVisitor);
};
} // namespace dart
#endif // RUNTIME_VM_VISITOR_H_