| Index: test/cctest/test-heap.cc
|
| diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc
|
| index e72a19acda340ab3c23c4bbeb30d28db98076f8c..611a8628c6f3c1d1a6c021fcb9585e4d6b2ef0a8 100644
|
| --- a/test/cctest/test-heap.cc
|
| +++ b/test/cctest/test-heap.cc
|
| @@ -5555,6 +5555,7 @@ TEST(ArrayShiftSweeping) {
|
| UNINITIALIZED_TEST(PromotionQueue) {
|
| i::FLAG_expose_gc = true;
|
| i::FLAG_max_semi_space_size = 2 * (Page::kPageSize / MB);
|
| + i::FLAG_min_semi_space_size = i::FLAG_max_semi_space_size;
|
| v8::Isolate::CreateParams create_params;
|
| create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
|
| v8::Isolate* isolate = v8::Isolate::New(create_params);
|
| @@ -5565,12 +5566,11 @@ UNINITIALIZED_TEST(PromotionQueue) {
|
| v8::Context::New(isolate)->Enter();
|
| Heap* heap = i_isolate->heap();
|
| NewSpace* new_space = heap->new_space();
|
| - DisableInlineAllocationSteps(new_space);
|
|
|
| // In this test we will try to overwrite the promotion queue which is at the
|
| // end of to-space. To actually make that possible, we need at least two
|
| // semi-space pages and take advantage of fragmentation.
|
| - // (1) Grow semi-space to two pages.
|
| + // (1) Use a semi-space consisting of two pages.
|
| // (2) Create a few small long living objects and call the scavenger to
|
| // move them to the other semi-space.
|
| // (3) Create a huge object, i.e., remainder of first semi-space page and
|
| @@ -5586,18 +5586,9 @@ UNINITIALIZED_TEST(PromotionQueue) {
|
| // are in the second semi-space page. If the right guards are in place, the
|
| // promotion queue will be evacuated in that case.
|
|
|
| - // Grow the semi-space to two pages to make semi-space copy overwrite the
|
| - // promotion queue, which will be at the end of the second page.
|
| - intptr_t old_capacity = new_space->TotalCapacity();
|
| -
|
| - // If we are in a low memory config, we can't grow to two pages and we can't
|
| - // run this test. This also means the issue we are testing cannot arise, as
|
| - // there is no fragmentation.
|
| - if (new_space->IsAtMaximumCapacity()) return;
|
|
|
| - new_space->Grow();
|
| CHECK(new_space->IsAtMaximumCapacity());
|
| - CHECK(2 * old_capacity == new_space->TotalCapacity());
|
| + CHECK(i::FLAG_min_semi_space_size * MB == new_space->TotalCapacity());
|
|
|
| // Call the scavenger two times to get an empty new space
|
| heap->CollectGarbage(NEW_SPACE);
|
| @@ -5611,25 +5602,35 @@ UNINITIALIZED_TEST(PromotionQueue) {
|
| for (int i = 0; i < number_handles; i++) {
|
| handles[i] = i_isolate->factory()->NewFixedArray(1, NOT_TENURED);
|
| }
|
| +
|
| heap->CollectGarbage(NEW_SPACE);
|
| + CHECK(i::FLAG_min_semi_space_size * MB == new_space->TotalCapacity());
|
|
|
| // Create the first huge object which will exactly fit the first semi-space
|
| // page.
|
| + DisableInlineAllocationSteps(new_space);
|
| int new_linear_size =
|
| static_cast<int>(*heap->new_space()->allocation_limit_address() -
|
| *heap->new_space()->allocation_top_address());
|
| - int length = new_linear_size / kPointerSize - FixedArray::kHeaderSize;
|
| + int length = (new_linear_size - FixedArray::kHeaderSize) / kPointerSize;
|
| Handle<FixedArray> first =
|
| i_isolate->factory()->NewFixedArray(length, NOT_TENURED);
|
| CHECK(heap->InNewSpace(*first));
|
|
|
| + // Create a small object to initialize the bump pointer on the second
|
| + // semi-space page.
|
| + Handle<FixedArray> small =
|
| + i_isolate->factory()->NewFixedArray(1, NOT_TENURED);
|
| + CHECK(heap->InNewSpace(*small));
|
| +
|
| +
|
| // Create the second huge object of maximum allocatable second semi-space
|
| // page size.
|
| + DisableInlineAllocationSteps(new_space);
|
| new_linear_size =
|
| static_cast<int>(*heap->new_space()->allocation_limit_address() -
|
| *heap->new_space()->allocation_top_address());
|
| - length = Page::kMaxRegularHeapObjectSize / kPointerSize -
|
| - FixedArray::kHeaderSize;
|
| + length = (new_linear_size - FixedArray::kHeaderSize) / kPointerSize;
|
| Handle<FixedArray> second =
|
| i_isolate->factory()->NewFixedArray(length, NOT_TENURED);
|
| CHECK(heap->InNewSpace(*second));
|
|
|