Index: src/serialize.cc |
=================================================================== |
--- src/serialize.cc (revision 9722) |
+++ src/serialize.cc (working copy) |
@@ -783,9 +783,19 @@ |
ASSIGN_DEST_SPACE(space_number) \ |
ReadObject(space_number, dest_space, &new_object); \ |
} else if (where == kRootArray) { \ |
+ if (source_space != CELL_SPACE && \ |
+ source_space != CODE_SPACE && \ |
+ source_space != OLD_DATA_SPACE) { \ |
+ emit_write_barrier = true; \ |
+ } \ |
int root_id = source_->GetInt(); \ |
new_object = isolate->heap()->roots_array_start()[root_id]; \ |
} else if (where == kPartialSnapshotCache) { \ |
+ if (source_space != CELL_SPACE && \ |
+ source_space != CODE_SPACE && \ |
+ source_space != OLD_DATA_SPACE) { \ |
+ emit_write_barrier = true; \ |
+ } \ |
int cache_index = source_->GetInt(); \ |
new_object = isolate->serialize_partial_snapshot_cache() \ |
[cache_index]; \ |
@@ -920,24 +930,30 @@ |
SIXTEEN_CASES(kRootArrayLowConstants) |
SIXTEEN_CASES(kRootArrayHighConstants) { |
int root_id = RootArrayConstantFromByteCode(data); |
- *current++ = isolate->heap()->roots_array_start()[root_id]; |
+ Object* object = isolate->heap()->roots_array_start()[root_id]; |
+ ASSERT(!isolate->heap()->InNewSpace(object)); |
+ *current++ = object; |
break; |
} |
case kRepeat: { |
int repeats = source_->GetInt(); |
Object* object = current[-1]; |
+ ASSERT(!isolate->heap()->InNewSpace(object)); |
for (int i = 0; i < repeats; i++) current[i] = object; |
current += repeats; |
break; |
} |
+ STATIC_ASSERT(kRootArrayNumberOfConstantEncodings == |
+ Heap::kOldSpaceRoots); |
STATIC_ASSERT(kMaxRepeats == 12); |
FOUR_CASES(kConstantRepeat) |
FOUR_CASES(kConstantRepeat + 4) |
FOUR_CASES(kConstantRepeat + 8) { |
int repeats = RepeatsForCode(data); |
Object* object = current[-1]; |
+ ASSERT(!isolate->heap()->InNewSpace(object)); |
for (int i = 0; i < repeats; i++) current[i] = object; |
current += repeats; |
break; |
@@ -1425,11 +1441,18 @@ |
if (current < end) OutputRawData(reinterpret_cast<Address>(current)); |
while (current < end && !(*current)->IsSmi()) { |
+ HeapObject* current_contents = HeapObject::cast(*current); |
+ int root_index = serializer_->RootIndex(current_contents); |
+ // Repeats are not subject to the write barrier so there are only some |
+ // objects that can be used in a repeat encoding. These are the early |
+ // ones in the root array that are never in new space. |
if (current != start && |
- current[0] == current[-1] && |
- !HEAP->InNewSpace(*current)) { |
+ root_index != kInvalidRootIndex && |
+ root_index < kRootArrayNumberOfConstantEncodings && |
+ current_contents == current[-1]) { |
+ ASSERT(!HEAP->InNewSpace(current_contents)); |
int repeat_count = 1; |
- while (current < end - 1 && current[repeat_count] == current[0]) { |
+ while (current < end - 1 && current[repeat_count] == current_contents) { |
repeat_count++; |
} |
current += repeat_count; |
@@ -1441,7 +1464,7 @@ |
sink_->Put(CodeForRepeats(repeat_count), "SerializeRepeats"); |
} |
} else { |
- serializer_->SerializeObject(*current, kPlain, kStartOfObject); |
+ serializer_->SerializeObject(current_contents, kPlain, kStartOfObject); |
bytes_processed_so_far_ += kPointerSize; |
current++; |
} |