| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index 00ede2998b2ae97efef99ca64cd78a230aadceb4..6651ad01698806dd70e99c411115e520df51bae0 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -43,13 +43,28 @@
|
| // produce invalid {kImpossibleBitPattern} in the marking bitmap by overlapping.
|
| STATIC_ASSERT(Heap::kMinObjectSizeInWords >= 2);
|
|
|
| -// =============================================================================
|
| -// Verifiers
|
| -// =============================================================================
|
| +
|
| +// -------------------------------------------------------------------------
|
| +// 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) {
|
| +}
|
|
|
| #ifdef VERIFY_HEAP
|
| -namespace {
|
| -
|
| class MarkingVerifier : public ObjectVisitor {
|
| public:
|
| virtual void Run() = 0;
|
| @@ -205,10 +220,8 @@
|
| }
|
| };
|
|
|
| -class EvacuationVerifier : public ObjectVisitor {
|
| +class VerifyEvacuationVisitor : public ObjectVisitor {
|
| public:
|
| - virtual void Run() = 0;
|
| -
|
| void VisitPointers(Object** start, Object** end) override {
|
| for (Object** current = start; current < end; current++) {
|
| if ((*current)->IsHeapObject()) {
|
| @@ -217,88 +230,61 @@
|
| }
|
| }
|
| }
|
| -
|
| - 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);
|
| -}
|
| -
|
| -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();
|
| - }
|
| -}
|
| -
|
| -void EvacuationVerifier::VerifyEvacuation(NewSpace* space) {
|
| +
|
| +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);
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +static void VerifyEvacuation(NewSpace* space) {
|
| + VerifyEvacuationVisitor visitor;
|
| 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()));
|
| - VerifyEvacuationOnPage(current, limit);
|
| - }
|
| -}
|
| -
|
| -void EvacuationVerifier::VerifyEvacuation(PagedSpace* space) {
|
| - if (FLAG_use_allocation_folding && (space == heap_->old_space())) {
|
| + while (current < limit) {
|
| + HeapObject* object = HeapObject::FromAddress(current);
|
| + object->Iterate(&visitor);
|
| + current += object->Size();
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +static void VerifyEvacuation(Heap* heap, PagedSpace* space) {
|
| + if (FLAG_use_allocation_folding && (space == heap->old_space())) {
|
| return;
|
| }
|
| for (Page* p : *space) {
|
| if (p->IsEvacuationCandidate()) continue;
|
| - VerifyEvacuationOnPage(p->area_start(), p->area_end());
|
| - }
|
| -}
|
| -
|
| -class FullEvacuationVerifier : public EvacuationVerifier {
|
| - public:
|
| - explicit FullEvacuationVerifier(Heap* heap) : EvacuationVerifier(heap) {}
|
| -
|
| - void Run() override {
|
| - VerifyRoots(VISIT_ALL);
|
| - VerifyEvacuation(heap_->new_space());
|
| - VerifyEvacuation(heap_->old_space());
|
| - VerifyEvacuation(heap_->code_space());
|
| - VerifyEvacuation(heap_->map_space());
|
| - }
|
| -};
|
| -
|
| -} // namespace
|
| + VerifyEvacuation(p);
|
| + }
|
| +}
|
| +
|
| +
|
| +static void VerifyEvacuation(Heap* heap) {
|
| + VerifyEvacuation(heap, heap->old_space());
|
| + VerifyEvacuation(heap, heap->code_space());
|
| + VerifyEvacuation(heap, heap->map_space());
|
| + VerifyEvacuation(heap->new_space());
|
| +
|
| + VerifyEvacuationVisitor visitor;
|
| + heap->IterateStrongRoots(&visitor, VISIT_ALL);
|
| +}
|
| #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);
|
| @@ -600,8 +586,7 @@
|
|
|
| #ifdef VERIFY_HEAP
|
| if (FLAG_verify_heap && !evacuation()) {
|
| - FullEvacuationVerifier verifier(heap_);
|
| - verifier.Run();
|
| + VerifyEvacuation(heap_);
|
| }
|
| #endif
|
|
|
| @@ -3726,8 +3711,7 @@
|
|
|
| #ifdef VERIFY_HEAP
|
| if (FLAG_verify_heap && !sweeper().sweeping_in_progress()) {
|
| - FullEvacuationVerifier verifier(heap());
|
| - verifier.Run();
|
| + VerifyEvacuation(heap());
|
| }
|
| #endif
|
| }
|
|
|