[snapshot][cleanup] Simplify Deserializer::ReadObject()
Bug: v8:8794, v8:8562
Change-Id: I199b60150437c3a475a25c49c708058cd1371a1d
Reviewed-on: https://chromium-review.googlesource.com/c/1456038
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Reviewed-by: Jakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#59410}
diff --git a/src/snapshot/deserializer.cc b/src/snapshot/deserializer.cc
index 882a40b..f6bdc94 100644
--- a/src/snapshot/deserializer.cc
+++ b/src/snapshot/deserializer.cc
@@ -373,12 +373,7 @@
return obj;
}
-// This routine writes the new object into the pointer provided.
-// The reason for this strange interface is that otherwise the object is
-// written very late, which means the FreeSpace map is not set up by the
-// time we need to use it to mark the space at the end of a page free.
-void Deserializer::ReadObject(int space_number, UnalignedSlot write_back,
- HeapObjectReferenceType reference_type) {
+HeapObject Deserializer::ReadObject(int space_number) {
const int size = source_.GetInt() << kObjectAlignmentBits;
Address address =
@@ -394,10 +389,6 @@
obj = PostProcessNewObject(obj, space_number);
}
- MaybeObject write_back_obj = reference_type == HeapObjectReferenceType::STRONG
- ? HeapObjectReference::Strong(obj)
- : HeapObjectReference::Weak(obj);
- UnalignedCopy(write_back, write_back_obj);
#ifdef DEBUG
if (obj->IsCode()) {
DCHECK(space_number == CODE_SPACE || space_number == CODE_LO_SPACE);
@@ -405,6 +396,7 @@
DCHECK(space_number != CODE_SPACE && space_number != CODE_LO_SPACE);
}
#endif // DEBUG
+ return obj;
}
UnalignedSlot Deserializer::ReadRepeatedObject(UnalignedSlot current,
@@ -836,13 +828,17 @@
if (allocator()->GetAndClearNextReferenceIsWeak()) {
reference_type = HeapObjectReferenceType::WEAK;
}
- ReadObject(space_number, current, reference_type);
+ HeapObject heap_object = ReadObject(space_number);
+ HeapObjectReference heap_object_ref =
+ reference_type == HeapObjectReferenceType::STRONG
+ ? HeapObjectReference::Strong(heap_object)
+ : HeapObjectReference::Weak(heap_object);
+ UnalignedCopy(current, heap_object_ref);
emit_write_barrier = (space_number == NEW_SPACE);
} else {
Object new_object; /* May not be a real Object pointer. */
if (where == kNewObject) {
- ReadObject(space_number, UnalignedSlot(&new_object),
- HeapObjectReferenceType::STRONG);
+ new_object = ReadObject(space_number);
} else if (where == kBackref) {
emit_write_barrier = (space_number == NEW_SPACE);
new_object = GetBackReferencedObject(data & kSpaceMask);
diff --git a/src/snapshot/deserializer.h b/src/snapshot/deserializer.h
index c64c9ea..074f5a1 100644
--- a/src/snapshot/deserializer.h
+++ b/src/snapshot/deserializer.h
@@ -136,8 +136,7 @@
inline UnalignedSlot ReadExternalReferenceCase(
HowToCode how, UnalignedSlot current, Address current_object_address);
- void ReadObject(int space_number, UnalignedSlot write_back,
- HeapObjectReferenceType reference_type);
+ HeapObject ReadObject(int space_number);
UnalignedSlot ReadRepeatedObject(UnalignedSlot current, int repeat_count);