| // Copyright (c) 2026, 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. |
| |
| #include "vm/roots.h" |
| |
| #include "vm/dart_api_state.h" |
| #include "vm/dart_entry.h" |
| #include "vm/handles.h" |
| #include "vm/object.h" |
| #include "vm/visitor.h" |
| |
| namespace dart { |
| |
| void Roots::InitVTables() { |
| #define DECL(type, name) name().initRO(name().ptr()); |
| HANDLE_ROOTS_LIST(DECL) |
| #undef DECL |
| for (intptr_t i = 0; i < kNumPredefinedSymbols + 256; i++) { |
| symbol_handle(i).initRO(symbol_handle(i).ptr()); |
| } |
| for (intptr_t i = 0; i < kNumStubEntries; i++) { |
| stub_handle(i).initRO(stub_handle(i).ptr()); |
| } |
| } |
| |
| void Roots::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
| COMPILE_ASSERT(ARRAY_SIZE(raw_.cached_args_descriptors_) == |
| ArgumentsDescriptor::kCachedDescriptorCount); |
| COMPILE_ASSERT(ARRAY_SIZE(raw_.cached_icdata_arrays_) == |
| ICData::kCachedICDataArrayCount); |
| COMPILE_ASSERT(sizeof(Roots::ApiHandle) == sizeof(LocalHandle)); |
| COMPILE_ASSERT(sizeof(Roots::VMHandle) == kVMHandleSizeInWords * kWordSize); |
| |
| visitor->set_gc_root_type("bootstrap roots"); |
| |
| visitor->VisitPointers(from(), to()); |
| visitor->VisitPointers(fromah(), toah()); |
| |
| VMHandle* fromh = this->fromh(); |
| VMHandle* toh = this->toh(); |
| for (VMHandle* h = fromh; h <= toh; h++) { |
| visitor->VisitPointer(&(h->ptr)); |
| } |
| |
| visitor->clear_gc_root_type(); |
| } |
| |
| } // namespace dart |