// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/heap/heap-inl.h" #include "src/heap/spaces-inl.h" #include "src/isolate.h" #include "test/unittests/test-utils.h" namespace v8 { namespace internal { typedef TestWithIsolate SpacesTest; TEST_F(SpacesTest, CompactionSpaceMerge) { Heap* heap = i_isolate()->heap(); OldSpace* old_space = heap->old_space(); EXPECT_TRUE(old_space != NULL); CompactionSpace* compaction_space = new CompactionSpace(heap, OLD_SPACE, NOT_EXECUTABLE); EXPECT_TRUE(compaction_space != NULL); EXPECT_TRUE(compaction_space->SetUp()); for (Page* p : *old_space) { // Unlink free lists from the main space to avoid reusing the memory for // compaction spaces. old_space->UnlinkFreeListCategories(p); } // Cannot loop until "Available()" since we initially have 0 bytes available // and would thus neither grow, nor be able to allocate an object. const int kNumObjects = 10; const int kNumObjectsPerPage = compaction_space->AreaSize() / kMaxRegularHeapObjectSize; const int kExpectedPages = (kNumObjects + kNumObjectsPerPage - 1) / kNumObjectsPerPage; for (int i = 0; i < kNumObjects; i++) { HeapObject* object = compaction_space->AllocateRawUnaligned(kMaxRegularHeapObjectSize) .ToObjectChecked(); heap->CreateFillerObjectAt(object->address(), kMaxRegularHeapObjectSize, ClearRecordedSlots::kNo); } int pages_in_old_space = old_space->CountTotalPages(); int pages_in_compaction_space = compaction_space->CountTotalPages(); EXPECT_EQ(kExpectedPages, pages_in_compaction_space); old_space->MergeCompactionSpace(compaction_space); EXPECT_EQ(pages_in_old_space + pages_in_compaction_space, old_space->CountTotalPages()); delete compaction_space; } } // namespace internal } // namespace v8