| Index: runtime/vm/raw_object_snapshot.cc
|
| diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
|
| index 01aef3ad7f406e500646a74d0b1f266dc5724e20..9a12d08f26e9b3593679cc3ff3ff719424f07f91 100644
|
| --- a/runtime/vm/raw_object_snapshot.cc
|
| +++ b/runtime/vm/raw_object_snapshot.cc
|
| @@ -31,8 +31,9 @@ RawClass* Class::ReadFrom(SnapshotReader* reader,
|
| ASSERT(reader != NULL);
|
|
|
| Class& cls = Class::ZoneHandle(reader->zone(), Class::null());
|
| + bool is_in_fullsnapshot = reader->Read<bool>();
|
| if ((kind == Snapshot::kFull) ||
|
| - (kind == Snapshot::kScript && !RawObject::IsCreatedFromSnapshot(tags))) {
|
| + (kind == Snapshot::kScript && !is_in_fullsnapshot)) {
|
| // Read in the base information.
|
| classid_t class_id = reader->ReadClassIDValue();
|
|
|
| @@ -49,9 +50,6 @@ RawClass* Class::ReadFrom(SnapshotReader* reader,
|
| }
|
| reader->AddBackRef(object_id, &cls, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - cls.set_tags(tags);
|
| -
|
| // Set all non object fields.
|
| if (!RawObject::IsInternalVMdefinedClassId(class_id)) {
|
| // Instance size of a VM defined class is already set up.
|
| @@ -76,8 +74,10 @@ RawClass* Class::ReadFrom(SnapshotReader* reader,
|
| cls.StorePointer((cls.raw()->from() + i),
|
| reader->PassiveObjectHandle()->raw());
|
| }
|
| + ASSERT(!cls.IsInFullSnapshot() || (kind == Snapshot::kFull));
|
| } else {
|
| cls ^= reader->ReadClassId(object_id);
|
| + ASSERT((kind == Snapshot::kMessage) || cls.IsInFullSnapshot());
|
| }
|
| return cls.raw();
|
| }
|
| @@ -87,17 +87,22 @@ void RawClass::WriteTo(SnapshotWriter* writer,
|
| intptr_t object_id,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| + bool is_in_fullsnapshot = Class::IsInFullSnapshot(this);
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
|
|
| - if ((kind == Snapshot::kFull) ||
|
| - (kind == Snapshot::kScript &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)))) {
|
| - // Write out the class and tags information.
|
| - writer->WriteVMIsolateObject(kClassCid);
|
| - writer->WriteTags(writer->GetObjectTags(this));
|
| + // Write out the class and tags information.
|
| + writer->WriteVMIsolateObject(kClassCid);
|
| + writer->WriteTags(writer->GetObjectTags(this));
|
|
|
| + // Write out the boolean is_in_fullsnapshot first as this will
|
| + // help the reader decide how the rest of the information needs
|
| + // to be interpreted.
|
| + writer->Write<bool>(is_in_fullsnapshot);
|
| +
|
| + if ((kind == Snapshot::kFull) ||
|
| + (kind == Snapshot::kScript && !is_in_fullsnapshot)) {
|
| // Write out all the non object pointer fields.
|
| // NOTE: cpp_vtable_ is not written.
|
| classid_t class_id = ptr()->id_;
|
| @@ -144,9 +149,6 @@ RawUnresolvedClass* UnresolvedClass::ReadFrom(SnapshotReader* reader,
|
| reader->zone(), NEW_OBJECT(UnresolvedClass));
|
| reader->AddBackRef(object_id, &unresolved_class, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - unresolved_class.set_tags(tags);
|
| -
|
| // Set all non object fields.
|
| unresolved_class.set_token_pos(reader->Read<int32_t>());
|
|
|
| @@ -229,11 +231,9 @@ RawType* Type::ReadFrom(SnapshotReader* reader,
|
| reader->PassiveObjectHandle()->raw());
|
| }
|
|
|
| - // Set the object tags.
|
| - type.set_tags(tags);
|
| - if (defer_canonicalization) {
|
| - // We are deferring canonicalization so mark object as not canonical.
|
| - type.ClearCanonical();
|
| + // Set the canonical bit.
|
| + if (!defer_canonicalization && RawObject::IsCanonical(tags)) {
|
| + type.SetCanonical();
|
| }
|
|
|
| return type.raw();
|
| @@ -248,6 +248,7 @@ void RawType::WriteTo(SnapshotWriter* writer,
|
| // Only resolved and finalized types should be written to a snapshot.
|
| ASSERT((ptr()->type_state_ == RawType::kFinalizedInstantiated) ||
|
| (ptr()->type_state_ == RawType::kFinalizedUninstantiated));
|
| + ASSERT(ptr()->type_class_ != Object::null());
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -263,6 +264,7 @@ void RawType::WriteTo(SnapshotWriter* writer,
|
| // Write out all the object pointer fields. Since we will be canonicalizing
|
| // the type object when reading it back we should write out all the fields
|
| // inline and not as references.
|
| + ASSERT(ptr()->type_class_ != Object::null());
|
| SnapshotWriterVisitor visitor(writer);
|
| visitor.VisitPointers(from(), to());
|
| }
|
| @@ -279,9 +281,6 @@ RawTypeRef* TypeRef::ReadFrom(SnapshotReader* reader,
|
| reader->zone(), NEW_OBJECT(TypeRef));
|
| reader->AddBackRef(object_id, &type_ref, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - type_ref.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
| @@ -327,9 +326,6 @@ RawTypeParameter* TypeParameter::ReadFrom(SnapshotReader* reader,
|
| reader->zone(), NEW_OBJECT(TypeParameter));
|
| reader->AddBackRef(object_id, &type_parameter, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - type_parameter.set_tags(tags);
|
| -
|
| // Set all non object fields.
|
| type_parameter.set_token_pos(reader->Read<int32_t>());
|
| type_parameter.set_index(reader->Read<int16_t>());
|
| @@ -389,9 +385,6 @@ RawBoundedType* BoundedType::ReadFrom(SnapshotReader* reader,
|
| reader->zone(), NEW_OBJECT(BoundedType));
|
| reader->AddBackRef(object_id, &bounded_type, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - bounded_type.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
| @@ -478,11 +471,9 @@ RawTypeArguments* TypeArguments::ReadFrom(SnapshotReader* reader,
|
| type_arguments.SetTypeAt(i, *reader->TypeHandle());
|
| }
|
|
|
| - // Set the object tags .
|
| - type_arguments.set_tags(tags);
|
| - if (defer_canonicalization) {
|
| - // We are deferring canonicalization so mark object as not canonical.
|
| - type_arguments.ClearCanonical();
|
| + // Set the canonical bit.
|
| + if (!defer_canonicalization && RawObject::IsCanonical(tags)) {
|
| + type_arguments.SetCanonical();
|
| }
|
|
|
| return type_arguments.raw();
|
| @@ -522,18 +513,12 @@ RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader,
|
| intptr_t tags,
|
| Snapshot::Kind kind) {
|
| ASSERT(reader != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(tags)) ||
|
| - (kind == Snapshot::kFull));
|
|
|
| // Allocate function object.
|
| PatchClass& cls = PatchClass::ZoneHandle(reader->zone(),
|
| NEW_OBJECT(PatchClass));
|
| reader->AddBackRef(object_id, &cls, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - cls.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
| @@ -543,6 +528,9 @@ RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader,
|
| cls.StorePointer((cls.raw()->from() + i),
|
| reader->PassiveObjectHandle()->raw());
|
| }
|
| + ASSERT(((kind == Snapshot::kScript) &&
|
| + !Class::IsInFullSnapshot(cls.source_class())) ||
|
| + (kind == Snapshot::kFull));
|
|
|
| return cls.raw();
|
| }
|
| @@ -552,9 +540,7 @@ void RawPatchClass::WriteTo(SnapshotWriter* writer,
|
| intptr_t object_id,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -573,18 +559,13 @@ RawClosureData* ClosureData::ReadFrom(SnapshotReader* reader,
|
| intptr_t tags,
|
| Snapshot::Kind kind) {
|
| ASSERT(reader != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(tags)) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Allocate closure data object.
|
| ClosureData& data = ClosureData::ZoneHandle(
|
| reader->zone(), NEW_OBJECT(ClosureData));
|
| reader->AddBackRef(object_id, &data, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - data.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
| @@ -601,9 +582,7 @@ void RawClosureData::WriteTo(SnapshotWriter* writer,
|
| intptr_t object_id,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -633,18 +612,13 @@ RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader,
|
| intptr_t tags,
|
| Snapshot::Kind kind) {
|
| ASSERT(reader != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(tags)) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Allocate redirection data object.
|
| RedirectionData& data = RedirectionData::ZoneHandle(
|
| reader->zone(), NEW_OBJECT(RedirectionData));
|
| reader->AddBackRef(object_id, &data, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - data.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
| @@ -665,9 +639,7 @@ void RawRedirectionData::WriteTo(SnapshotWriter* writer,
|
| intptr_t object_id,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -687,18 +659,13 @@ RawFunction* Function::ReadFrom(SnapshotReader* reader,
|
| intptr_t tags,
|
| Snapshot::Kind kind) {
|
| ASSERT(reader != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(tags)) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Allocate function object.
|
| Function& func = Function::ZoneHandle(
|
| reader->zone(), NEW_OBJECT(Function));
|
| reader->AddBackRef(object_id, &func, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - func.set_tags(tags);
|
| -
|
| // Set all the non object fields.
|
| func.set_token_pos(reader->Read<int32_t>());
|
| func.set_end_token_pos(reader->Read<int32_t>());
|
| @@ -734,9 +701,7 @@ void RawFunction::WriteTo(SnapshotWriter* writer,
|
| intptr_t object_id,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -768,17 +733,12 @@ RawField* Field::ReadFrom(SnapshotReader* reader,
|
| intptr_t tags,
|
| Snapshot::Kind kind) {
|
| ASSERT(reader != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(tags)) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Allocate field object.
|
| Field& field = Field::ZoneHandle(reader->zone(), NEW_OBJECT(Field));
|
| reader->AddBackRef(object_id, &field, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - field.set_tags(tags);
|
| -
|
| // Set all non object fields.
|
| field.set_token_pos(reader->Read<int32_t>());
|
| field.set_guarded_cid(reader->Read<int32_t>());
|
| @@ -807,9 +767,7 @@ void RawField::WriteTo(SnapshotWriter* writer,
|
| intptr_t object_id,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -842,9 +800,6 @@ RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader,
|
| reader->zone(), NEW_OBJECT(LiteralToken));
|
| reader->AddBackRef(object_id, &literal_token, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - literal_token.set_tags(tags);
|
| -
|
| // Read the token attributes.
|
| Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>());
|
| literal_token.set_kind(token_kind);
|
| @@ -890,9 +845,7 @@ RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader,
|
| intptr_t tags,
|
| Snapshot::Kind kind) {
|
| ASSERT(reader != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(tags)) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Read the length so that we can determine number of tokens to read.
|
| intptr_t len = reader->ReadSmiValue();
|
| @@ -902,9 +855,6 @@ RawTokenStream* TokenStream::ReadFrom(SnapshotReader* reader,
|
| reader->zone(), NEW_OBJECT_WITH_LEN(TokenStream, len));
|
| reader->AddBackRef(object_id, &token_stream, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - token_stream.set_tags(tags);
|
| -
|
| // Read the stream of tokens into the TokenStream object for script
|
| // snapshots as we made a copy of token stream.
|
| if (kind == Snapshot::kScript) {
|
| @@ -928,9 +878,7 @@ void RawTokenStream::WriteTo(SnapshotWriter* writer,
|
| intptr_t object_id,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -957,17 +905,12 @@ RawScript* Script::ReadFrom(SnapshotReader* reader,
|
| intptr_t tags,
|
| Snapshot::Kind kind) {
|
| ASSERT(reader != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(tags)) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Allocate script object.
|
| Script& script = Script::ZoneHandle(reader->zone(), NEW_OBJECT(Script));
|
| reader->AddBackRef(object_id, &script, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - script.set_tags(tags);
|
| -
|
| script.StoreNonPointer(&script.raw_ptr()->line_offset_,
|
| reader->Read<int32_t>());
|
| script.StoreNonPointer(&script.raw_ptr()->col_offset_,
|
| @@ -997,9 +940,7 @@ void RawScript::WriteTo(SnapshotWriter* writer,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| ASSERT(tokens_ != TokenStream::null());
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -1029,18 +970,16 @@ RawLibrary* Library::ReadFrom(SnapshotReader* reader,
|
| Library& library = Library::ZoneHandle(reader->zone(), Library::null());
|
| reader->AddBackRef(object_id, &library, kIsDeserialized);
|
|
|
| - if ((kind == Snapshot::kScript) && RawObject::IsCreatedFromSnapshot(tags)) {
|
| - ASSERT(kind != Snapshot::kFull);
|
| + bool is_in_fullsnapshot = reader->Read<bool>();
|
| + if ((kind == Snapshot::kScript) && is_in_fullsnapshot) {
|
| // Lookup the object as it should already exist in the heap.
|
| *reader->StringHandle() ^= reader->ReadObjectImpl(kAsInlinedObject);
|
| library = Library::LookupLibrary(*reader->StringHandle());
|
| + ASSERT(library.is_in_fullsnapshot());
|
| } else {
|
| // Allocate library object.
|
| library = NEW_OBJECT(Library);
|
|
|
| - // Set the object tags.
|
| - library.set_tags(tags);
|
| -
|
| // Set all non object fields.
|
| library.StoreNonPointer(&library.raw_ptr()->index_,
|
| reader->ReadClassIDValue());
|
| @@ -1056,6 +995,11 @@ RawLibrary* Library::ReadFrom(SnapshotReader* reader,
|
| reader->Read<bool>());
|
| library.StoreNonPointer(&library.raw_ptr()->debuggable_,
|
| reader->Read<bool>());
|
| + if (kind == Snapshot::kFull) {
|
| + is_in_fullsnapshot = true;
|
| + }
|
| + library.StoreNonPointer(&library.raw_ptr()->is_in_fullsnapshot_,
|
| + is_in_fullsnapshot);
|
| // The native resolver and symbolizer are not serialized.
|
| library.set_native_entry_resolver(NULL);
|
| library.set_native_entry_symbol_resolver(NULL);
|
| @@ -1092,12 +1036,16 @@ void RawLibrary::WriteTo(SnapshotWriter* writer,
|
| writer->WriteVMIsolateObject(kLibraryCid);
|
| writer->WriteTags(writer->GetObjectTags(this));
|
|
|
| - if ((kind == Snapshot::kScript) &&
|
| - RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) {
|
| - ASSERT(kind != Snapshot::kFull);
|
| + // Write out the boolean is_in_fullsnapshot_ first as this will
|
| + // help the reader decide how the rest of the information needs
|
| + // to be interpreted.
|
| + writer->Write<bool>(ptr()->is_in_fullsnapshot_);
|
| +
|
| + if ((kind == Snapshot::kScript) && ptr()->is_in_fullsnapshot_) {
|
| // Write out library URL so that it can be looked up when reading.
|
| writer->WriteObjectImpl(ptr()->url_, kAsInlinedObject);
|
| } else {
|
| + ASSERT((kind == Snapshot::kFull) || !ptr()->is_in_fullsnapshot_);
|
| // Write out all non object fields.
|
| writer->WriteClassIDValue(ptr()->index_);
|
| writer->WriteClassIDValue(ptr()->num_anonymous_);
|
| @@ -1124,18 +1072,13 @@ RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader,
|
| intptr_t tags,
|
| Snapshot::Kind kind) {
|
| ASSERT(reader != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(tags)) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Allocate library prefix object.
|
| LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(
|
| reader->zone(), NEW_OBJECT(LibraryPrefix));
|
| reader->AddBackRef(object_id, &prefix, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - prefix.set_tags(tags);
|
| -
|
| // Set all non object fields.
|
| prefix.StoreNonPointer(&prefix.raw_ptr()->num_imports_,
|
| reader->Read<int16_t>());
|
| @@ -1161,9 +1104,7 @@ void RawLibraryPrefix::WriteTo(SnapshotWriter* writer,
|
| intptr_t object_id,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -1188,18 +1129,13 @@ RawNamespace* Namespace::ReadFrom(SnapshotReader* reader,
|
| intptr_t tags,
|
| Snapshot::Kind kind) {
|
| ASSERT(reader != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(tags)) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Allocate Namespace object.
|
| Namespace& ns = Namespace::ZoneHandle(
|
| reader->zone(), NEW_OBJECT(Namespace));
|
| reader->AddBackRef(object_id, &ns, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - ns.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
| @@ -1218,9 +1154,7 @@ void RawNamespace::WriteTo(SnapshotWriter* writer,
|
| intptr_t object_id,
|
| Snapshot::Kind kind) {
|
| ASSERT(writer != NULL);
|
| - ASSERT(((kind == Snapshot::kScript) &&
|
| - !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) ||
|
| - (kind == Snapshot::kFull));
|
| + ASSERT((kind == Snapshot::kScript) || (kind == Snapshot::kFull));
|
|
|
| // Write out the serialization header value for this object.
|
| writer->WriteInlinedObjectHeader(object_id);
|
| @@ -1296,9 +1230,6 @@ RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader,
|
| PcDescriptors::New(length));
|
| reader->AddBackRef(object_id, &result, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - result.set_tags(tags);
|
| -
|
| if (result.Length() > 0) {
|
| NoSafepointScope no_safepoint;
|
| intptr_t len = result.Length();
|
| @@ -1343,9 +1274,6 @@ RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader,
|
| Stackmap::New(length, register_bit_count, pc_offset));
|
| reader->AddBackRef(object_id, &result, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - result.set_tags(tags);
|
| -
|
| if (result.Length() > 0) {
|
| NoSafepointScope no_safepoint;
|
| intptr_t len = (result.Length() + 7) / 8;
|
| @@ -1390,9 +1318,6 @@ RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader,
|
| LocalVarDescriptors::New(num_entries));
|
| reader->AddBackRef(object_id, &result, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - result.set_tags(tags);
|
| -
|
| for (intptr_t i = 0; i < num_entries; i++) {
|
| (*reader->StringHandle()) ^= reader->ReadObjectImpl(kAsReference);
|
| result.StorePointer(result.raw()->nameAddrAt(i),
|
| @@ -1446,9 +1371,6 @@ RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader,
|
| ExceptionHandlers::New(*reader->ArrayHandle()));
|
| reader->AddBackRef(object_id, &result, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - result.set_tags(tags);
|
| -
|
| if (result.num_entries() > 0) {
|
| NoSafepointScope no_safepoint;
|
| const intptr_t len =
|
| @@ -1496,9 +1418,6 @@ RawContext* Context::ReadFrom(SnapshotReader* reader,
|
| } else {
|
| context ^= NEW_OBJECT_WITH_LEN(Context, num_vars);
|
|
|
| - // Set the object tags.
|
| - context.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
| @@ -1627,9 +1546,6 @@ RawApiError* ApiError::ReadFrom(SnapshotReader* reader,
|
| ApiError::ZoneHandle(reader->zone(), NEW_OBJECT(ApiError));
|
| reader->AddBackRef(object_id, &api_error, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - api_error.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
| @@ -1673,9 +1589,6 @@ RawLanguageError* LanguageError::ReadFrom(SnapshotReader* reader,
|
| LanguageError::ZoneHandle(reader->zone(), NEW_OBJECT(LanguageError));
|
| reader->AddBackRef(object_id, &language_error, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - language_error.set_tags(tags);
|
| -
|
| // Set all non object fields.
|
| language_error.set_token_pos(reader->Read<int32_t>());
|
| language_error.set_kind(reader->Read<uint8_t>());
|
| @@ -1725,9 +1638,6 @@ RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader,
|
| reader->zone(), NEW_OBJECT(UnhandledException));
|
| reader->AddBackRef(object_id, &result, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - result.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
| @@ -1784,26 +1694,20 @@ RawInstance* Instance::ReadFrom(SnapshotReader* reader,
|
| Instance& obj = Instance::ZoneHandle(reader->zone(), Instance::null());
|
| if (kind == Snapshot::kFull) {
|
| obj = reader->NewInstance();
|
| + // Set the canonical bit.
|
| + if (RawObject::IsCanonical(tags)) {
|
| + obj.SetCanonical();
|
| + }
|
| } else {
|
| obj ^= Object::Allocate(kInstanceCid,
|
| Instance::InstanceSize(),
|
| HEAP_SPACE(kind));
|
| - // When reading a script snapshot we need to canonicalize only those object
|
| - // references that are objects from the core library (loaded from a
|
| - // full snapshot). Objects that are only in the script need not be
|
| - // canonicalized as they are already canonical.
|
| - // When reading a message snapshot we always have to canonicalize.
|
| - if (RawObject::IsCanonical(tags) &&
|
| - (RawObject::IsCreatedFromSnapshot(tags) ||
|
| - (kind == Snapshot::kMessage))) {
|
| + if (RawObject::IsCanonical(tags)) {
|
| obj = obj.CheckAndCanonicalize(NULL);
|
| }
|
| }
|
| reader->AddBackRef(object_id, &obj, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - obj.set_tags(tags);
|
| -
|
| return obj.raw();
|
| }
|
|
|
| @@ -1844,25 +1748,21 @@ RawInteger* Mint::ReadFrom(SnapshotReader* reader,
|
| Mint& mint = Mint::ZoneHandle(reader->zone(), Mint::null());
|
| if (kind == Snapshot::kFull) {
|
| mint = reader->NewMint(value);
|
| - // Set the object tags.
|
| - mint.set_tags(tags);
|
| + // Set the canonical bit.
|
| + if (RawObject::IsCanonical(tags)) {
|
| + mint.SetCanonical();
|
| + }
|
| } else {
|
| // When reading a script snapshot we need to canonicalize only those object
|
| // references that are objects from the core library (loaded from a
|
| // full snapshot). Objects that are only in the script need not be
|
| // canonicalized as they are already canonical.
|
| // When reading a message snapshot we always have to canonicalize.
|
| - if (RawObject::IsCanonical(tags) &&
|
| - (RawObject::IsCreatedFromSnapshot(tags) ||
|
| - (kind == Snapshot::kMessage))) {
|
| + if (RawObject::IsCanonical(tags)) {
|
| mint = Mint::NewCanonical(value);
|
| - ASSERT(mint.IsCanonical() &&
|
| - (kind == Snapshot::kMessage ||
|
| - RawObject::IsCreatedFromSnapshot(mint.raw()->ptr()->tags_)));
|
| + ASSERT(mint.IsCanonical());
|
| } else {
|
| mint = Mint::New(value, HEAP_SPACE(kind));
|
| - // Set the object tags.
|
| - mint.set_tags(tags);
|
| }
|
| }
|
| reader->AddBackRef(object_id, &mint, kIsDeserialized);
|
| @@ -1910,25 +1810,17 @@ RawBigint* Bigint::ReadFrom(SnapshotReader* reader,
|
| // If it is a canonical constant make it one.
|
| // When reading a full snapshot we don't need to canonicalize the object
|
| // as it would already be a canonical object.
|
| - // When reading a script snapshot we need to canonicalize only those object
|
| - // references that are objects from the core library (loaded from a
|
| - // full snapshot). Objects that are only in the script need not be
|
| - // canonicalized as they are already canonical.
|
| - // When reading a message snapshot we always have to canonicalize the object.
|
| - if (kind == Snapshot::kFull) {
|
| - // Set the object tags.
|
| - obj.set_tags(tags);
|
| - } else if (RawObject::IsCanonical(tags) &&
|
| - (RawObject::IsCreatedFromSnapshot(tags) ||
|
| - (kind == Snapshot::kMessage))) {
|
| - obj ^= obj.CheckAndCanonicalize(NULL);
|
| - ASSERT(!obj.IsNull());
|
| - ASSERT(obj.IsCanonical() &&
|
| - (kind == Snapshot::kMessage ||
|
| - RawObject::IsCreatedFromSnapshot(obj.raw()->ptr()->tags_)));
|
| - } else {
|
| - // Set the object tags.
|
| - obj.set_tags(tags);
|
| + // When reading a script snapshot or a message snapshot we always have
|
| + // to canonicalize the object.
|
| + if (RawObject::IsCanonical(tags)) {
|
| + if (kind == Snapshot::kFull) {
|
| + // Set the canonical bit.
|
| + obj.SetCanonical();
|
| + } else {
|
| + obj ^= obj.CheckAndCanonicalize(NULL);
|
| + ASSERT(!obj.IsNull());
|
| + ASSERT(obj.IsCanonical());
|
| + }
|
| }
|
| return obj.raw();
|
| }
|
| @@ -1965,23 +1857,20 @@ RawDouble* Double::ReadFrom(SnapshotReader* reader,
|
| Double& dbl = Double::ZoneHandle(reader->zone(), Double::null());
|
| if (kind == Snapshot::kFull) {
|
| dbl = reader->NewDouble(value);
|
| - // Set the object tags.
|
| - dbl.set_tags(tags);
|
| + // Set the canonical bit.
|
| + if (RawObject::IsCanonical(tags)) {
|
| + dbl.SetCanonical();
|
| + }
|
| } else {
|
| // When reading a script snapshot we need to canonicalize only those object
|
| // references that are objects from the core library (loaded from a
|
| // full snapshot). Objects that are only in the script need not be
|
| // canonicalized as they are already canonical.
|
| - if (RawObject::IsCanonical(tags) &&
|
| - RawObject::IsCreatedFromSnapshot(tags)) {
|
| + if (RawObject::IsCanonical(tags)) {
|
| dbl = Double::NewCanonical(value);
|
| - ASSERT(dbl.IsCanonical() &&
|
| - (kind == Snapshot::kMessage ||
|
| - RawObject::IsCreatedFromSnapshot(dbl.raw()->ptr()->tags_)));
|
| + ASSERT(dbl.IsCanonical());
|
| } else {
|
| dbl = Double::New(value, HEAP_SPACE(kind));
|
| - // Set the object tags.
|
| - dbl.set_tags(tags);
|
| }
|
| }
|
| reader->AddBackRef(object_id, &dbl, kIsDeserialized);
|
| @@ -2041,7 +1930,6 @@ void String::ReadFromImpl(SnapshotReader* reader,
|
| } else {
|
| // Set up the string object.
|
| *str_obj = StringType::New(len, HEAP_SPACE(kind));
|
| - str_obj->set_tags(tags);
|
| str_obj->SetHash(0); // Will get computed when needed.
|
| if (len == 0) {
|
| return;
|
| @@ -2072,7 +1960,9 @@ RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader,
|
| ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0);
|
| RawOneByteString* obj = reader->NewOneByteString(len);
|
| str_obj = obj;
|
| - str_obj.set_tags(tags);
|
| + if (RawObject::IsCanonical(tags)) {
|
| + str_obj.SetCanonical();
|
| + }
|
| str_obj.SetHash(hash);
|
| if (len > 0) {
|
| uint8_t* raw_ptr = CharAddr(str_obj, 0);
|
| @@ -2101,7 +1991,9 @@ RawTwoByteString* TwoByteString::ReadFrom(SnapshotReader* reader,
|
| if (kind == Snapshot::kFull) {
|
| RawTwoByteString* obj = reader->NewTwoByteString(len);
|
| str_obj = obj;
|
| - str_obj.set_tags(tags);
|
| + if (RawObject::IsCanonical(tags)) {
|
| + str_obj.SetCanonical();
|
| + }
|
| str_obj.SetHash(hash);
|
| NoSafepointScope no_safepoint;
|
| uint16_t* raw_ptr = (len > 0)? CharAddr(str_obj, 0) : NULL;
|
| @@ -2290,7 +2182,11 @@ RawImmutableArray* ImmutableArray::ReadFrom(SnapshotReader* reader,
|
| }
|
| reader->ArrayReadFrom(object_id, *array, len, tags);
|
| if (RawObject::IsCanonical(tags)) {
|
| - *array ^= array->CheckAndCanonicalize(NULL);
|
| + if (kind == Snapshot::kFull) {
|
| + array->SetCanonical();
|
| + } else {
|
| + *array ^= array->CheckAndCanonicalize(NULL);
|
| + }
|
| }
|
| return raw(*array);
|
| }
|
| @@ -2396,8 +2292,6 @@ RawLinkedHashMap* LinkedHashMap::ReadFrom(SnapshotReader* reader,
|
| map = LinkedHashMap::NewUninitialized(HEAP_SPACE(kind));
|
| }
|
| reader->AddBackRef(object_id, &map, kIsDeserialized);
|
| - // Set the object tags.
|
| - map.set_tags(tags);
|
|
|
| // Read the type arguments.
|
| const intptr_t typeargs_offset =
|
| @@ -2509,8 +2403,6 @@ RawFloat32x4* Float32x4::ReadFrom(SnapshotReader* reader,
|
| simd = Float32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
|
| }
|
| reader->AddBackRef(object_id, &simd, kIsDeserialized);
|
| - // Set the object tags.
|
| - simd.set_tags(tags);
|
| return simd.raw();
|
| }
|
|
|
| @@ -2555,8 +2447,6 @@ RawInt32x4* Int32x4::ReadFrom(SnapshotReader* reader,
|
| simd = Int32x4::New(value0, value1, value2, value3, HEAP_SPACE(kind));
|
| }
|
| reader->AddBackRef(object_id, &simd, kIsDeserialized);
|
| - // Set the object tags.
|
| - simd.set_tags(tags);
|
| return simd.raw();
|
| }
|
|
|
| @@ -2599,8 +2489,6 @@ RawFloat64x2* Float64x2::ReadFrom(SnapshotReader* reader,
|
| simd = Float64x2::New(value0, value1, HEAP_SPACE(kind));
|
| }
|
| reader->AddBackRef(object_id, &simd, kIsDeserialized);
|
| - // Set the object tags.
|
| - simd.set_tags(tags);
|
| return simd.raw();
|
| }
|
|
|
| @@ -2642,9 +2530,6 @@ RawTypedData* TypedData::ReadFrom(SnapshotReader* reader,
|
| : TypedData::New(cid, len, HEAP_SPACE(kind)));
|
| reader->AddBackRef(object_id, &result, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - result.set_tags(tags);
|
| -
|
| // Setup the array elements.
|
| intptr_t element_size = ElementSizeInBytes(cid);
|
| intptr_t length_in_bytes = len * element_size;
|
| @@ -2993,9 +2878,6 @@ RawJSRegExp* JSRegExp::ReadFrom(SnapshotReader* reader,
|
| reader->zone(), JSRegExp::New(HEAP_SPACE(kind)));
|
| reader->AddBackRef(object_id, ®ex, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - regex.set_tags(tags);
|
| -
|
| // Read and Set all the other fields.
|
| regex.StoreSmi(®ex.raw_ptr()->num_bracket_expressions_,
|
| reader->ReadAsSmi());
|
| @@ -3043,9 +2925,6 @@ RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader,
|
| reader->zone(), WeakProperty::New(HEAP_SPACE(kind)));
|
| reader->AddBackRef(object_id, &weak_property, kIsDeserialized);
|
|
|
| - // Set the object tags.
|
| - weak_property.set_tags(tags);
|
| -
|
| // Set all the object fields.
|
| // TODO(5411462): Need to assert No GC can happen here, even though
|
| // allocations may happen.
|
|
|