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); } }