| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index fde7d8ecf25ca9b0981cbc7b38b6f0e5f255c154..1b343459e8bd013baa3918b92f2c5b6d7e36139a 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -3319,9 +3319,10 @@ int MarkCompactCollector::Sweeper::RawSweep(
|
| Page* p, FreeListRebuildingMode free_list_mode,
|
| FreeSpaceTreatmentMode free_space_mode) {
|
| Space* space = p->owner();
|
| + AllocationSpace identity = space->identity();
|
| DCHECK_NOT_NULL(space);
|
| - DCHECK(free_list_mode == IGNORE_FREE_LIST || space->identity() == OLD_SPACE ||
|
| - space->identity() == CODE_SPACE || space->identity() == MAP_SPACE);
|
| + DCHECK(free_list_mode == IGNORE_FREE_LIST || identity == OLD_SPACE ||
|
| + identity == CODE_SPACE || identity == MAP_SPACE);
|
| DCHECK(!p->IsEvacuationCandidate() && !p->SweepingDone());
|
|
|
| // Before we sweep objects on the page, we free dead array buffers which
|
| @@ -3350,6 +3351,8 @@ int MarkCompactCollector::Sweeper::RawSweep(
|
|
|
| LiveObjectIterator<kBlackObjects> it(p);
|
| HeapObject* object = NULL;
|
| + bool clear_slots =
|
| + p->old_to_new_slots() && (identity == OLD_SPACE || identity == MAP_SPACE);
|
| while ((object = it.Next()) != NULL) {
|
| DCHECK(Marking::IsBlack(ObjectMarking::MarkBitFrom(object)));
|
| Address free_end = object->address();
|
| @@ -3366,6 +3369,11 @@ int MarkCompactCollector::Sweeper::RawSweep(
|
| p->heap()->CreateFillerObjectAt(free_start, size,
|
| ClearRecordedSlots::kNo);
|
| }
|
| +
|
| + if (clear_slots) {
|
| + RememberedSet<OLD_TO_NEW>::RemoveRange(p, free_start, free_end,
|
| + SlotSet::KEEP_EMPTY_BUCKETS);
|
| + }
|
| }
|
| Map* map = object->synchronized_map();
|
| int size = object->SizeFromMap(map);
|
| @@ -3381,9 +3389,6 @@ int MarkCompactCollector::Sweeper::RawSweep(
|
| free_start = free_end + size;
|
| }
|
|
|
| - // Clear the mark bits of that page and reset live bytes count.
|
| - p->ClearLiveness();
|
| -
|
| if (free_start != p->area_end()) {
|
| int size = static_cast<int>(p->area_end() - free_start);
|
| if (free_space_mode == ZAP_FREE_SPACE) {
|
| @@ -3397,7 +3402,16 @@ int MarkCompactCollector::Sweeper::RawSweep(
|
| p->heap()->CreateFillerObjectAt(free_start, size,
|
| ClearRecordedSlots::kNo);
|
| }
|
| +
|
| + if (clear_slots) {
|
| + RememberedSet<OLD_TO_NEW>::RemoveRange(p, free_start, p->area_end(),
|
| + SlotSet::KEEP_EMPTY_BUCKETS);
|
| + }
|
| }
|
| +
|
| + // Clear the mark bits of that page and reset live bytes count.
|
| + p->ClearLiveness();
|
| +
|
| p->concurrent_sweeping_state().SetValue(Page::kSweepingDone);
|
| if (free_list_mode == IGNORE_FREE_LIST) return 0;
|
| return FreeList::GuaranteedAllocatable(static_cast<int>(max_freed_bytes));
|
| @@ -3813,9 +3827,7 @@ int MarkCompactCollector::Sweeper::ParallelSweepPage(Page* page,
|
| if (identity == NEW_SPACE) {
|
| RawSweep(page, IGNORE_FREE_LIST, free_space_mode);
|
| } else {
|
| - if (identity == OLD_SPACE || identity == MAP_SPACE) {
|
| - RememberedSet<OLD_TO_NEW>::ClearInvalidSlots(heap_, page);
|
| - } else {
|
| + if (identity == CODE_SPACE) {
|
| RememberedSet<OLD_TO_NEW>::ClearInvalidTypedSlots(heap_, page);
|
| }
|
| max_freed = RawSweep(page, REBUILD_FREE_LIST, free_space_mode);
|
|
|