| Index: src/heap/incremental-marking.cc
|
| diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc
|
| index 9c54dae295e753da86488d06ff45a241974f035a..689c200a1c38ce4ec230a878f7e70d9baff697e6 100644
|
| --- a/src/heap/incremental-marking.cc
|
| +++ b/src/heap/incremental-marking.cc
|
| @@ -861,16 +861,21 @@ void IncrementalMarking::MarkObject(Heap* heap, HeapObject* obj) {
|
|
|
| intptr_t IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) {
|
| intptr_t bytes_processed = 0;
|
| - Map* filler_map = heap_->one_pointer_filler_map();
|
| + Map* one_pointer_filler_map = heap_->one_pointer_filler_map();
|
| + Map* two_pointer_filler_map = heap_->two_pointer_filler_map();
|
| MarkingDeque* marking_deque =
|
| heap_->mark_compact_collector()->marking_deque();
|
| while (!marking_deque->IsEmpty() && bytes_processed < bytes_to_process) {
|
| HeapObject* obj = marking_deque->Pop();
|
|
|
| - // Explicitly skip one word fillers. Incremental markbit patterns are
|
| - // correct only for objects that occupy at least two words.
|
| + // Explicitly skip one and two word fillers. Incremental markbit patterns
|
| + // are correct only for objects that occupy at least two words.
|
| + // Moreover, slots filtering for left-trimmed arrays works only when
|
| + // the distance between the old array start and the new array start
|
| + // is greater than two if both starts are marked.
|
| Map* map = obj->map();
|
| - if (map == filler_map) continue;
|
| + if (map == one_pointer_filler_map || map == two_pointer_filler_map)
|
| + continue;
|
|
|
| int size = obj->SizeFromMap(map);
|
| unscanned_bytes_of_large_object_ = 0;
|
|
|