| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index 5bb64101544ef6d29f9e813eda05748259bc048a..34f5b8bba18c8516e08fd7191a1ab4e883601ef0 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -1486,10 +1486,10 @@ class ScavengingVisitor : public StaticVisitorBase {
|
| // Helper function used by CopyObject to copy a source object to an
|
| // allocated target object and update the forwarding pointer in the source
|
| // object. Returns the target object.
|
| - INLINE(static HeapObject* MigrateObject(Heap* heap,
|
| - HeapObject* source,
|
| - HeapObject* target,
|
| - int size)) {
|
| + INLINE(static void MigrateObject(Heap* heap,
|
| + HeapObject* source,
|
| + HeapObject* target,
|
| + int size)) {
|
| // Copy the content of source to target.
|
| heap->CopyBlock(target->address(), source->address(), size);
|
|
|
| @@ -1515,8 +1515,6 @@ class ScavengingVisitor : public StaticVisitorBase {
|
| MemoryChunk::IncrementLiveBytes(target->address(), size);
|
| }
|
| }
|
| -
|
| - return target;
|
| }
|
|
|
| template<ObjectContents object_contents, SizeRestriction size_restriction>
|
| @@ -1547,7 +1545,12 @@ class ScavengingVisitor : public StaticVisitorBase {
|
| Object* result = NULL; // Initialization to please compiler.
|
| if (maybe_result->ToObject(&result)) {
|
| HeapObject* target = HeapObject::cast(result);
|
| - *slot = MigrateObject(heap, object , target, object_size);
|
| +
|
| + // Order is important: slot might be inside of the target if target
|
| + // was allocated over a dead object and slot comes from the store
|
| + // buffer.
|
| + *slot = target;
|
| + MigrateObject(heap, object, target, object_size);
|
|
|
| if (object_contents == POINTER_OBJECT) {
|
| heap->promotion_queue()->insert(target, object_size);
|
| @@ -1560,8 +1563,13 @@ class ScavengingVisitor : public StaticVisitorBase {
|
| MaybeObject* allocation = heap->new_space()->AllocateRaw(object_size);
|
| heap->promotion_queue()->SetNewLimit(heap->new_space()->top());
|
| Object* result = allocation->ToObjectUnchecked();
|
| + HeapObject* target = HeapObject::cast(result);
|
|
|
| - *slot = MigrateObject(heap, object, HeapObject::cast(result), object_size);
|
| + // Order is important: slot might be inside of the target if target
|
| + // was allocated over a dead object and slot comes from the store
|
| + // buffer.
|
| + *slot = target;
|
| + MigrateObject(heap, object, target, object_size);
|
| return;
|
| }
|
|
|
|
|