Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(580)

Unified Diff: runtime/vm/snapshot.cc

Issue 2965723002: VM: Reland Inline instance object hash code into object header on 64bit. (Closed)
Patch Set: Fix snapshot incompatibility that sank Flutter Gallery Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/snapshot.cc
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 6247013dc9a981f0aaa44d6fe2d48ae127a70d6b..f54a84c58a77dea8cb372eb5a0375ae106bff456 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -759,6 +759,9 @@ void ImageWriter::WriteROData(WriteStream* stream) {
uword marked_tags = obj.raw()->ptr()->tags_;
marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
marked_tags = RawObject::MarkBit::update(true, marked_tags);
+#if defined(HASH_IN_OBJECT_HEADER)
+ marked_tags |= static_cast<uword>(obj.raw()->ptr()->hash_) << 32;
+#endif
stream->WriteWord(marked_tags);
start += sizeof(uword);
for (uword* cursor = reinterpret_cast<uword*>(start);
@@ -845,6 +848,11 @@ void AssemblyImageWriter::WriteText(WriteStream* clustered_stream, bool vm) {
uword marked_tags = insns.raw_ptr()->tags_;
marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
marked_tags = RawObject::MarkBit::update(true, marked_tags);
+#if defined(HASH_IN_OBJECT_HEADER)
+ // Can't use GetObjectTagsAndHash because the update methods discard the
+ // high bits.
+ marked_tags |= static_cast<uword>(insns.raw_ptr()->hash_) << 32;
+#endif
WriteWordLiteralText(marked_tags);
beginning += sizeof(uword);
@@ -1035,6 +1043,11 @@ void BlobImageWriter::WriteText(WriteStream* clustered_stream, bool vm) {
uword marked_tags = insns.raw_ptr()->tags_;
marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
marked_tags = RawObject::MarkBit::update(true, marked_tags);
+#if defined(HASH_IN_OBJECT_HEADER)
+ // Can't use GetObjectTagsAndHash because the update methods discard the
+ // high bits.
+ marked_tags |= static_cast<uword>(insns.raw_ptr()->hash_) << 32;
+#endif
instructions_blob_stream_.WriteWord(marked_tags);
beginning += sizeof(uword);
@@ -1339,11 +1352,20 @@ void SnapshotWriter::WriteObject(RawObject* rawobj) {
}
-uword SnapshotWriter::GetObjectTags(RawObject* raw) {
+uint32_t SnapshotWriter::GetObjectTags(RawObject* raw) {
return raw->ptr()->tags_;
}
+uword SnapshotWriter::GetObjectTagsAndHash(RawObject* raw) {
+ uword result = raw->ptr()->tags_;
+#if defined(HASH_IN_OBJECT_HEADER)
+ result |= static_cast<uword>(raw->ptr()->hash_) << 32;
+#endif
+ return result;
+}
+
+
#define VM_OBJECT_CLASS_LIST(V) \
V(OneByteString) \
V(TwoByteString) \
@@ -1567,7 +1589,7 @@ void SnapshotWriter::WriteObjectImpl(RawObject* raw, bool as_reference) {
// When we know that we are dealing with leaf or shallow objects we write
// these objects inline even when 'as_reference' is true.
const bool write_as_reference = as_reference && !raw->IsCanonical();
- intptr_t tags = raw->ptr()->tags_;
+ uintptr_t tags = GetObjectTagsAndHash(raw);
// Add object to the forward ref list and mark it so that future references
// to this object in the snapshot will use this object id. Mark the
@@ -1644,7 +1666,7 @@ class WriteInlinedObjectVisitor : public ObjectVisitor {
virtual void VisitObject(RawObject* obj) {
intptr_t object_id = writer_->forward_list_->FindObject(obj);
ASSERT(object_id != kInvalidIndex);
- intptr_t tags = writer_->GetObjectTags(obj);
+ intptr_t tags = MessageWriter::GetObjectTagsAndHash(obj);
writer_->WriteMarkedObjectImpl(obj, tags, object_id, kAsInlinedObject);
}
@@ -1809,7 +1831,7 @@ RawFunction* SnapshotWriter::IsSerializableClosure(RawClosure* closure) {
RawClass* SnapshotWriter::GetFunctionOwner(RawFunction* func) {
RawObject* owner = func->ptr()->owner_;
- uword tags = GetObjectTags(owner);
+ uint32_t tags = GetObjectTags(owner);
intptr_t class_id = RawObject::ClassIdTag::decode(tags);
if (class_id == kClassCid) {
return reinterpret_cast<RawClass*>(owner);

Powered by Google App Engine
This is Rietveld 408576698