| Index: src/serialize.cc
|
| diff --git a/src/serialize.cc b/src/serialize.cc
|
| index 673c01f56799d997aa9e67d48afd3a318fb7b5a7..9da3adae2dd5e1532f2127a9eae56456d3f8ce50 100644
|
| --- a/src/serialize.cc
|
| +++ b/src/serialize.cc
|
| @@ -828,11 +828,12 @@ HeapObject* Deserializer::ProcessNewObjectFromSerializedCode(HeapObject* obj) {
|
|
|
| HeapObject* Deserializer::GetBackReferencedObject(int space) {
|
| HeapObject* obj;
|
| + BackReference back_reference(source_.GetInt());
|
| if (space == LO_SPACE) {
|
| - uint32_t index = source_.GetInt();
|
| + CHECK(back_reference.chunk_index() == 0);
|
| + uint32_t index = back_reference.large_object_index();
|
| obj = deserialized_large_objects_[index];
|
| } else {
|
| - BackReference back_reference(source_.GetInt());
|
| DCHECK(space < kNumberOfPreallocatedSpaces);
|
| uint32_t chunk_index = back_reference.chunk_index();
|
| DCHECK_LE(chunk_index, current_chunk_[space]);
|
| @@ -1315,7 +1316,7 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| CHECK_EQ(reservation[chunk_index].end, high_water_[space]);
|
| // Move to next reserved chunk.
|
| chunk_index = ++current_chunk_[space];
|
| - DCHECK_LT(chunk_index, reservation.length());
|
| + CHECK_LT(chunk_index, reservation.length());
|
| high_water_[space] = reservation[chunk_index].start;
|
| break;
|
| }
|
| @@ -1345,14 +1346,14 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| case kSynchronize: {
|
| // If we get here then that indicates that you have a mismatch between
|
| // the number of GC roots when serializing and deserializing.
|
| - UNREACHABLE();
|
| + CHECK(false);
|
| }
|
|
|
| default:
|
| - UNREACHABLE();
|
| + CHECK(false);
|
| }
|
| }
|
| - DCHECK_EQ(limit, current);
|
| + CHECK_EQ(limit, current);
|
| }
|
|
|
|
|
| @@ -1448,6 +1449,7 @@ void PartialSerializer::SerializeOutdatedContextsAsFixedArray() {
|
| }
|
| for (int i = 0; i < length; i++) {
|
| BackReference back_ref = outdated_contexts_[i];
|
| + DCHECK(BackReferenceIsAlreadyAllocated(back_ref));
|
| sink_->Put(kBackref + back_ref.space(), "BackRef");
|
| sink_->PutInt(back_ref.reference(), "BackRefValue");
|
| }
|
| @@ -1546,6 +1548,26 @@ int PartialSerializer::PartialSnapshotCacheIndex(HeapObject* heap_object) {
|
| }
|
|
|
|
|
| +#ifdef DEBUG
|
| +bool Serializer::BackReferenceIsAlreadyAllocated(BackReference reference) {
|
| + DCHECK(reference.is_valid());
|
| + DCHECK(!reference.is_source());
|
| + DCHECK(!reference.is_global_proxy());
|
| + AllocationSpace space = reference.space();
|
| + int chunk_index = reference.chunk_index();
|
| + if (space == LO_SPACE) {
|
| + return chunk_index == 0 &&
|
| + reference.large_object_index() < seen_large_objects_index_;
|
| + } else if (chunk_index == completed_chunks_[space].length()) {
|
| + return reference.chunk_offset() < pending_chunk_[space];
|
| + } else {
|
| + return chunk_index < completed_chunks_[space].length() &&
|
| + reference.chunk_offset() < completed_chunks_[space][chunk_index];
|
| + }
|
| +}
|
| +#endif // DEBUG
|
| +
|
| +
|
| bool Serializer::SerializeKnownObject(HeapObject* obj, HowToCode how_to_code,
|
| WhereToPoint where_to_point, int skip) {
|
| if (how_to_code == kPlain && where_to_point == kStartOfObject) {
|
| @@ -1600,6 +1622,7 @@ bool Serializer::SerializeKnownObject(HeapObject* obj, HowToCode how_to_code,
|
| "BackRefWithSkip");
|
| sink_->PutInt(skip, "BackRefSkipDistance");
|
| }
|
| + DCHECK(BackReferenceIsAlreadyAllocated(back_reference));
|
| sink_->PutInt(back_reference.reference(), "BackRefValue");
|
|
|
| hot_objects_.Add(obj);
|
|
|