| Index: src/heap/incremental-marking.cc | 
| diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc | 
| index 4ce5db2928df471f87ff654db80e8b5ea90f4d3d..cef34117a84f8473426b79c99545f827089a8916 100644 | 
| --- a/src/heap/incremental-marking.cc | 
| +++ b/src/heap/incremental-marking.cc | 
| @@ -763,51 +763,42 @@ void IncrementalMarking::FinalizeIncrementally() { | 
| void IncrementalMarking::UpdateMarkingDequeAfterScavenge() { | 
| if (!IsMarking()) return; | 
|  | 
| -  int current = marking_deque()->bottom(); | 
| -  int mask = marking_deque()->mask(); | 
| -  int limit = marking_deque()->top(); | 
| -  HeapObject** array = marking_deque()->array(); | 
| -  int new_top = current; | 
| - | 
| Map* filler_map = heap_->one_pointer_filler_map(); | 
|  | 
| -  while (current != limit) { | 
| -    HeapObject* obj = array[current]; | 
| +  marking_deque()->Update([this, filler_map](HeapObject* obj) -> HeapObject* { | 
| DCHECK(obj->IsHeapObject()); | 
| -    current = ((current + 1) & mask); | 
| // Only pointers to from space have to be updated. | 
| if (heap_->InFromSpace(obj)) { | 
| MapWord map_word = obj->map_word(); | 
| -      // There may be objects on the marking deque that do not exist anymore, | 
| -      // e.g. left trimmed objects or objects from the root set (frames). | 
| -      // If these object are dead at scavenging time, their marking deque | 
| -      // entries will not point to forwarding addresses. Hence, we can discard | 
| -      // them. | 
| -      if (map_word.IsForwardingAddress()) { | 
| -        HeapObject* dest = map_word.ToForwardingAddress(); | 
| -        if (ObjectMarking::IsBlack(dest, marking_state(dest))) continue; | 
| -        array[new_top] = dest; | 
| -        new_top = ((new_top + 1) & mask); | 
| -        DCHECK(new_top != marking_deque()->bottom()); | 
| -        DCHECK(ObjectMarking::IsGrey(obj, marking_state(obj)) || | 
| -               (obj->IsFiller() && | 
| -                ObjectMarking::IsWhite(obj, marking_state(obj)))); | 
| +      if (!map_word.IsForwardingAddress()) { | 
| +        // There may be objects on the marking deque that do not exist anymore, | 
| +        // e.g. left trimmed objects or objects from the root set (frames). | 
| +        // If these object are dead at scavenging time, their marking deque | 
| +        // entries will not point to forwarding addresses. Hence, we can discard | 
| +        // them. | 
| +        return nullptr; | 
| } | 
| -    } else if (obj->map() != filler_map) { | 
| -      // Skip one word filler objects that appear on the | 
| -      // stack when we perform in place array shift. | 
| -      array[new_top] = obj; | 
| -      new_top = ((new_top + 1) & mask); | 
| -      DCHECK(new_top != marking_deque()->bottom()); | 
| +      HeapObject* dest = map_word.ToForwardingAddress(); | 
| +      if (ObjectMarking::IsBlack(dest, marking_state(dest))) { | 
| +        // The object is already processed by the marker. | 
| +        return nullptr; | 
| +      } | 
| +      DCHECK( | 
| +          ObjectMarking::IsGrey(obj, marking_state(obj)) || | 
| +          (obj->IsFiller() && ObjectMarking::IsWhite(obj, marking_state(obj)))); | 
| +      return dest; | 
| +    } else { | 
| DCHECK(ObjectMarking::IsGrey(obj, marking_state(obj)) || | 
| (obj->IsFiller() && | 
| ObjectMarking::IsWhite(obj, marking_state(obj))) || | 
| (MemoryChunk::FromAddress(obj->address()) | 
| ->IsFlagSet(MemoryChunk::HAS_PROGRESS_BAR) && | 
| ObjectMarking::IsBlack(obj, marking_state(obj)))); | 
| +      // Skip one word filler objects that appear on the | 
| +      // stack when we perform in place array shift. | 
| +      return (obj->map() == filler_map) ? nullptr : obj; | 
| } | 
| -  } | 
| -  marking_deque()->set_top(new_top); | 
| +  }); | 
| } | 
|  | 
|  | 
|  |