Index: src/snapshot/serializer.cc |
diff --git a/src/snapshot/serializer.cc b/src/snapshot/serializer.cc |
index a0f54806e78bff38b6815c30785fae0431f9c268..f6f2200775be526712a44cc762b88983bfb37a42 100644 |
--- a/src/snapshot/serializer.cc |
+++ b/src/snapshot/serializer.cc |
@@ -124,10 +124,9 @@ void Serializer::EncodeReservations( |
} |
#ifdef DEBUG |
-bool Serializer::BackReferenceIsAlreadyAllocated(BackReference reference) { |
- DCHECK(reference.is_valid()); |
- DCHECK(!reference.is_source()); |
- DCHECK(!reference.is_global_proxy()); |
+bool Serializer::BackReferenceIsAlreadyAllocated( |
+ SerializerReference reference) { |
+ DCHECK(reference.is_back_reference()); |
AllocationSpace space = reference.space(); |
int chunk_index = reference.chunk_index(); |
if (space == LO_SPACE) { |
@@ -163,25 +162,21 @@ bool Serializer::SerializeKnownObject(HeapObject* obj, HowToCode how_to_code, |
return true; |
} |
} |
- BackReference back_reference = back_reference_map_.Lookup(obj); |
- if (back_reference.is_valid()) { |
+ SerializerReference reference = reference_map_.Lookup(obj); |
+ if (reference.is_valid()) { |
// Encode the location of an already deserialized object in order to write |
// its location into a later object. We can encode the location as an |
// offset fromthe start of the deserialized objects or as an offset |
// backwards from thecurrent allocation pointer. |
- if (back_reference.is_source()) { |
+ if (reference.is_attached_reference()) { |
FlushSkip(skip); |
- if (FLAG_trace_serializer) PrintF(" Encoding source object\n"); |
- DCHECK(how_to_code == kPlain && where_to_point == kStartOfObject); |
- sink_->Put(kAttachedReference + kPlain + kStartOfObject, "Source"); |
- sink_->PutInt(kSourceObjectReference, "kSourceObjectReference"); |
- } else if (back_reference.is_global_proxy()) { |
- FlushSkip(skip); |
- if (FLAG_trace_serializer) PrintF(" Encoding global proxy\n"); |
- DCHECK(how_to_code == kPlain && where_to_point == kStartOfObject); |
- sink_->Put(kAttachedReference + kPlain + kStartOfObject, "Global Proxy"); |
- sink_->PutInt(kGlobalProxyReference, "kGlobalProxyReference"); |
+ if (FLAG_trace_serializer) { |
+ PrintF(" Encoding attached reference %d\n", |
+ reference.attached_reference_index()); |
+ } |
+ PutAttachedReference(reference, how_to_code, where_to_point); |
} else { |
+ DCHECK(reference.is_back_reference()); |
if (FLAG_trace_serializer) { |
PrintF(" Encoding back reference to: "); |
obj->ShortPrint(); |
@@ -189,7 +184,7 @@ bool Serializer::SerializeKnownObject(HeapObject* obj, HowToCode how_to_code, |
} |
PutAlignmentPrefix(obj); |
- AllocationSpace space = back_reference.space(); |
+ AllocationSpace space = reference.space(); |
if (skip == 0) { |
sink_->Put(kBackref + how_to_code + where_to_point + space, "BackRef"); |
} else { |
@@ -197,7 +192,7 @@ bool Serializer::SerializeKnownObject(HeapObject* obj, HowToCode how_to_code, |
"BackRefWithSkip"); |
sink_->PutInt(skip, "BackRefSkipDistance"); |
} |
- PutBackReference(obj, back_reference); |
+ PutBackReference(obj, reference); |
} |
return true; |
} |
@@ -236,12 +231,24 @@ void Serializer::PutSmi(Smi* smi) { |
for (int i = 0; i < kPointerSize; i++) sink_->Put(bytes[i], "Byte"); |
} |
-void Serializer::PutBackReference(HeapObject* object, BackReference reference) { |
+void Serializer::PutBackReference(HeapObject* object, |
+ SerializerReference reference) { |
DCHECK(BackReferenceIsAlreadyAllocated(reference)); |
- sink_->PutInt(reference.reference(), "BackRefValue"); |
+ sink_->PutInt(reference.back_reference(), "BackRefValue"); |
hot_objects_.Add(object); |
} |
+void Serializer::PutAttachedReference(SerializerReference reference, |
+ HowToCode how_to_code, |
+ WhereToPoint where_to_point) { |
+ DCHECK(reference.is_attached_reference()); |
+ DCHECK((how_to_code == kPlain && where_to_point == kStartOfObject) || |
+ (how_to_code == kPlain && where_to_point == kInnerPointer) || |
+ (how_to_code == kFromCode && where_to_point == kInnerPointer)); |
+ sink_->Put(kAttachedReference + how_to_code + where_to_point, "AttachedRef"); |
+ sink_->PutInt(reference.attached_reference_index(), "AttachedRefIndex"); |
+} |
+ |
int Serializer::PutAlignmentPrefix(HeapObject* object) { |
AllocationAlignment alignment = object->RequiredAlignment(); |
if (alignment != kWordAligned) { |
@@ -253,14 +260,14 @@ int Serializer::PutAlignmentPrefix(HeapObject* object) { |
return 0; |
} |
-BackReference Serializer::AllocateLargeObject(int size) { |
+SerializerReference Serializer::AllocateLargeObject(int size) { |
// Large objects are allocated one-by-one when deserializing. We do not |
// have to keep track of multiple chunks. |
large_objects_total_size_ += size; |
- return BackReference::LargeObjectReference(seen_large_objects_index_++); |
+ return SerializerReference::LargeObjectReference(seen_large_objects_index_++); |
} |
-BackReference Serializer::Allocate(AllocationSpace space, int size) { |
+SerializerReference Serializer::Allocate(AllocationSpace space, int size) { |
DCHECK(space >= 0 && space < kNumberOfPreallocatedSpaces); |
DCHECK(size > 0 && size <= static_cast<int>(max_chunk_size(space))); |
uint32_t new_chunk_size = pending_chunk_[space] + size; |
@@ -270,14 +277,13 @@ BackReference Serializer::Allocate(AllocationSpace space, int size) { |
sink_->Put(kNextChunk, "NextChunk"); |
sink_->Put(space, "NextChunkSpace"); |
completed_chunks_[space].Add(pending_chunk_[space]); |
- DCHECK_LE(completed_chunks_[space].length(), BackReference::kMaxChunkIndex); |
pending_chunk_[space] = 0; |
new_chunk_size = size; |
} |
uint32_t offset = pending_chunk_[space]; |
pending_chunk_[space] = new_chunk_size; |
- return BackReference::Reference(space, completed_chunks_[space].length(), |
- offset); |
+ return SerializerReference::BackReference( |
+ space, completed_chunks_[space].length(), offset); |
} |
void Serializer::Pad() { |
@@ -320,7 +326,7 @@ void Serializer::ObjectSerializer::SerializePrologue(AllocationSpace space, |
CodeNameEvent(object_->address(), sink_->Position(), code_name)); |
} |
- BackReference back_reference; |
+ SerializerReference back_reference; |
if (space == LO_SPACE) { |
sink_->Put(kNewObject + reference_representation_ + space, |
"NewLargeObject"); |
@@ -345,7 +351,7 @@ void Serializer::ObjectSerializer::SerializePrologue(AllocationSpace space, |
#endif // OBJECT_PRINT |
// Mark this object as already serialized. |
- serializer_->back_reference_map()->Add(object_, back_reference); |
+ serializer_->reference_map()->Add(object_, back_reference); |
// Serialize the map (first word of the object). |
serializer_->SerializeObject(map, kPlain, kStartOfObject, 0); |
@@ -513,15 +519,17 @@ void Serializer::ObjectSerializer::SerializeDeferred() { |
int size = object_->Size(); |
Map* map = object_->map(); |
- BackReference reference = serializer_->back_reference_map()->Lookup(object_); |
+ SerializerReference back_reference = |
+ serializer_->reference_map()->Lookup(object_); |
+ DCHECK(back_reference.is_back_reference()); |
// Serialize the rest of the object. |
CHECK_EQ(0, bytes_processed_so_far_); |
bytes_processed_so_far_ = kPointerSize; |
serializer_->PutAlignmentPrefix(object_); |
- sink_->Put(kNewObject + reference.space(), "deferred object"); |
- serializer_->PutBackReference(object_, reference); |
+ sink_->Put(kNewObject + back_reference.space(), "deferred object"); |
+ serializer_->PutBackReference(object_, back_reference); |
sink_->PutInt(size >> kPointerSizeLog2, "deferred object size"); |
UnlinkWeakNextScope unlink_weak_next(object_); |