Chromium Code Reviews| Index: src/serialize.cc |
| =================================================================== |
| --- src/serialize.cc (revision 9763) |
| +++ src/serialize.cc (working copy) |
| @@ -759,10 +759,6 @@ |
| int source_space, |
| Address current_object_address) { |
| Isolate* const isolate = isolate_; |
| - bool write_barrier_needed = (current_object_address != NULL && |
| - source_space != NEW_SPACE && |
| - source_space != CELL_SPACE && |
| - source_space == OLD_DATA_SPACE); |
|
Lasse Reichstein
2011/10/25 08:40:34
Should the last one have been != ?
|
| while (current < limit) { |
| int data = source_->Get(); |
| switch (data) { |
| @@ -782,18 +778,28 @@ |
| if (where == kNewObject && how == kPlain && within == kStartOfObject) {\ |
| ASSIGN_DEST_SPACE(space_number) \ |
| ReadObject(space_number, dest_space, current); \ |
| - emit_write_barrier = (space_number == NEW_SPACE); \ |
| + emit_write_barrier = (space_number == NEW_SPACE && \ |
| + source_space != NEW_SPACE && \ |
| + source_space != CELL_SPACE); \ |
| } else { \ |
| Object* new_object = NULL; /* May not be a real Object pointer. */ \ |
| if (where == kNewObject) { \ |
| ASSIGN_DEST_SPACE(space_number) \ |
| ReadObject(space_number, dest_space, &new_object); \ |
| } else if (where == kRootArray) { \ |
| - emit_write_barrier = true; \ |
| + 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) { \ |
| - emit_write_barrier = true; \ |
| + 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]; \ |
| @@ -803,12 +809,16 @@ |
| Decode(reference_id); \ |
| new_object = reinterpret_cast<Object*>(address); \ |
| } else if (where == kBackref) { \ |
| - emit_write_barrier = (space_number == NEW_SPACE); \ |
| + emit_write_barrier = (space_number == NEW_SPACE && \ |
| + source_space != NEW_SPACE && \ |
| + source_space != CELL_SPACE); \ |
| new_object = GetAddressFromEnd(data & kSpaceMask); \ |
| } else { \ |
| ASSERT(where == kFromStart); \ |
| if (offset_from_start == kUnknownOffsetFromStart) { \ |
| - emit_write_barrier = (space_number == NEW_SPACE); \ |
| + emit_write_barrier = (space_number == NEW_SPACE && \ |
| + source_space != NEW_SPACE && \ |
| + source_space != CELL_SPACE); \ |
| new_object = GetAddressFromStart(data & kSpaceMask); \ |
| } else { \ |
| Address object_address = pages_[space_number][0] + \ |
| @@ -835,14 +845,14 @@ |
| *current = new_object; \ |
| } \ |
| } \ |
| - if (emit_write_barrier && write_barrier_needed) { \ |
| + if (emit_write_barrier && current_object_address != NULL) { \ |
| Address current_address = reinterpret_cast<Address>(current); \ |
| isolate->heap()->RecordWrite( \ |
| current_object_address, \ |
| static_cast<int>(current_address - current_object_address)); \ |
| } \ |
| if (!current_was_incremented) { \ |
| - current++; \ |
| + current++; /* Increment current if it wasn't done above. */ \ |
| } \ |
| break; \ |
| } \ |