| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index 40b2484445d370f30a9dc60ba065343295f349b3..cf9ba155fed2b78558466f57d6a66638133abf23 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -104,30 +104,30 @@ static void VerifyMarking(Heap* heap, Address bottom, Address top) {
|
| VerifyMarkingVisitor visitor(heap);
|
| HeapObject* object;
|
| Address next_object_must_be_here_or_later = bottom;
|
| -
|
| - for (Address current = bottom; current < top; current += kPointerSize) {
|
| + for (Address current = bottom; current < top;) {
|
| object = HeapObject::FromAddress(current);
|
| if (MarkCompactCollector::IsMarked(object)) {
|
| CHECK(Marking::IsBlack(ObjectMarking::MarkBitFrom(object)));
|
| CHECK(current >= next_object_must_be_here_or_later);
|
| object->Iterate(&visitor);
|
| next_object_must_be_here_or_later = current + object->Size();
|
| - // The next word for sure belongs to the current object, jump over it.
|
| + // The object is either part of a black area of black allocation or a
|
| + // regular black object
|
| + Page* page = Page::FromAddress(current);
|
| + CHECK(
|
| + page->markbits()->AllBitsSetInRange(
|
| + page->AddressToMarkbitIndex(current),
|
| + page->AddressToMarkbitIndex(next_object_must_be_here_or_later)) ||
|
| + page->markbits()->AllBitsClearInRange(
|
| + page->AddressToMarkbitIndex(current + kPointerSize * 2),
|
| + page->AddressToMarkbitIndex(next_object_must_be_here_or_later)));
|
| + current = next_object_must_be_here_or_later;
|
| + } else {
|
| current += kPointerSize;
|
| }
|
| }
|
| }
|
|
|
| -static void VerifyMarkingBlackPage(Heap* heap, Page* page) {
|
| - CHECK(page->IsFlagSet(Page::BLACK_PAGE));
|
| - VerifyMarkingVisitor visitor(heap);
|
| - HeapObjectIterator it(page);
|
| - for (HeapObject* object = it.Next(); object != NULL; object = it.Next()) {
|
| - CHECK(Marking::IsBlack(ObjectMarking::MarkBitFrom(object)));
|
| - object->Iterate(&visitor);
|
| - }
|
| -}
|
| -
|
| static void VerifyMarking(NewSpace* space) {
|
| Address end = space->top();
|
| // The bottom position is at the start of its page. Allows us to use
|
| @@ -146,11 +146,7 @@ static void VerifyMarking(NewSpace* space) {
|
|
|
| static void VerifyMarking(PagedSpace* space) {
|
| for (Page* p : *space) {
|
| - if (p->IsFlagSet(Page::BLACK_PAGE)) {
|
| - VerifyMarkingBlackPage(space->heap(), p);
|
| - } else {
|
| - VerifyMarking(space->heap(), p->area_start(), p->area_end());
|
| - }
|
| + VerifyMarking(space->heap(), p->area_start(), p->area_end());
|
| }
|
| }
|
|
|
| @@ -409,9 +405,6 @@ void MarkCompactCollector::VerifyOmittedMapChecks() {
|
| static void ClearMarkbitsInPagedSpace(PagedSpace* space) {
|
| for (Page* p : *space) {
|
| p->ClearLiveness();
|
| - if (p->IsFlagSet(Page::BLACK_PAGE)) {
|
| - p->ClearFlag(Page::BLACK_PAGE);
|
| - }
|
| }
|
| }
|
|
|
| @@ -435,9 +428,6 @@ void MarkCompactCollector::ClearMarkbits() {
|
| MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address());
|
| chunk->ResetProgressBar();
|
| chunk->ResetLiveBytes();
|
| - if (chunk->IsFlagSet(Page::BLACK_PAGE)) {
|
| - chunk->ClearFlag(Page::BLACK_PAGE);
|
| - }
|
| }
|
| }
|
|
|
| @@ -659,7 +649,6 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) {
|
|
|
| for (Page* p : *space) {
|
| if (p->NeverEvacuate()) continue;
|
| - if (p->IsFlagSet(Page::BLACK_PAGE)) continue;
|
| // Invariant: Evacuation candidates are just created when marking is
|
| // started. This means that sweeping has finished. Furthermore, at the end
|
| // of a GC all evacuation candidates are cleared and their slot buffers are
|
| @@ -1913,9 +1902,7 @@ class MarkCompactCollector::EvacuateRecordOnlyVisitor final
|
|
|
| void MarkCompactCollector::DiscoverGreyObjectsInSpace(PagedSpace* space) {
|
| for (Page* p : *space) {
|
| - if (!p->IsFlagSet(Page::BLACK_PAGE)) {
|
| - DiscoverGreyObjectsOnPage(p);
|
| - }
|
| + DiscoverGreyObjectsOnPage(p);
|
| if (marking_deque()->IsFull()) return;
|
| }
|
| }
|
| @@ -2932,9 +2919,8 @@ bool MarkCompactCollector::IsSlotInBlackObject(MemoryChunk* p, Address slot) {
|
| DCHECK(owner != heap_->lo_space() && owner != nullptr);
|
| USE(owner);
|
|
|
| - // If we are on a black page, we cannot find the actual object start
|
| - // easiliy. We just return true but do not set the out_object.
|
| - if (p->IsFlagSet(Page::BLACK_PAGE)) {
|
| + // We may be part of a black area.
|
| + if (Marking::IsBlackOrGrey(ObjectMarking::MarkBitFrom(slot))) {
|
| return true;
|
| }
|
|
|
| @@ -3031,27 +3017,16 @@ HeapObject* MarkCompactCollector::FindBlackObjectBySlotSlow(Address slot) {
|
| return nullptr;
|
| }
|
|
|
| - if (p->IsFlagSet(Page::BLACK_PAGE)) {
|
| - HeapObjectIterator it(p);
|
| - HeapObject* object = nullptr;
|
| - while ((object = it.Next()) != nullptr) {
|
| - int size = object->Size();
|
| - if (object->address() > slot) return nullptr;
|
| - if (object->address() <= slot && slot < (object->address() + size)) {
|
| - return object;
|
| - }
|
| - }
|
| - } else {
|
| - LiveObjectIterator<kBlackObjects> it(p);
|
| - HeapObject* object = nullptr;
|
| - while ((object = it.Next()) != nullptr) {
|
| - int size = object->Size();
|
| - if (object->address() > slot) return nullptr;
|
| - if (object->address() <= slot && slot < (object->address() + size)) {
|
| - return object;
|
| - }
|
| + LiveObjectIterator<kBlackObjects> it(p);
|
| + HeapObject* object = nullptr;
|
| + while ((object = it.Next()) != nullptr) {
|
| + int size = object->Size();
|
| + if (object->address() > slot) return nullptr;
|
| + if (object->address() <= slot && slot < (object->address() + size)) {
|
| + return object;
|
| }
|
| }
|
| +
|
| return nullptr;
|
| }
|
|
|
| @@ -3388,7 +3363,6 @@ int MarkCompactCollector::Sweeper::RawSweep(
|
| DCHECK(free_list_mode == IGNORE_FREE_LIST || space->identity() == OLD_SPACE ||
|
| space->identity() == CODE_SPACE || space->identity() == MAP_SPACE);
|
| DCHECK(!p->IsEvacuationCandidate() && !p->SweepingDone());
|
| - DCHECK(!p->IsFlagSet(Page::BLACK_PAGE));
|
|
|
| // Before we sweep objects on the page, we free dead array buffers which
|
| // requires valid mark bits.
|
| @@ -3941,7 +3915,6 @@ void MarkCompactCollector::Sweeper::AddSweepingPageSafe(AllocationSpace space,
|
| }
|
|
|
| void MarkCompactCollector::StartSweepSpace(PagedSpace* space) {
|
| - Address space_top = space->top();
|
| space->ClearStats();
|
|
|
| int will_be_swept = 0;
|
| @@ -3958,24 +3931,6 @@ void MarkCompactCollector::StartSweepSpace(PagedSpace* space) {
|
| continue;
|
| }
|
|
|
| - // We can not sweep black pages, since all mark bits are set for these
|
| - // pages.
|
| - if (p->IsFlagSet(Page::BLACK_PAGE)) {
|
| - p->ClearLiveness();
|
| - p->concurrent_sweeping_state().SetValue(Page::kSweepingDone);
|
| - p->ClearFlag(Page::BLACK_PAGE);
|
| - // Area above the high watermark is free.
|
| - Address free_start = p->HighWaterMark();
|
| - // Check if the space top was in this page, which means that the
|
| - // high watermark is not up-to-date.
|
| - if (free_start < space_top && space_top <= p->area_end()) {
|
| - free_start = space_top;
|
| - }
|
| - int size = static_cast<int>(p->area_end() - free_start);
|
| - space->Free(free_start, size);
|
| - continue;
|
| - }
|
| -
|
| if (p->IsFlagSet(Page::NEVER_ALLOCATE_ON_PAGE)) {
|
| // We need to sweep the page to get it into an iterable state again. Note
|
| // that this adds unusable memory into the free list that is later on
|
|
|