Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index 78bafce3d6fc52d9c871eb2286df5e6970ed74f6..efe7375c8297180e15caeaccc8ce779a4efdcd72 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -3632,34 +3632,36 @@ class PointerUpdateJobTraits { |
static SlotCallbackResult CheckAndUpdateOldToNewSlot(Heap* heap, |
Address slot_address) { |
- Object** slot = reinterpret_cast<Object**>(slot_address); |
- if (heap->InFromSpace(*slot)) { |
- HeapObject* heap_object = reinterpret_cast<HeapObject*>(*slot); |
+ base::NoBarrierAtomicValue<Object*>* slot = |
+ base::NoBarrierAtomicValue<Object*>::FromAddress(slot_address); |
+ Object* slot_reference = slot->Value(); |
+ if (heap->InFromSpace(slot_reference)) { |
+ HeapObject* heap_object = reinterpret_cast<HeapObject*>(slot_reference); |
DCHECK(heap_object->IsHeapObject()); |
MapWord map_word = heap_object->map_word(); |
// There could still be stale pointers in large object space, map space, |
// and old space for pages that have been promoted. |
if (map_word.IsForwardingAddress()) { |
// Update the corresponding slot. |
- *slot = map_word.ToForwardingAddress(); |
+ slot->SetValue(map_word.ToForwardingAddress()); |
} |
// If the object was in from space before and is after executing the |
// callback in to space, the object is still live. |
// Unfortunately, we do not know about the slot. It could be in a |
// just freed free space object. |
- if (heap->InToSpace(*slot)) { |
+ if (heap->InToSpace(slot->Value())) { |
return KEEP_SLOT; |
} |
- } else if (heap->InToSpace(*slot)) { |
+ } else if (heap->InToSpace(slot_reference)) { |
// Slots can point to "to" space if the page has been moved, or if the |
// slot has been recorded multiple times in the remembered set. Since |
// there is no forwarding information present we need to check the |
// markbits to determine liveness. |
- if (Marking::IsBlack( |
- ObjectMarking::MarkBitFrom(reinterpret_cast<HeapObject*>(*slot)))) |
+ if (Marking::IsBlack(ObjectMarking::MarkBitFrom( |
+ reinterpret_cast<HeapObject*>(slot_reference)))) |
return KEEP_SLOT; |
} else { |
- DCHECK(!heap->InNewSpace(*slot)); |
+ DCHECK(!heap->InNewSpace(slot_reference)); |
} |
return REMOVE_SLOT; |
} |