Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index 6651ad01698806dd70e99c411115e520df51bae0..0a372f866f54dd1af80e6e75b0e033c24d3b0848 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -43,28 +43,13 @@ const char* Marking::kImpossibleBitPattern = "01"; |
// produce invalid {kImpossibleBitPattern} in the marking bitmap by overlapping. |
STATIC_ASSERT(Heap::kMinObjectSizeInWords >= 2); |
- |
-// ------------------------------------------------------------------------- |
-// MarkCompactCollector |
- |
-MarkCompactCollector::MarkCompactCollector(Heap* heap) |
- : // NOLINT |
- heap_(heap), |
- page_parallel_job_semaphore_(0), |
-#ifdef DEBUG |
- state_(IDLE), |
-#endif |
- was_marked_incrementally_(false), |
- evacuation_(false), |
- compacting_(false), |
- black_allocation_(false), |
- have_code_to_deoptimize_(false), |
- marking_deque_(heap), |
- code_flusher_(nullptr), |
- sweeper_(heap) { |
-} |
+// ============================================================================= |
+// Verifiers |
+// ============================================================================= |
#ifdef VERIFY_HEAP |
+namespace { |
+ |
class MarkingVerifier : public ObjectVisitor { |
public: |
virtual void Run() = 0; |
@@ -220,8 +205,10 @@ class YoungGenerationMarkingVerifier : public MarkingVerifier { |
} |
}; |
-class VerifyEvacuationVisitor : public ObjectVisitor { |
+class EvacuationVerifier : public ObjectVisitor { |
public: |
+ virtual void Run() = 0; |
+ |
void VisitPointers(Object** start, Object** end) override { |
for (Object** current = start; current < end; current++) { |
if ((*current)->IsHeapObject()) { |
@@ -230,61 +217,92 @@ class VerifyEvacuationVisitor : public ObjectVisitor { |
} |
} |
} |
+ |
+ protected: |
+ explicit EvacuationVerifier(Heap* heap) : heap_(heap) {} |
+ |
+ void VerifyRoots(VisitMode mode); |
+ void VerifyEvacuationOnPage(Address start, Address end); |
+ void VerifyEvacuation(NewSpace* new_space); |
+ void VerifyEvacuation(PagedSpace* paged_space); |
+ |
+ Heap* heap_; |
}; |
+void EvacuationVerifier::VerifyRoots(VisitMode mode) { |
+ heap_->IterateStrongRoots(this, mode); |
+} |
-static void VerifyEvacuation(Page* page) { |
- VerifyEvacuationVisitor visitor; |
- HeapObjectIterator iterator(page); |
- for (HeapObject* heap_object = iterator.Next(); heap_object != NULL; |
- heap_object = iterator.Next()) { |
- // We skip free space objects. |
- if (!heap_object->IsFiller()) { |
- heap_object->Iterate(&visitor); |
- } |
+void EvacuationVerifier::VerifyEvacuationOnPage(Address start, Address end) { |
+ Address current = start; |
+ while (current < end) { |
+ HeapObject* object = HeapObject::FromAddress(current); |
+ if (!object->IsFiller()) object->Iterate(this); |
+ current += object->Size(); |
} |
} |
- |
-static void VerifyEvacuation(NewSpace* space) { |
- VerifyEvacuationVisitor visitor; |
+void EvacuationVerifier::VerifyEvacuation(NewSpace* space) { |
PageRange range(space->bottom(), space->top()); |
for (auto it = range.begin(); it != range.end();) { |
Page* page = *(it++); |
Address current = page->area_start(); |
Address limit = it != range.end() ? page->area_end() : space->top(); |
CHECK(limit == space->top() || !page->Contains(space->top())); |
- while (current < limit) { |
- HeapObject* object = HeapObject::FromAddress(current); |
- object->Iterate(&visitor); |
- current += object->Size(); |
- } |
+ VerifyEvacuationOnPage(current, limit); |
} |
} |
- |
-static void VerifyEvacuation(Heap* heap, PagedSpace* space) { |
- if (FLAG_use_allocation_folding && (space == heap->old_space())) { |
+void EvacuationVerifier::VerifyEvacuation(PagedSpace* space) { |
+ if (FLAG_use_allocation_folding && (space == heap_->old_space())) { |
return; |
} |
for (Page* p : *space) { |
if (p->IsEvacuationCandidate()) continue; |
- VerifyEvacuation(p); |
+ if (p->Contains(space->top())) |
Michael Lippautz
2017/04/04 14:50:27
Previously we used the HeapObjectIterator for this
|
+ heap_->CreateFillerObjectAt(space->top(), space->limit() - space->top(), |
+ ClearRecordedSlots::kNo); |
+ |
+ VerifyEvacuationOnPage(p->area_start(), p->area_end()); |
} |
} |
+class FullEvacuationVerifier : public EvacuationVerifier { |
+ public: |
+ explicit FullEvacuationVerifier(Heap* heap) : EvacuationVerifier(heap) {} |
-static void VerifyEvacuation(Heap* heap) { |
- VerifyEvacuation(heap, heap->old_space()); |
- VerifyEvacuation(heap, heap->code_space()); |
- VerifyEvacuation(heap, heap->map_space()); |
- VerifyEvacuation(heap->new_space()); |
+ void Run() override { |
+ VerifyRoots(VISIT_ALL); |
+ VerifyEvacuation(heap_->new_space()); |
+ VerifyEvacuation(heap_->old_space()); |
+ VerifyEvacuation(heap_->code_space()); |
+ VerifyEvacuation(heap_->map_space()); |
+ } |
+}; |
- VerifyEvacuationVisitor visitor; |
- heap->IterateStrongRoots(&visitor, VISIT_ALL); |
-} |
+} // namespace |
#endif // VERIFY_HEAP |
+// ============================================================================= |
+// MarkCompactCollector |
+// ============================================================================= |
+ |
+MarkCompactCollector::MarkCompactCollector(Heap* heap) |
+ : // NOLINT |
+ heap_(heap), |
+ page_parallel_job_semaphore_(0), |
+#ifdef DEBUG |
+ state_(IDLE), |
+#endif |
+ was_marked_incrementally_(false), |
+ evacuation_(false), |
+ compacting_(false), |
+ black_allocation_(false), |
+ have_code_to_deoptimize_(false), |
+ marking_deque_(heap), |
+ code_flusher_(nullptr), |
+ sweeper_(heap) { |
+} |
void MarkCompactCollector::SetUp() { |
DCHECK(strcmp(Marking::kWhiteBitPattern, "00") == 0); |
@@ -586,7 +604,8 @@ void MarkCompactCollector::EnsureSweepingCompleted() { |
#ifdef VERIFY_HEAP |
if (FLAG_verify_heap && !evacuation()) { |
- VerifyEvacuation(heap_); |
+ FullEvacuationVerifier verifier(heap_); |
+ verifier.Run(); |
} |
#endif |
@@ -3711,7 +3730,8 @@ void MarkCompactCollector::EvacuateNewSpaceAndCandidates() { |
#ifdef VERIFY_HEAP |
if (FLAG_verify_heap && !sweeper().sweeping_in_progress()) { |
- VerifyEvacuation(heap()); |
+ FullEvacuationVerifier verifier(heap()); |
+ verifier.Run(); |
} |
#endif |
} |