Chromium Code Reviews| Index: runtime/vm/raw_object_snapshot.cc |
| diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc |
| index 792956724b6fbe053b3d213a5b913f12436be057..1c26b95f5c9d5b5da415df6643f7cdea3b81478a 100644 |
| --- a/runtime/vm/raw_object_snapshot.cc |
| +++ b/runtime/vm/raw_object_snapshot.cc |
| @@ -68,7 +68,9 @@ RawClass* Class::ReadFrom(SnapshotReader* reader, |
| // allocations may happen. |
| intptr_t num_flds = (cls.raw()->to() - cls.raw()->from()); |
| for (intptr_t i = 0; i <= num_flds; i++) { |
| - *(cls.raw()->from() + i) = reader->ReadObjectRef(); |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + cls.StorePointer((cls.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| } |
| } else { |
| cls ^= reader->ReadClassId(object_id); |
| @@ -531,7 +533,9 @@ RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader, |
| // allocations may happen. |
| intptr_t num_flds = (cls.raw()->to() - cls.raw()->from()); |
| for (intptr_t i = 0; i <= num_flds; i++) { |
| - *(cls.raw()->from() + i) = reader->ReadObjectRef(); |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + cls.StorePointer((cls.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| } |
| return cls.raw(); |
| @@ -640,7 +644,9 @@ RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader, |
| // allocations may happen. |
| intptr_t num_flds = (data.raw()->to() - data.raw()->from()); |
| for (intptr_t i = 0; i <= num_flds; i++) { |
| - *(data.raw()->from() + i) = reader->ReadObjectRef(); |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + data.StorePointer((data.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| } |
| return data.raw(); |
| @@ -701,7 +707,9 @@ RawFunction* Function::ReadFrom(SnapshotReader* reader, |
| // allocations may happen. |
| intptr_t num_flds = (func.raw()->to_snapshot() - func.raw()->from()); |
| for (intptr_t i = 0; i <= num_flds; i++) { |
| - *(func.raw()->from() + i) = reader->ReadObjectRef(); |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + func.StorePointer((func.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| } |
| // Initialize all fields that are not part of the snapshot. |
| @@ -770,7 +778,9 @@ RawField* Field::ReadFrom(SnapshotReader* reader, |
| // allocations may happen. |
| intptr_t num_flds = (field.raw()->to() - field.raw()->from()); |
| for (intptr_t i = 0; i <= num_flds; i++) { |
| - *(field.raw()->from() + i) = reader->ReadObjectRef(); |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + field.StorePointer((field.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| } |
| field.InitializeGuardedListLengthInObjectOffset(); |
| @@ -824,10 +834,16 @@ RawLiteralToken* LiteralToken::ReadFrom(SnapshotReader* reader, |
| // Read the token attributes. |
| Token::Kind token_kind = static_cast<Token::Kind>(reader->Read<int32_t>()); |
| literal_token.set_kind(token_kind); |
| - *reader->StringHandle() ^= reader->ReadObjectImpl(); |
| - literal_token.set_literal(*reader->StringHandle()); |
| - *reader->PassiveObjectHandle() = reader->ReadObjectImpl(); |
| - literal_token.set_value(*reader->PassiveObjectHandle()); |
| + |
| + // Set all the object fields. |
| + // TODO(5411462): Need to assert No GC can happen here, even though |
| + // allocations may happen. |
| + intptr_t num_flds = (literal_token.raw()->to() - literal_token.raw()->from()); |
| + for (intptr_t i = 0; i <= num_flds; i++) { |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + literal_token.StorePointer((literal_token.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| + } |
| return literal_token.raw(); |
| } |
| @@ -849,9 +865,9 @@ void RawLiteralToken::WriteTo(SnapshotWriter* writer, |
| // Write out the kind field. |
| writer->Write<int32_t>(ptr()->kind_); |
| - // Write out literal and value fields. |
| - writer->WriteObjectImpl(ptr()->literal_); |
| - writer->WriteObjectImpl(ptr()->value_); |
| + // Write out all the object pointer fields. |
| + SnapshotWriterVisitor visitor(writer); |
| + visitor.VisitPointers(from(), to()); |
| } |
| @@ -938,17 +954,6 @@ RawScript* Script::ReadFrom(SnapshotReader* reader, |
| // Set the object tags. |
| script.set_tags(tags); |
| - // Set all the object fields. |
| - // TODO(5411462): Need to assert No GC can happen here, even though |
| - // allocations may happen. |
| - *reader->StringHandle() ^= reader->ReadObjectImpl(); |
| - script.set_url(*reader->StringHandle()); |
| - *reader->StringHandle() ^= String::null(); |
| - script.set_source(*reader->StringHandle()); |
| - TokenStream& stream = TokenStream::Handle(); |
| - stream ^= reader->ReadObjectImpl(); |
| - script.set_tokens(stream); |
| - |
| script.StoreNonPointer(&script.raw_ptr()->line_offset_, |
| reader->Read<int32_t>()); |
| script.StoreNonPointer(&script.raw_ptr()->col_offset_, |
| @@ -956,6 +961,19 @@ RawScript* Script::ReadFrom(SnapshotReader* reader, |
| script.StoreNonPointer(&script.raw_ptr()->kind_, |
| reader->Read<int8_t>()); |
| + // Set all the object fields. |
| + // TODO(5411462): Need to assert No GC can happen here, even though |
| + // allocations may happen. |
| + intptr_t num_flds = (script.raw()->to_snapshot() - script.raw()->from()); |
| + for (intptr_t i = 0; i <= num_flds; i++) { |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + script.StorePointer((script.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| + } |
| + // Script wasn't allocated with nulls? |
| + *reader->StringHandle() ^= String::null(); |
| + script.set_source(*reader->StringHandle()); |
| + |
| return script.raw(); |
| } |
| @@ -976,13 +994,14 @@ void RawScript::WriteTo(SnapshotWriter* writer, |
| writer->WriteVMIsolateObject(kScriptCid); |
| writer->WriteTags(writer->GetObjectTags(this)); |
| - // Write out all the object pointer fields. |
| - writer->WriteObjectImpl(ptr()->url_); |
| - writer->WriteObjectImpl(ptr()->tokens_); |
| - |
| + // Write out all the non object fields. |
| writer->Write<int32_t>(ptr()->line_offset_); |
| writer->Write<int32_t>(ptr()->col_offset_); |
| writer->Write<int8_t>(ptr()->kind_); |
| + |
| + // Write out all the object pointer fields. |
| + SnapshotWriterVisitor visitor(writer); |
| + visitor.VisitPointers(from(), to_snapshot()); |
| } |
| @@ -1041,7 +1060,9 @@ RawLibrary* Library::ReadFrom(SnapshotReader* reader, |
| // allocations may happen. |
| intptr_t num_flds = (library.raw()->to() - library.raw()->from()); |
| for (intptr_t i = 0; i <= num_flds; i++) { |
| - *(library.raw()->from() + i) = reader->ReadObjectRef(); |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + library.StorePointer((library.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| } |
| if (kind != Snapshot::kFull) { |
| library.Register(); |
| @@ -1124,7 +1145,9 @@ RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader, |
| // allocations may happen. |
| intptr_t num_flds = (prefix.raw()->to() - prefix.raw()->from()); |
| for (intptr_t i = 0; i <= num_flds; i++) { |
| - *(prefix.raw()->from() + i) = reader->ReadObjectRef(); |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + prefix.StorePointer((prefix.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| } |
| return prefix.raw(); |
| @@ -1179,7 +1202,9 @@ RawNamespace* Namespace::ReadFrom(SnapshotReader* reader, |
| // allocations may happen. |
| intptr_t num_flds = (ns.raw()->to() - ns.raw()->from()); |
| for (intptr_t i = 0; i <= num_flds; i++) { |
| - *(ns.raw()->from() + i) = reader->ReadObjectRef(); |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + ns.StorePointer((ns.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| } |
| return ns.raw(); |
| @@ -1577,8 +1602,11 @@ RawUnhandledException* UnhandledException::ReadFrom(SnapshotReader* reader, |
| // allocations may happen. |
| intptr_t num_flds = (result.raw()->to() - result.raw()->from()); |
| for (intptr_t i = 0; i <= num_flds; i++) { |
| - *(result.raw()->from() + i) = reader->ReadObjectRef(); |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + result.StorePointer((result.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| } |
| + |
| return result.raw(); |
| } |
| @@ -2665,19 +2693,15 @@ RawStacktrace* Stacktrace::ReadFrom(SnapshotReader* reader, |
| reader->NewStacktrace()); |
| reader->AddBackRef(object_id, &result, kIsDeserialized); |
|
siva
2014/10/13 23:28:17
I think we should retain the comment that there ar
rmacnak
2014/10/14 00:49:44
There is a non-object field: the expand_inlined bo
|
| - // There are no non object pointer fields. |
| - |
| - // Read all the object pointer fields. |
| - Array& array = Array::Handle(reader->isolate()); |
| - array ^= reader->ReadObjectRef(); |
| - result.set_code_array(array); |
| - array ^= reader->ReadObjectRef(); |
| - result.set_pc_offset_array(array); |
| - |
| - array ^= reader->ReadObjectRef(); |
| - result.set_catch_code_array(array); |
| - array ^= reader->ReadObjectRef(); |
| - result.set_catch_pc_offset_array(array); |
| + // Set all the object fields. |
| + // TODO(5411462): Need to assert No GC can happen here, even though |
| + // allocations may happen. |
| + intptr_t num_flds = (result.raw()->to() - result.raw()->from()); |
| + for (intptr_t i = 0; i <= num_flds; i++) { |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + result.StorePointer((result.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| + } |
| bool expand_inlined = reader->Read<bool>(); |
| result.set_expand_inlined(expand_inlined); |
| @@ -2790,10 +2814,15 @@ RawWeakProperty* WeakProperty::ReadFrom(SnapshotReader* reader, |
| weak_property.set_tags(tags); |
| // Set all the object fields. |
| - weak_property.StorePointer(&weak_property.raw_ptr()->key_, |
| - reader->ReadObjectRef()); |
| - weak_property.StorePointer(&weak_property.raw_ptr()->value_, |
| - reader->ReadObjectRef()); |
| + // TODO(5411462): Need to assert No GC can happen here, even though |
| + // allocations may happen. |
| + intptr_t num_flds = (weak_property.raw()->to() - |
| + weak_property.raw()->from()); |
| + for (intptr_t i = 0; i <= num_flds; i++) { |
| + (*reader->PassiveObjectHandle()) = reader->ReadObjectRef(); |
| + weak_property.StorePointer((weak_property.raw()->from() + i), |
| + reader->PassiveObjectHandle()->raw()); |
| + } |
| return weak_property.raw(); |
| } |
| @@ -2811,9 +2840,9 @@ void RawWeakProperty::WriteTo(SnapshotWriter* writer, |
| writer->WriteIndexedObject(kWeakPropertyCid); |
| writer->WriteTags(writer->GetObjectTags(this)); |
| - // Write out all the other fields. |
| - writer->Write<RawObject*>(ptr()->key_); |
| - writer->Write<RawObject*>(ptr()->value_); |
| + // Write out all the object pointer fields. |
| + SnapshotWriterVisitor visitor(writer); |
| + visitor.VisitPointers(from(), to()); |
| } |