| Index: src/serialize.cc
|
| ===================================================================
|
| --- src/serialize.cc (revision 9758)
|
| +++ src/serialize.cc (working copy)
|
| @@ -759,6 +759,10 @@
|
| 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);
|
| while (current < limit) {
|
| int data = source_->Get();
|
| switch (data) {
|
| @@ -778,28 +782,18 @@
|
| 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 && \
|
| - source_space != NEW_SPACE && \
|
| - source_space != CELL_SPACE); \
|
| + emit_write_barrier = (space_number == NEW_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) { \
|
| - if (source_space != CELL_SPACE && \
|
| - source_space != CODE_SPACE && \
|
| - source_space != OLD_DATA_SPACE) { \
|
| - emit_write_barrier = true; \
|
| - } \
|
| + 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; \
|
| - } \
|
| + emit_write_barrier = true; \
|
| int cache_index = source_->GetInt(); \
|
| new_object = isolate->serialize_partial_snapshot_cache() \
|
| [cache_index]; \
|
| @@ -809,16 +803,12 @@
|
| Decode(reference_id); \
|
| new_object = reinterpret_cast<Object*>(address); \
|
| } else if (where == kBackref) { \
|
| - emit_write_barrier = (space_number == NEW_SPACE && \
|
| - source_space != NEW_SPACE && \
|
| - source_space != CELL_SPACE); \
|
| + emit_write_barrier = (space_number == NEW_SPACE); \
|
| new_object = GetAddressFromEnd(data & kSpaceMask); \
|
| } else { \
|
| ASSERT(where == kFromStart); \
|
| if (offset_from_start == kUnknownOffsetFromStart) { \
|
| - emit_write_barrier = (space_number == NEW_SPACE && \
|
| - source_space != NEW_SPACE && \
|
| - source_space != CELL_SPACE); \
|
| + emit_write_barrier = (space_number == NEW_SPACE); \
|
| new_object = GetAddressFromStart(data & kSpaceMask); \
|
| } else { \
|
| Address object_address = pages_[space_number][0] + \
|
| @@ -845,14 +835,14 @@
|
| *current = new_object; \
|
| } \
|
| } \
|
| - if (emit_write_barrier && current_object_address != NULL) { \
|
| + if (emit_write_barrier && write_barrier_needed) { \
|
| 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++; /* Increment current if it wasn't done above. */ \
|
| + current++; \
|
| } \
|
| break; \
|
| } \
|
|
|