From 2d49ca0204caaee8a6a076d7c0ed2f4d8658b0bc Mon Sep 17 00:00:00 2001 From: Tess Strickland Date: Wed, 17 Apr 2024 18:30:20 +0000 Subject: [PATCH] [vm] Simplify root unit checks in snapshot deserialization. Previously, there were two ways to determine whether a deserialization cluster was being deserialized for the root loading unit or a non-root loading unit: * some deserialization clusters (those deriving from CanonicalSetDeserializationCluster) took a boolean at construction time, and * all deserialization clusters took an additional boolean argument to ReadFill and PostLoad on whether the loading unit was primary (i.e., the root) or not. Since only clusters that deal with canonical values need to worry about whether the deserializing loading unit is the root or not, standardize on the first, where clusters that need to know take the boolean in their constructor and store it in a field, and remove the boolean argument to ReadFill and PostLoad. Have DeserializationCluster::PostLoad just check is_canonical() to determine whether to throw an error if not overridden in the base class, so that any deserialization cluster that may operate on canonical objects needs to explicitly make a choice about whether they need to recanonicalize or not. This check only happens in the precompiled runtime, as otherwise there are no non-root loading units. In particular, this fixes an issue where symbols (canonical strings) in non-root loading units weren't marked as canonical, even though they do not need recanonicalization (since symbol tables are per-isolate group, and thus per-loading unit). TEST=ci (refactoring, test of symbol fix coming in followup CL) Cq-Include-Trybots: luci.dart.try:vm-aot-dwarf-linux-product-x64-try,vm-aot-linux-release-x64-try,vm-aot-linux-debug-x64-try,vm-aot-mac-release-arm64-try,vm-aot-mac-product-arm64-try Change-Id: I411a254767653da82631abc1fcc687ae4259e0b4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/363321 Commit-Queue: Tess Strickland Reviewed-by: Ryan Macnak --- runtime/vm/app_snapshot.cc | 449 ++++++++++++++++++++----------------- 1 file changed, 240 insertions(+), 209 deletions(-) diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc index c98c358d205..be5d10d224c 100644 --- a/runtime/vm/app_snapshot.cc +++ b/runtime/vm/app_snapshot.cc @@ -231,16 +231,19 @@ class DeserializationCluster : public ZoneAllocated { virtual void ReadAlloc(Deserializer* deserializer) = 0; // Initialize the cluster's objects. Do not touch the memory of other objects. - virtual void ReadFill(Deserializer* deserializer, bool primary) = 0; + virtual void ReadFill(Deserializer* deserializer) = 0; // Complete any action that requires the full graph to be deserialized, such // as rehashing. - virtual void PostLoad(Deserializer* deserializer, - const Array& refs, - bool primary) { - if (!primary && is_canonical()) { + virtual void PostLoad(Deserializer* deserializer, const Array& refs) { + // We only need to worry about how canonical values are handled during + // deserialization if there may be multiple loading units, which only + // happens in the precompiled runtime. +#if defined(DART_PRECOMPILED_RUNTIME) + if (is_canonical()) { FATAL("%s needs canonicalization but doesn't define PostLoad", name()); } +#endif } const char* name() const { return name_; } @@ -270,11 +273,7 @@ class SerializationRoots { class DeserializationRoots { public: virtual ~DeserializationRoots() {} - // Returns true if these roots are the first snapshot loaded into a heap, and - // so can assume any canonical objects don't already exist. Returns false if - // some other snapshot may be loaded before these roots, and so written - // canonical objects need to run canonicalization during load. - virtual bool AddBaseObjects(Deserializer* deserializer) = 0; + virtual void AddBaseObjects(Deserializer* deserializer) = 0; virtual void ReadRoots(Deserializer* deserializer) = 0; virtual void PostLoad(Deserializer* deserializer, const Array& refs) = 0; }; @@ -1083,7 +1082,7 @@ class ClassDeserializationCluster : public DeserializationCluster { ClassDeserializationCluster() : DeserializationCluster("Class") {} ~ClassDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { predefined_start_index_ = d->next_index(); intptr_t count = d->ReadUnsigned(); ClassTable* table = d->isolate_group()->class_table(); @@ -1104,7 +1103,7 @@ class ClassDeserializationCluster : public DeserializationCluster { stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); for (intptr_t id = predefined_start_index_; id < predefined_stop_index_; @@ -1478,11 +1477,11 @@ class TypeParametersDeserializationCluster : public DeserializationCluster { : DeserializationCluster("TypeParameters") {} ~TypeParametersDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, TypeParameters::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -1567,7 +1566,7 @@ class TypeArgumentsDeserializationCluster "TypeArguments") {} ~TypeArgumentsDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -1578,10 +1577,10 @@ class TypeArgumentsDeserializationCluster BuildCanonicalSetFromLayout(d); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { TypeArgumentsPtr type_args = static_cast(d.Ref(id)); const intptr_t length = d.ReadUnsigned(); @@ -1599,13 +1598,13 @@ class TypeArgumentsDeserializationCluster } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { if (!table_.IsNull()) { auto object_store = d->isolate_group()->object_store(); VerifyCanonicalSet( d, refs, Array::Handle(object_store->canonical_type_arguments())); object_store->set_canonical_type_arguments(table_); - } else if (!primary && is_canonical()) { + } else if (!is_root_unit_ && is_canonical()) { TypeArguments& type_arg = TypeArguments::Handle(d->zone()); for (intptr_t i = start_index_, n = stop_index_; i < n; i++) { type_arg ^= refs.At(i); @@ -1662,11 +1661,11 @@ class PatchClassDeserializationCluster : public DeserializationCluster { PatchClassDeserializationCluster() : DeserializationCluster("PatchClass") {} ~PatchClassDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, PatchClass::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -1882,11 +1881,11 @@ class FunctionDeserializationCluster : public DeserializationCluster { FunctionDeserializationCluster() : DeserializationCluster("Function") {} ~FunctionDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Function::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -1950,7 +1949,7 @@ class FunctionDeserializationCluster : public DeserializationCluster { } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { if (d->kind() == Snapshot::kFullAOT) { Function& func = Function::Handle(d->zone()); for (intptr_t i = start_index_, n = stop_index_; i < n; i++) { @@ -2042,11 +2041,11 @@ class ClosureDataDeserializationCluster : public DeserializationCluster { ClosureDataDeserializationCluster() : DeserializationCluster("ClosureData") {} ~ClosureDataDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, ClosureData::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -2113,11 +2112,11 @@ class FfiTrampolineDataDeserializationCluster : public DeserializationCluster { : DeserializationCluster("FfiTrampolineData") {} ~FfiTrampolineDataDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, FfiTrampolineData::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -2224,11 +2223,11 @@ class FieldDeserializationCluster : public DeserializationCluster { FieldDeserializationCluster() : DeserializationCluster("Field") {} ~FieldDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Field::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -2277,7 +2276,7 @@ class FieldDeserializationCluster : public DeserializationCluster { } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { Field& field = Field::Handle(d->zone()); if (!IsolateGroup::Current()->use_field_guards()) { for (intptr_t i = start_index_, n = stop_index_; i < n; i++) { @@ -2365,11 +2364,11 @@ class ScriptDeserializationCluster : public DeserializationCluster { ScriptDeserializationCluster() : DeserializationCluster("Script") {} ~ScriptDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Script::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -2437,11 +2436,11 @@ class LibraryDeserializationCluster : public DeserializationCluster { LibraryDeserializationCluster() : DeserializationCluster("Library") {} ~LibraryDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Library::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -2508,11 +2507,11 @@ class NamespaceDeserializationCluster : public DeserializationCluster { NamespaceDeserializationCluster() : DeserializationCluster("Namespace") {} ~NamespaceDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Namespace::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -2572,11 +2571,11 @@ class KernelProgramInfoDeserializationCluster : public DeserializationCluster { : DeserializationCluster("KernelProgramInfo") {} ~KernelProgramInfoDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, KernelProgramInfo::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -2588,7 +2587,7 @@ class KernelProgramInfoDeserializationCluster : public DeserializationCluster { } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { Array& array = Array::Handle(d->zone()); KernelProgramInfo& info = KernelProgramInfo::Handle(d->zone()); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { @@ -3011,7 +3010,7 @@ class CodeDeserializationCluster : public DeserializationCluster { CodeDeserializationCluster() : DeserializationCluster("Code") {} ~CodeDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); d->set_code_start_index(start_index_); const intptr_t count = d->ReadUnsigned(); @@ -3036,7 +3035,7 @@ class CodeDeserializationCluster : public DeserializationCluster { code->untag()->state_bits_ = state_bits; } - void ReadFill(Deserializer* d, bool primary) { + void ReadFill(Deserializer* d) override { ASSERT(!is_canonical()); // Never canonical. ReadFill(d, start_index_, stop_index_, false); #if defined(DART_PRECOMPILED_RUNTIME) @@ -3105,7 +3104,7 @@ class CodeDeserializationCluster : public DeserializationCluster { } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { d->EndInstructions(); #if !defined(PRODUCT) @@ -3237,7 +3236,7 @@ class ObjectPoolDeserializationCluster : public DeserializationCluster { ObjectPoolDeserializationCluster() : DeserializationCluster("ObjectPool") {} ~ObjectPoolDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -3247,7 +3246,7 @@ class ObjectPoolDeserializationCluster : public DeserializationCluster { stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -3315,7 +3314,7 @@ class ObjectPoolDeserializationCluster : public DeserializationCluster { } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { #if defined(DART_PRECOMPILED_RUNTIME) && \ (!defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)) if (FLAG_disassemble) { @@ -3426,7 +3425,7 @@ class PcDescriptorsDeserializationCluster : public DeserializationCluster { : DeserializationCluster("PcDescriptors") {} ~PcDescriptorsDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -3436,7 +3435,7 @@ class PcDescriptorsDeserializationCluster : public DeserializationCluster { stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -3501,7 +3500,7 @@ class CodeSourceMapDeserializationCluster : public DeserializationCluster { : DeserializationCluster("CodeSourceMap") {} ~CodeSourceMapDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -3511,7 +3510,7 @@ class CodeSourceMapDeserializationCluster : public DeserializationCluster { stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { @@ -3579,7 +3578,7 @@ class CompressedStackMapsDeserializationCluster : DeserializationCluster("CompressedStackMaps") {} ~CompressedStackMapsDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -3589,7 +3588,7 @@ class CompressedStackMapsDeserializationCluster stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { @@ -3685,16 +3684,16 @@ class RODataSerializationCluster class RODataDeserializationCluster : public CanonicalSetDeserializationCluster { public: - explicit RODataDeserializationCluster(bool is_canonical, - bool is_root_unit, - intptr_t cid) + explicit RODataDeserializationCluster(intptr_t cid, + bool is_canonical, + bool is_root_unit) : CanonicalSetDeserializationCluster(is_canonical, is_root_unit, "ROData"), cid_(cid) {} ~RODataDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); intptr_t count = d->ReadUnsigned(); uint32_t running_offset = 0; @@ -3709,13 +3708,13 @@ class RODataDeserializationCluster } } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); // No-op. } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { if (!table_.IsNull()) { auto object_store = d->isolate_group()->object_store(); VerifyCanonicalSet(d, refs, @@ -3724,7 +3723,7 @@ class RODataDeserializationCluster if (d->isolate_group() == Dart::vm_isolate_group()) { Symbols::InitFromSnapshot(d->isolate_group()); } - } else if (!primary && is_canonical()) { + } else if (!is_root_unit_ && is_canonical()) { FATAL("Cannot recanonicalize RO objects."); } } @@ -3794,7 +3793,7 @@ class ExceptionHandlersDeserializationCluster : public DeserializationCluster { : DeserializationCluster("ExceptionHandlers") {} ~ExceptionHandlersDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -3804,7 +3803,7 @@ class ExceptionHandlersDeserializationCluster : public DeserializationCluster { stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -3886,7 +3885,7 @@ class ContextDeserializationCluster : public DeserializationCluster { ContextDeserializationCluster() : DeserializationCluster("Context") {} ~ContextDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -3896,7 +3895,7 @@ class ContextDeserializationCluster : public DeserializationCluster { stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -3966,7 +3965,7 @@ class ContextScopeDeserializationCluster : public DeserializationCluster { : DeserializationCluster("ContextScope") {} ~ContextScopeDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -3976,7 +3975,7 @@ class ContextScopeDeserializationCluster : public DeserializationCluster { stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -4037,11 +4036,11 @@ class UnlinkedCallDeserializationCluster : public DeserializationCluster { : DeserializationCluster("UnlinkedCall") {} ~UnlinkedCallDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, UnlinkedCall::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -4103,11 +4102,11 @@ class ICDataDeserializationCluster : public DeserializationCluster { ICDataDeserializationCluster() : DeserializationCluster("ICData") {} ~ICDataDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, ICData::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -4167,11 +4166,11 @@ class MegamorphicCacheDeserializationCluster : public DeserializationCluster { : DeserializationCluster("MegamorphicCache") {} ~MegamorphicCacheDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, MegamorphicCache::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -4232,11 +4231,11 @@ class SubtypeTestCacheDeserializationCluster : public DeserializationCluster { : DeserializationCluster("SubtypeTestCache") {} ~SubtypeTestCacheDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, SubtypeTestCache::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -4295,11 +4294,11 @@ class LoadingUnitDeserializationCluster : public DeserializationCluster { LoadingUnitDeserializationCluster() : DeserializationCluster("LoadingUnit") {} ~LoadingUnitDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, LoadingUnit::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -4363,11 +4362,11 @@ class LanguageErrorDeserializationCluster : public DeserializationCluster { : DeserializationCluster("LanguageError") {} ~LanguageErrorDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, LanguageError::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -4428,11 +4427,11 @@ class UnhandledExceptionDeserializationCluster : public DeserializationCluster { : DeserializationCluster("UnhandledException") {} ~UnhandledExceptionDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, UnhandledException::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -4555,13 +4554,17 @@ class InstanceSerializationCluster : public SerializationCluster { class AbstractInstanceDeserializationCluster : public DeserializationCluster { protected: explicit AbstractInstanceDeserializationCluster(const char* name, - bool is_canonical) - : DeserializationCluster(name, is_canonical) {} + bool is_canonical, + bool is_root_unit) + : DeserializationCluster(name, is_canonical), + is_root_unit_(is_root_unit) {} + + const bool is_root_unit_; public: #if defined(DART_PRECOMPILED_RUNTIME) - void PostLoad(Deserializer* d, const Array& refs, bool primary) { - if (!primary && is_canonical()) { + void PostLoad(Deserializer* d, const Array& refs) override { + if (!is_root_unit_ && is_canonical()) { SafepointMutexLocker ml( d->isolate_group()->constant_canonicalization_mutex()); Instance& instance = Instance::Handle(d->zone()); @@ -4580,13 +4583,16 @@ class InstanceDeserializationCluster public: explicit InstanceDeserializationCluster(intptr_t cid, bool is_canonical, - bool is_immutable) - : AbstractInstanceDeserializationCluster("Instance", is_canonical), + bool is_immutable, + bool is_root_unit) + : AbstractInstanceDeserializationCluster("Instance", + is_canonical, + is_root_unit), cid_(cid), is_immutable_(is_immutable) {} ~InstanceDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); next_field_offset_in_words_ = d->Read(); @@ -4599,11 +4605,11 @@ class InstanceDeserializationCluster stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); const intptr_t cid = cid_; - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); const bool is_immutable = is_immutable_; intptr_t next_field_offset = next_field_offset_in_words_ << kCompressedWordSizeLog2; @@ -4692,11 +4698,11 @@ class LibraryPrefixDeserializationCluster : public DeserializationCluster { : DeserializationCluster("LibraryPrefix") {} ~LibraryPrefixDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, LibraryPrefix::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -4804,15 +4810,15 @@ class TypeDeserializationCluster } ~TypeDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Type::InstanceSize()); BuildCanonicalSetFromLayout(d); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { TypePtr type = static_cast(d.Ref(id)); Deserializer::InitializeHeader(type, kTypeCid, Type::InstanceSize(), @@ -4822,13 +4828,13 @@ class TypeDeserializationCluster } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { if (!table_.IsNull()) { auto object_store = d->isolate_group()->object_store(); VerifyCanonicalSet(d, refs, Array::Handle(object_store->canonical_types())); object_store->set_canonical_types(table_); - } else if (!primary && is_canonical()) { + } else if (!is_root_unit_ && is_canonical()) { AbstractType& type = AbstractType::Handle(d->zone()); for (intptr_t i = start_index_, n = stop_index_; i < n; i++) { type ^= refs.At(i); @@ -4918,15 +4924,15 @@ class FunctionTypeDeserializationCluster "FunctionType") {} ~FunctionTypeDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, FunctionType::InstanceSize()); BuildCanonicalSetFromLayout(d); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { FunctionTypePtr type = static_cast(d.Ref(id)); Deserializer::InitializeHeader( @@ -4938,13 +4944,13 @@ class FunctionTypeDeserializationCluster } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { if (!table_.IsNull()) { auto object_store = d->isolate_group()->object_store(); VerifyCanonicalSet( d, refs, Array::Handle(object_store->canonical_function_types())); object_store->set_canonical_function_types(table_); - } else if (!primary && is_canonical()) { + } else if (!is_root_unit_ && is_canonical()) { AbstractType& type = AbstractType::Handle(d->zone()); for (intptr_t i = start_index_, n = stop_index_; i < n; i++) { type ^= refs.At(i); @@ -5031,15 +5037,15 @@ class RecordTypeDeserializationCluster "RecordType") {} ~RecordTypeDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, RecordType::InstanceSize()); BuildCanonicalSetFromLayout(d); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { RecordTypePtr type = static_cast(d.Ref(id)); Deserializer::InitializeHeader( @@ -5049,13 +5055,13 @@ class RecordTypeDeserializationCluster } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { if (!table_.IsNull()) { auto object_store = d->isolate_group()->object_store(); VerifyCanonicalSet(d, refs, Array::Handle(object_store->canonical_record_types())); object_store->set_canonical_record_types(table_); - } else if (!primary && is_canonical()) { + } else if (!is_root_unit_ && is_canonical()) { AbstractType& type = AbstractType::Handle(d->zone()); for (intptr_t i = start_index_, n = stop_index_; i < n; i++) { type ^= refs.At(i); @@ -5145,15 +5151,15 @@ class TypeParameterDeserializationCluster "TypeParameter") {} ~TypeParameterDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, TypeParameter::InstanceSize()); BuildCanonicalSetFromLayout(d); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { TypeParameterPtr type = static_cast(d.Ref(id)); Deserializer::InitializeHeader(type, kTypeParameterCid, @@ -5166,13 +5172,13 @@ class TypeParameterDeserializationCluster } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { if (!table_.IsNull()) { auto object_store = d->isolate_group()->object_store(); VerifyCanonicalSet( d, refs, Array::Handle(object_store->canonical_type_parameters())); object_store->set_canonical_type_parameters(table_); - } else if (!primary && is_canonical()) { + } else if (!is_root_unit_ && is_canonical()) { TypeParameter& type_param = TypeParameter::Handle(d->zone()); for (intptr_t i = start_index_, n = stop_index_; i < n; i++) { type_param ^= refs.At(i); @@ -5241,18 +5247,20 @@ class ClosureSerializationCluster : public SerializationCluster { class ClosureDeserializationCluster : public AbstractInstanceDeserializationCluster { public: - explicit ClosureDeserializationCluster(bool is_canonical) - : AbstractInstanceDeserializationCluster("Closure", is_canonical) {} + explicit ClosureDeserializationCluster(bool is_canonical, bool is_root_unit) + : AbstractInstanceDeserializationCluster("Closure", + is_canonical, + is_root_unit) {} ~ClosureDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Closure::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { ClosurePtr closure = static_cast(d.Ref(id)); Deserializer::InitializeHeader(closure, kClosureCid, @@ -5265,7 +5273,7 @@ class ClosureDeserializationCluster } #if defined(DART_PRECOMPILED_RUNTIME) - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { // We only cache the entry point in bare instructions mode (as we need // to load the function anyway otherwise). ASSERT(d->kind() == Snapshot::kFullAOT); @@ -5334,11 +5342,13 @@ class MintSerializationCluster : public SerializationCluster { class MintDeserializationCluster : public AbstractInstanceDeserializationCluster { public: - explicit MintDeserializationCluster(bool is_canonical) - : AbstractInstanceDeserializationCluster("int", is_canonical) {} + explicit MintDeserializationCluster(bool is_canonical, bool is_root_unit) + : AbstractInstanceDeserializationCluster("int", + is_canonical, + is_root_unit) {} ~MintDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); const bool mark_canonical = is_canonical(); @@ -5357,7 +5367,7 @@ class MintDeserializationCluster stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { Deserializer::Local d(d_); } + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); } }; #if !defined(DART_PRECOMPILED_RUNTIME) @@ -5401,17 +5411,19 @@ class DoubleSerializationCluster : public SerializationCluster { class DoubleDeserializationCluster : public AbstractInstanceDeserializationCluster { public: - explicit DoubleDeserializationCluster(bool is_canonical) - : AbstractInstanceDeserializationCluster("double", is_canonical) {} + explicit DoubleDeserializationCluster(bool is_canonical, bool is_root_unit) + : AbstractInstanceDeserializationCluster("double", + is_canonical, + is_root_unit) {} ~DoubleDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Double::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { DoublePtr dbl = static_cast(d.Ref(id)); Deserializer::InitializeHeader(dbl, kDoubleCid, Double::InstanceSize(), @@ -5467,21 +5479,25 @@ class Simd128SerializationCluster : public SerializationCluster { class Simd128DeserializationCluster : public AbstractInstanceDeserializationCluster { public: - explicit Simd128DeserializationCluster(intptr_t cid, bool is_canonical) - : AbstractInstanceDeserializationCluster("Simd128", is_canonical), + explicit Simd128DeserializationCluster(intptr_t cid, + bool is_canonical, + bool is_root_unit) + : AbstractInstanceDeserializationCluster("Simd128", + is_canonical, + is_root_unit), cid_(cid) {} ~Simd128DeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ASSERT_EQUAL(Int32x4::InstanceSize(), Float32x4::InstanceSize()); ASSERT_EQUAL(Int32x4::InstanceSize(), Float64x2::InstanceSize()); ReadAllocFixedSize(d, Int32x4::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); const intptr_t cid = cid_; - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { ObjectPtr vector = d.Ref(id); Deserializer::InitializeHeader(vector, cid, Int32x4::InstanceSize(), @@ -5541,11 +5557,11 @@ class GrowableObjectArrayDeserializationCluster : DeserializationCluster("GrowableObjectArray") {} ~GrowableObjectArrayDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, GrowableObjectArray::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { @@ -5610,11 +5626,13 @@ class RecordSerializationCluster : public SerializationCluster { class RecordDeserializationCluster : public AbstractInstanceDeserializationCluster { public: - explicit RecordDeserializationCluster(bool is_canonical) - : AbstractInstanceDeserializationCluster("Record", is_canonical) {} + explicit RecordDeserializationCluster(bool is_canonical, bool is_root_unit) + : AbstractInstanceDeserializationCluster("Record", + is_canonical, + is_root_unit) {} ~RecordDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -5624,10 +5642,10 @@ class RecordDeserializationCluster stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); - const bool stamp_canonical = primary && is_canonical(); + const bool stamp_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { RecordPtr record = static_cast(d.Ref(id)); const intptr_t shape = d.ReadUnsigned(); @@ -5694,7 +5712,7 @@ class TypedDataDeserializationCluster : public DeserializationCluster { : DeserializationCluster("TypedData"), cid_(cid) {} ~TypedDataDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); intptr_t element_size = TypedData::ElementSizeInBytes(cid_); @@ -5705,7 +5723,7 @@ class TypedDataDeserializationCluster : public DeserializationCluster { stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -5774,11 +5792,11 @@ class TypedDataViewDeserializationCluster : public DeserializationCluster { : DeserializationCluster("TypedDataView"), cid_(cid) {} ~TypedDataViewDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, TypedDataView::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); const intptr_t cid = cid_; @@ -5790,8 +5808,7 @@ class TypedDataViewDeserializationCluster : public DeserializationCluster { } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { - ASSERT(primary || !is_canonical()); + void PostLoad(Deserializer* d, const Array& refs) override { auto& view = TypedDataView::Handle(d->zone()); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { view ^= refs.At(id); @@ -5852,11 +5869,11 @@ class ExternalTypedDataDeserializationCluster : public DeserializationCluster { : DeserializationCluster("ExternalTypedData"), cid_(cid) {} ~ExternalTypedDataDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, ExternalTypedData::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -5949,7 +5966,7 @@ class DeltaEncodedTypedDataDeserializationCluster : DeserializationCluster("DeltaEncodedTypedData") {} ~DeltaEncodedTypedDataDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -5959,7 +5976,7 @@ class DeltaEncodedTypedDataDeserializationCluster stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); TypedData& typed_data = TypedData::Handle(d_->zone()); @@ -6035,11 +6052,11 @@ class StackTraceDeserializationCluster : public DeserializationCluster { StackTraceDeserializationCluster() : DeserializationCluster("StackTrace") {} ~StackTraceDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, StackTrace::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -6098,11 +6115,11 @@ class RegExpDeserializationCluster : public DeserializationCluster { RegExpDeserializationCluster() : DeserializationCluster("RegExp") {} ~RegExpDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, RegExp::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -6179,11 +6196,11 @@ class WeakPropertyDeserializationCluster : public DeserializationCluster { : DeserializationCluster("WeakProperty") {} ~WeakPropertyDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, WeakProperty::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); ASSERT(!is_canonical()); // Never canonical. @@ -6242,20 +6259,24 @@ class MapSerializationCluster : public SerializationCluster { class MapDeserializationCluster : public AbstractInstanceDeserializationCluster { public: - explicit MapDeserializationCluster(bool is_canonical, intptr_t cid) - : AbstractInstanceDeserializationCluster("Map", is_canonical), + explicit MapDeserializationCluster(intptr_t cid, + bool is_canonical, + bool is_root_unit) + : AbstractInstanceDeserializationCluster("Map", + is_canonical, + is_root_unit), cid_(cid) {} ~MapDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Map::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); const intptr_t cid = cid_; - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { MapPtr map = static_cast(d.Ref(id)); Deserializer::InitializeHeader(map, cid, Map::InstanceSize(), @@ -6313,20 +6334,24 @@ class SetSerializationCluster : public SerializationCluster { class SetDeserializationCluster : public AbstractInstanceDeserializationCluster { public: - explicit SetDeserializationCluster(bool is_canonical, intptr_t cid) - : AbstractInstanceDeserializationCluster("Set", is_canonical), + explicit SetDeserializationCluster(intptr_t cid, + bool is_canonical, + bool is_root_unit) + : AbstractInstanceDeserializationCluster("Set", + is_canonical, + is_root_unit), cid_(cid) {} ~SetDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { ReadAllocFixedSize(d, Set::InstanceSize()); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); const intptr_t cid = cid_; - const bool mark_canonical = primary && is_canonical(); + const bool mark_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { SetPtr set = static_cast(d.Ref(id)); Deserializer::InitializeHeader(set, cid, Set::InstanceSize(), @@ -6449,12 +6474,16 @@ class ArraySerializationCluster : public SerializationCluster { class ArrayDeserializationCluster : public AbstractInstanceDeserializationCluster { public: - explicit ArrayDeserializationCluster(bool is_canonical, intptr_t cid) - : AbstractInstanceDeserializationCluster("Array", is_canonical), + explicit ArrayDeserializationCluster(intptr_t cid, + bool is_canonical, + bool is_root_unit) + : AbstractInstanceDeserializationCluster("Array", + is_canonical, + is_root_unit), cid_(cid) {} ~ArrayDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -6464,11 +6493,11 @@ class ArrayDeserializationCluster stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); const intptr_t cid = cid_; - const bool stamp_canonical = primary && is_canonical(); + const bool stamp_canonical = is_root_unit_ && is_canonical(); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { ArrayPtr array = static_cast(d.Ref(id)); const intptr_t length = d.ReadUnsigned(); @@ -6547,7 +6576,7 @@ class WeakArrayDeserializationCluster : public DeserializationCluster { WeakArrayDeserializationCluster() : DeserializationCluster("WeakArray") {} ~WeakArrayDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -6557,7 +6586,7 @@ class WeakArrayDeserializationCluster : public DeserializationCluster { stop_index_ = d->next_index(); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { @@ -6664,7 +6693,7 @@ class StringDeserializationCluster "String") {} ~StringDeserializationCluster() {} - void ReadAlloc(Deserializer* d) { + void ReadAlloc(Deserializer* d) override { start_index_ = d->next_index(); const intptr_t count = d->ReadUnsigned(); for (intptr_t i = 0; i < count; i++) { @@ -6677,7 +6706,7 @@ class StringDeserializationCluster BuildCanonicalSetFromLayout(d); } - void ReadFill(Deserializer* d_, bool primary) { + void ReadFill(Deserializer* d_) override { Deserializer::Local d(d_); for (intptr_t id = start_index_, n = stop_index_; id < n; id++) { @@ -6693,8 +6722,7 @@ class StringDeserializationCluster instance_size - 1 * kWordSize) = 0; *reinterpret_cast(reinterpret_cast(str->untag()) + instance_size - 2 * kWordSize) = 0; - Deserializer::InitializeHeader(str, cid, instance_size, - primary && is_canonical()); + Deserializer::InitializeHeader(str, cid, instance_size, is_canonical()); #if DART_COMPRESSED_POINTERS // Gap caused by less-than-a-word length_ smi sitting before data_. const intptr_t length_offset = @@ -6732,7 +6760,7 @@ class StringDeserializationCluster } } - void PostLoad(Deserializer* d, const Array& refs, bool primary) { + void PostLoad(Deserializer* d, const Array& refs) override { if (!table_.IsNull()) { auto object_store = d->isolate_group()->object_store(); VerifyCanonicalSet(d, refs, @@ -6903,7 +6931,7 @@ class VMDeserializationRoots : public DeserializationRoots { public: VMDeserializationRoots() : symbol_table_(WeakArray::Handle()) {} - bool AddBaseObjects(Deserializer* d) { + void AddBaseObjects(Deserializer* d) override { // These objects are always allocated by Object::InitOnce, so they are not // written into the snapshot. @@ -6955,11 +6983,9 @@ class VMDeserializationRoots : public DeserializationRoots { d->AddBaseObject(StubCode::EntryAt(i).ptr()); } } - - return true; // primary } - void ReadRoots(Deserializer* d) { + void ReadRoots(Deserializer* d) override { symbol_table_ ^= d->ReadRef(); if (!symbol_table_.IsNull()) { d->isolate_group()->object_store()->set_symbol_table(symbol_table_); @@ -6974,7 +7000,7 @@ class VMDeserializationRoots : public DeserializationRoots { } } - void PostLoad(Deserializer* d, const Array& refs) { + void PostLoad(Deserializer* d, const Array& refs) override { // Move remaining bump allocation space to the freelist so it used by C++ // allocations (e.g., FinalizeVMIsolate) before allocating new pages. d->heap()->old_space()->ReleaseBumpAllocation(); @@ -7142,16 +7168,15 @@ class ProgramDeserializationRoots : public DeserializationRoots { explicit ProgramDeserializationRoots(ObjectStore* object_store) : object_store_(object_store) {} - bool AddBaseObjects(Deserializer* d) { + void AddBaseObjects(Deserializer* d) override { // N.B.: Skipping index 0 because ref 0 is illegal. const Array& base_objects = Object::vm_isolate_snapshot_object_table(); for (intptr_t i = kFirstReference; i < base_objects.Length(); i++) { d->AddBaseObject(base_objects.At(i)); } - return true; // primary } - void ReadRoots(Deserializer* d) { + void ReadRoots(Deserializer* d) override { // Read roots. ObjectPtr* from = object_store_->from(); ObjectPtr* to = object_store_->to_snapshot(d->kind()); @@ -7171,7 +7196,7 @@ class ProgramDeserializationRoots : public DeserializationRoots { d->ReadDispatchTable(); } - void PostLoad(Deserializer* d, const Array& refs) { + void PostLoad(Deserializer* d, const Array& refs) override { auto isolate_group = d->isolate_group(); { isolate_group->class_table()->CopySizesFromClassObjects(); } d->heap()->old_space()->EvaluateAfterLoading(); @@ -7275,16 +7300,15 @@ class UnitDeserializationRoots : public DeserializationRoots { public: explicit UnitDeserializationRoots(const LoadingUnit& unit) : unit_(unit) {} - bool AddBaseObjects(Deserializer* d) { + void AddBaseObjects(Deserializer* d) override { const Array& base_objects = Array::Handle(LoadingUnit::Handle(unit_.parent()).base_objects()); for (intptr_t i = kFirstReference; i < base_objects.Length(); i++) { d->AddBaseObject(base_objects.At(i)); } - return false; // primary } - void ReadRoots(Deserializer* d) { + void ReadRoots(Deserializer* d) override { deferred_start_index_ = d->ReadUnsigned(); deferred_stop_index_ = deferred_start_index_ + d->ReadUnsigned(); for (intptr_t id = deferred_start_index_; id < deferred_stop_index_; id++) { @@ -7345,7 +7369,7 @@ class UnitDeserializationRoots : public DeserializationRoots { } } - void PostLoad(Deserializer* d, const Array& refs) { + void PostLoad(Deserializer* d, const Array& refs) override { d->EndInstructions(); unit_.set_base_objects(refs); } @@ -8932,8 +8956,8 @@ DeserializationCluster* Deserializer::ReadCluster() { const bool is_immutable = UntaggedObject::ImmutableBit::decode(tags); Zone* Z = zone_; if (cid >= kNumPredefinedCids || cid == kInstanceCid) { - return new (Z) - InstanceDeserializationCluster(cid, is_canonical, is_immutable); + return new (Z) InstanceDeserializationCluster( + cid, is_canonical, is_immutable, !is_non_root_unit_); } if (IsTypedDataViewClassId(cid)) { ASSERT(!is_canonical); @@ -8955,13 +8979,13 @@ DeserializationCluster* Deserializer::ReadCluster() { case kCodeSourceMapCid: case kCompressedStackMapsCid: return new (Z) - RODataDeserializationCluster(is_canonical, !is_non_root_unit_, cid); + RODataDeserializationCluster(cid, is_canonical, !is_non_root_unit_); case kOneByteStringCid: case kTwoByteStringCid: case kStringCid: if (!is_non_root_unit_) { - return new (Z) RODataDeserializationCluster(is_canonical, - !is_non_root_unit_, cid); + return new (Z) RODataDeserializationCluster(cid, is_canonical, + !is_non_root_unit_); } break; } @@ -9067,20 +9091,25 @@ DeserializationCluster* Deserializer::ReadCluster() { return new (Z) TypeParameterDeserializationCluster(is_canonical, !is_non_root_unit_); case kClosureCid: - return new (Z) ClosureDeserializationCluster(is_canonical); + return new (Z) + ClosureDeserializationCluster(is_canonical, !is_non_root_unit_); case kMintCid: - return new (Z) MintDeserializationCluster(is_canonical); + return new (Z) + MintDeserializationCluster(is_canonical, !is_non_root_unit_); case kDoubleCid: - return new (Z) DoubleDeserializationCluster(is_canonical); + return new (Z) + DoubleDeserializationCluster(is_canonical, !is_non_root_unit_); case kInt32x4Cid: case kFloat32x4Cid: case kFloat64x2Cid: - return new (Z) Simd128DeserializationCluster(cid, is_canonical); + return new (Z) + Simd128DeserializationCluster(cid, is_canonical, !is_non_root_unit_); case kGrowableObjectArrayCid: ASSERT(!is_canonical); return new (Z) GrowableObjectArrayDeserializationCluster(); case kRecordCid: - return new (Z) RecordDeserializationCluster(is_canonical); + return new (Z) + RecordDeserializationCluster(is_canonical, !is_non_root_unit_); case kStackTraceCid: ASSERT(!is_canonical); return new (Z) StackTraceDeserializationCluster(); @@ -9094,17 +9123,20 @@ DeserializationCluster* Deserializer::ReadCluster() { // We do not have mutable hash maps in snapshots. UNREACHABLE(); case kConstMapCid: - return new (Z) MapDeserializationCluster(is_canonical, kConstMapCid); + return new (Z) MapDeserializationCluster(kConstMapCid, is_canonical, + !is_non_root_unit_); case kSetCid: // We do not have mutable hash sets in snapshots. UNREACHABLE(); case kConstSetCid: - return new (Z) SetDeserializationCluster(is_canonical, kConstSetCid); + return new (Z) SetDeserializationCluster(kConstSetCid, is_canonical, + !is_non_root_unit_); case kArrayCid: - return new (Z) ArrayDeserializationCluster(is_canonical, kArrayCid); + return new (Z) ArrayDeserializationCluster(kArrayCid, is_canonical, + !is_non_root_unit_); case kImmutableArrayCid: - return new (Z) - ArrayDeserializationCluster(is_canonical, kImmutableArrayCid); + return new (Z) ArrayDeserializationCluster( + kImmutableArrayCid, is_canonical, !is_non_root_unit_); case kWeakArrayCid: return new (Z) WeakArrayDeserializationCluster(); case kStringCid: @@ -9114,8 +9146,8 @@ DeserializationCluster* Deserializer::ReadCluster() { #define CASE_FFI_CID(name) case kFfi##name##Cid: CLASS_LIST_FFI_TYPE_MARKER(CASE_FFI_CID) #undef CASE_FFI_CID - return new (Z) - InstanceDeserializationCluster(cid, is_canonical, is_immutable); + return new (Z) InstanceDeserializationCluster( + cid, is_canonical, is_immutable, !is_non_root_unit_); case kDeltaEncodedTypedDataCid: return new (Z) DeltaEncodedTypedDataDeserializationCluster(); default: @@ -9466,7 +9498,6 @@ void Deserializer::Deserialize(DeserializationRoots* roots) { ASSERT(instructions_table_len == 0); #endif // defined(DART_PRECOMPILED_RUNTIME) - bool primary; { // The deserializer initializes objects without using the write barrier, // partly for speed since we know all the deserialized objects will be @@ -9484,7 +9515,7 @@ void Deserializer::Deserialize(DeserializationRoots* roots) { NoSafepointScope no_safepoint; refs_ = refs.ptr(); - primary = roots->AddBaseObjects(this); + roots->AddBaseObjects(this); if (num_base_objects_ != (next_ref_index_ - kFirstReference)) { FATAL("Snapshot expects %" Pd @@ -9510,7 +9541,7 @@ void Deserializer::Deserialize(DeserializationRoots* roots) { { TIMELINE_DURATION(thread(), Isolate, "ReadFill"); for (intptr_t i = 0; i < num_clusters_; i++) { - clusters_[i]->ReadFill(this, primary); + clusters_[i]->ReadFill(this); #if defined(DEBUG) int32_t section_marker = Read(); ASSERT(section_marker == kSectionMarker); @@ -9541,7 +9572,7 @@ void Deserializer::Deserialize(DeserializationRoots* roots) { { TIMELINE_DURATION(thread(), Isolate, "PostLoad"); for (intptr_t i = 0; i < num_clusters_; i++) { - clusters_[i]->PostLoad(this, refs, primary); + clusters_[i]->PostLoad(this, refs); } }