| Index: src/heap/incremental-marking.cc
|
| diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc
|
| index 52d0ca4e51b6e297c04c94bfb686116722d32bba..579df28b0878031a41c64165d253206865a4c50d 100644
|
| --- a/src/heap/incremental-marking.cc
|
| +++ b/src/heap/incremental-marking.cc
|
| @@ -847,16 +847,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;
|
|
|