| Index: src/heap.cc
|
| diff --git a/src/heap.cc b/src/heap.cc
|
| index 5713537b5ab301076c51706d77f3eef5e5713970..a58b24c95d1c5af02d824dea16ae2f0857c9f1a4 100644
|
| --- a/src/heap.cc
|
| +++ b/src/heap.cc
|
| @@ -3451,11 +3451,18 @@ bool Heap::CanMoveObjectStart(HeapObject* object) {
|
|
|
| if (lo_space()->Contains(object)) return false;
|
|
|
| - // We cannot move the object start if the given old space page is
|
| - // concurrently swept.
|
| + Page* page = Page::FromAddress(address);
|
| + // We can move the object start if:
|
| + // (1) the object is not in old pointer or old data space,
|
| + // (2) the page of the object was already swept,
|
| + // (3) the page was already concurrently swept. This case is an optimization
|
| + // for concurrent sweeping. The WasSwept predicate for concurrently swept
|
| + // pages is set after sweeping all pages.
|
| return (!is_in_old_pointer_space && !is_in_old_data_space) ||
|
| - Page::FromAddress(address)->parallel_sweeping() <=
|
| - MemoryChunk::PARALLEL_SWEEPING_FINALIZE;
|
| + page->WasSwept() ||
|
| + (mark_compact_collector()->AreSweeperThreadsActivated() &&
|
| + page->parallel_sweeping() <=
|
| + MemoryChunk::PARALLEL_SWEEPING_FINALIZE);
|
| }
|
|
|
|
|
|
|