Index: runtime/vm/raw_object_snapshot.cc |
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc |
index 1a617bacaf32013d55ff7e5bf5a5f43760b43420..cfa19c47beed844fcba28efd133cf85644cbe87a 100644 |
--- a/runtime/vm/raw_object_snapshot.cc |
+++ b/runtime/vm/raw_object_snapshot.cc |
@@ -1477,7 +1477,11 @@ RawInstructions* Instructions::ReadFrom(SnapshotReader* reader, |
ASSERT(reader->snapshot_code()); |
ASSERT(kind == Snapshot::kFull); |
+#ifdef DEBUG |
intptr_t full_tags = static_cast<uword>(reader->Read<intptr_t>()); |
+#else |
+ intptr_t full_tags = 0; // unused in release mode |
+#endif |
intptr_t offset = reader->Read<int32_t>(); |
Instructions& result = |
Instructions::ZoneHandle(reader->zone(), |
@@ -1499,6 +1503,7 @@ void RawInstructions::WriteTo(SnapshotWriter* writer, |
writer->WriteVMIsolateObject(kInstructionsCid); |
writer->WriteTags(writer->GetObjectTags(this)); |
+#ifdef DEBUG |
// Instructions will be written pre-marked and in the VM heap. Write out |
// the tags we expect to find when reading the snapshot for a sanity check |
// that our offsets/alignment didn't get out of sync. |
@@ -1506,6 +1511,7 @@ void RawInstructions::WriteTo(SnapshotWriter* writer, |
written_tags = RawObject::VMHeapObjectTag::update(true, written_tags); |
written_tags = RawObject::MarkBit::update(true, written_tags); |
writer->Write<intptr_t>(written_tags); |
+#endif |
writer->Write<int32_t>(writer->GetInstructionsId(this)); |
} |
@@ -1643,19 +1649,11 @@ RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader, |
ASSERT(reader->snapshot_code()); |
ASSERT(kind == Snapshot::kFull); |
- const int32_t length = reader->Read<int32_t>(); |
- PcDescriptors& result = |
- PcDescriptors::ZoneHandle(reader->zone(), |
- NEW_OBJECT_WITH_LEN(PcDescriptors, length)); |
+ intptr_t offset = reader->Read<int32_t>(); |
+ PcDescriptors& result = PcDescriptors::ZoneHandle(reader->zone()); |
+ result ^= reader->GetObjectAt(offset); |
reader->AddBackRef(object_id, &result, kIsDeserialized); |
- if (result.Length() > 0) { |
- NoSafepointScope no_safepoint; |
- intptr_t len = result.Length(); |
- uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); |
- reader->ReadBytes(data, len); |
- } |
- |
return result.raw(); |
} |
@@ -1671,12 +1669,8 @@ void RawPcDescriptors::WriteTo(SnapshotWriter* writer, |
writer->WriteInlinedObjectHeader(object_id); |
writer->WriteIndexedObject(kPcDescriptorsCid); |
writer->WriteTags(writer->GetObjectTags(this)); |
- writer->Write<int32_t>(ptr()->length_); |
- if (ptr()->length_ > 0) { |
- intptr_t len = ptr()->length_; |
- uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); |
- writer->WriteBytes(data, len); |
- } |
+ |
+ writer->Write<int32_t>(writer->GetObjectId(this)); |
} |
@@ -1733,22 +1727,11 @@ RawStackmap* Stackmap::ReadFrom(SnapshotReader* reader, |
ASSERT(reader->snapshot_code()); |
ASSERT(kind == Snapshot::kFull); |
- const int32_t length = reader->Read<int32_t>(); |
- Stackmap& result = |
- Stackmap::ZoneHandle(reader->zone(), |
- reader->NewStackmap(length)); |
+ intptr_t offset = reader->Read<int32_t>(); |
+ Stackmap& result = Stackmap::ZoneHandle(reader->zone()); |
+ result ^= reader->GetObjectAt(offset); |
reader->AddBackRef(object_id, &result, kIsDeserialized); |
- result.SetRegisterBitCount(reader->Read<int32_t>()); |
- result.SetPcOffset(reader->Read<uint32_t>()); |
- |
- if (length > 0) { |
- NoSafepointScope no_safepoint; |
- intptr_t len = (result.Length() + 7) / 8; |
- uint8_t* data = result.UnsafeMutableNonPointer(result.raw_ptr()->data()); |
- reader->ReadBytes(data, len); |
- } |
- |
return result.raw(); |
} |
@@ -1765,14 +1748,7 @@ void RawStackmap::WriteTo(SnapshotWriter* writer, |
writer->WriteIndexedObject(kStackmapCid); |
writer->WriteTags(writer->GetObjectTags(this)); |
- writer->Write<int32_t>(ptr()->length_); |
- writer->Write<int32_t>(ptr()->register_bit_count_); |
- writer->Write<uint32_t>(ptr()->pc_offset_); |
- if (ptr()->length_ > 0) { |
- intptr_t len = (ptr()->length_ + 7) / 8; |
- uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data()); |
- writer->WriteBytes(data, len); |
- } |
+ writer->Write<int32_t>(writer->GetObjectId(this)); |
} |
@@ -2572,6 +2548,14 @@ RawOneByteString* OneByteString::ReadFrom(SnapshotReader* reader, |
intptr_t tags, |
Snapshot::Kind kind, |
bool as_reference) { |
+ if (reader->snapshot_code()) { |
+ ASSERT(kind == Snapshot::kFull); |
+ intptr_t offset = reader->Read<int32_t>(); |
+ String& result = String::ZoneHandle(reader->zone()); |
+ result ^= reader->GetObjectAt(offset); |
+ reader->AddBackRef(object_id, &result, kIsDeserialized); |
+ return raw(result); |
+ } |
// Read the length so that we can determine instance size to allocate. |
ASSERT(reader != NULL); |
intptr_t len = reader->ReadSmiValue(); |
@@ -2679,6 +2663,22 @@ void RawOneByteString::WriteTo(SnapshotWriter* writer, |
intptr_t object_id, |
Snapshot::Kind kind, |
bool as_reference) { |
+ if (writer->snapshot_code()) { |
+ ASSERT(writer->snapshot_code()); |
+ ASSERT(kind == Snapshot::kFull); |
+ // Assert that hash is computed. |
+ if (ptr()->hash_ == NULL) { |
+ ptr()->hash_ = Smi::New(String::Hash(ptr()->data(), |
+ Smi::Value(ptr()->length_))); |
+ } |
+ ASSERT(ptr()->hash_ != NULL); |
+ // Write out the serialization header value for this object. |
+ writer->WriteInlinedObjectHeader(object_id); |
+ writer->WriteIndexedObject(kOneByteStringCid); |
+ writer->WriteTags(writer->GetObjectTags(this)); |
+ writer->Write<int32_t>(writer->GetObjectId(this)); |
+ return; |
+ } |
StringWriteTo(writer, |
object_id, |
kind, |