| Index: src/serialize.cc
|
| diff --git a/src/serialize.cc b/src/serialize.cc
|
| index 01c55a1226efedc5cca0d8bc1f80ad99dede6ba4..86348aefee917c2c921fb806bf2d8df2f599e024 100644
|
| --- a/src/serialize.cc
|
| +++ b/src/serialize.cc
|
| @@ -614,7 +614,9 @@ void Deserializer::DecodeReservation(
|
| DCHECK_EQ(0, reservations_[NEW_SPACE].length());
|
| STATIC_ASSERT(NEW_SPACE == 0);
|
| int current_space = NEW_SPACE;
|
| - for (const auto& r : res) {
|
| + for (int i = 0; i < res.length(); i++) {
|
| + SerializedData::Reservation r(0);
|
| + memcpy(&r, res.start() + i, sizeof(r));
|
| reservations_[current_space].Add({r.chunk_size(), NULL, NULL});
|
| if (r.is_last()) current_space++;
|
| }
|
| @@ -860,7 +862,8 @@ void Deserializer::ReadObject(int space_number, Object** write_back) {
|
| // Fix up strings from serialized user code.
|
| if (deserializing_user_code()) obj = ProcessNewObjectFromSerializedCode(obj);
|
|
|
| - *write_back = obj;
|
| + Object* write_back_obj = obj;
|
| + UnalignedCopy(write_back, &write_back_obj);
|
| #ifdef DEBUG
|
| if (obj->IsCode()) {
|
| DCHECK(space_number == CODE_SPACE || space_number == LO_SPACE);
|
| @@ -1003,7 +1006,7 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| current = reinterpret_cast<Object**>(location_of_branch_data); \
|
| current_was_incremented = true; \
|
| } else { \
|
| - *current = new_object; \
|
| + UnalignedCopy(current, &new_object); \
|
| } \
|
| } \
|
| if (emit_write_barrier && write_barrier_needed) { \
|
| @@ -1104,7 +1107,7 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| int root_id = RootArrayConstantFromByteCode(data);
|
| Object* object = isolate->heap()->roots_array_start()[root_id];
|
| DCHECK(!isolate->heap()->InNewSpace(object));
|
| - *current++ = object;
|
| + UnalignedCopy(current++, &object);
|
| break;
|
| }
|
|
|
| @@ -1116,7 +1119,7 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| reinterpret_cast<intptr_t>(current) + skip);
|
| Object* object = isolate->heap()->roots_array_start()[root_id];
|
| DCHECK(!isolate->heap()->InNewSpace(object));
|
| - *current++ = object;
|
| + UnalignedCopy(current++, &object);
|
| break;
|
| }
|
|
|
| @@ -1124,8 +1127,7 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| int repeats = source_.GetInt();
|
| Object* object = current[-1];
|
| DCHECK(!isolate->heap()->InNewSpace(object));
|
| - for (int i = 0; i < repeats; i++) current[i] = object;
|
| - current += repeats;
|
| + for (int i = 0; i < repeats; i++) UnalignedCopy(current++, &object);
|
| break;
|
| }
|
|
|
| @@ -1139,10 +1141,10 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| case kFixedRepeat + 13:
|
| case kFixedRepeat + 14: {
|
| int repeats = RepeatsForCode(data);
|
| - Object* object = current[-1];
|
| + Object* object;
|
| + UnalignedCopy(&object, current - 1);
|
| DCHECK(!isolate->heap()->InNewSpace(object));
|
| - for (int i = 0; i < repeats; i++) current[i] = object;
|
| - current += repeats;
|
| + for (int i = 0; i < repeats; i++) UnalignedCopy(current++, &object);
|
| break;
|
| }
|
|
|
| @@ -1254,7 +1256,8 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| new NativesExternalStringResource(isolate->bootstrapper(),
|
| source_vector.start(),
|
| source_vector.length());
|
| - *current++ = reinterpret_cast<Object*>(resource);
|
| + Object* resource_obj = reinterpret_cast<Object*>(resource);
|
| + UnalignedCopy(current++, &resource_obj);
|
| break;
|
| }
|
|
|
| @@ -1282,8 +1285,9 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space,
|
| FOUR_CASES(kHotObject)
|
| FOUR_CASES(kHotObject + 4) {
|
| int index = data & kHotObjectIndexMask;
|
| - *current = hot_objects_.Get(index);
|
| - if (write_barrier_needed && isolate->heap()->InNewSpace(*current)) {
|
| + Object* hot_object = hot_objects_.Get(index);
|
| + UnalignedCopy(current, &hot_object);
|
| + if (write_barrier_needed && isolate->heap()->InNewSpace(hot_object)) {
|
| Address current_address = reinterpret_cast<Address>(current);
|
| isolate->heap()->RecordWrite(
|
| current_object_address,
|
|
|