Index: src/incremental-marking.cc |
diff --git a/src/incremental-marking.cc b/src/incremental-marking.cc |
index bacbb93ad2e8cb6a335c577e8ccf69ade8c82d63..e19d6e28f69f9141b3d47756bcf2d3129a9a6eaf 100644 |
--- a/src/incremental-marking.cc |
+++ b/src/incremental-marking.cc |
@@ -54,7 +54,8 @@ IncrementalMarking::IncrementalMarking(Heap* heap) |
should_hurry_(false), |
marking_speed_(0), |
allocated_(0), |
- no_marking_scope_depth_(0) { |
+ no_marking_scope_depth_(0), |
+ unscanned_bytes_of_large_object_(0) { |
} |
@@ -241,6 +242,7 @@ class IncrementalMarkingMarkingVisitor |
chunk->progress_bar()); |
int end_offset = Min(object_size, |
start_offset + kProgressBarScanningChunk); |
+ int already_scanned_offset = start_offset; |
bool scan_until_end = false; |
do { |
VisitPointersWithAnchor(heap, |
@@ -254,6 +256,8 @@ class IncrementalMarkingMarkingVisitor |
chunk->set_progress_bar(start_offset); |
if (start_offset < object_size) { |
heap->incremental_marking()->marking_deque()->UnshiftGrey(object); |
+ heap->incremental_marking()->NotifyIncompleteScanOfObject( |
+ object_size - (start_offset - already_scanned_offset)); |
} |
} else { |
FixedArrayVisitor::Visit(map, object); |
@@ -739,8 +743,9 @@ void IncrementalMarking::ProcessMarkingDeque(intptr_t bytes_to_process) { |
if (map == filler_map) continue; |
int size = obj->SizeFromMap(map); |
- bytes_to_process -= size; |
+ unscanned_bytes_of_large_object_ = 0; |
VisitObject(map, obj, size); |
+ bytes_to_process -= (size - unscanned_bytes_of_large_object_); |
} |
} |