Commit be4597a2 authored by ulan's avatar ulan Committed by Commit bot

Skip two-pointer fillers when processing marking deque.

Slots filtering of left-trimmed arrays assume that two-pointer fillers are not marked.

BUG=chromium:585787
LOG=NO
TBR=hpayer@chromium.org

Review URL: https://codereview.chromium.org/1720623002

Cr-Commit-Position: refs/heads/master@{#34177}
parent 1f5b84e4
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment