| Index: test/cctest/test-spaces.cc
|
| ===================================================================
|
| --- test/cctest/test-spaces.cc (revision 9327)
|
| +++ test/cctest/test-spaces.cc (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2006-2008 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -32,7 +32,9 @@
|
|
|
| using namespace v8::internal;
|
|
|
| +#if 0
|
| static void VerifyRegionMarking(Address page_start) {
|
| +#ifdef ENABLE_CARDMARKING_WRITE_BARRIER
|
| Page* p = Page::FromAddress(page_start);
|
|
|
| p->SetRegionMarks(Page::kAllRegionsCleanMarks);
|
| @@ -54,9 +56,13 @@
|
| addr += kPointerSize) {
|
| CHECK(Page::FromAddress(addr)->IsRegionDirty(addr));
|
| }
|
| +#endif
|
| }
|
| +#endif
|
|
|
|
|
| +// TODO(gc) you can no longer allocate pages like this. Details are hidden.
|
| +#if 0
|
| TEST(Page) {
|
| byte* mem = NewArray<byte>(2*Page::kPageSize);
|
| CHECK(mem != NULL);
|
| @@ -89,6 +95,7 @@
|
|
|
| DeleteArray(mem);
|
| }
|
| +#endif
|
|
|
|
|
| namespace v8 {
|
| @@ -122,62 +129,46 @@
|
| Isolate* isolate = Isolate::Current();
|
| isolate->InitializeLoggingAndCounters();
|
| Heap* heap = isolate->heap();
|
| - CHECK(heap->ConfigureHeapDefault());
|
| + CHECK(isolate->heap()->ConfigureHeapDefault());
|
| +
|
| MemoryAllocator* memory_allocator = new MemoryAllocator(isolate);
|
| CHECK(memory_allocator->Setup(heap->MaxReserved(),
|
| heap->MaxExecutableSize()));
|
| - TestMemoryAllocatorScope test_scope(isolate, memory_allocator);
|
|
|
| + int total_pages = 0;
|
| OldSpace faked_space(heap,
|
| heap->MaxReserved(),
|
| OLD_POINTER_SPACE,
|
| NOT_EXECUTABLE);
|
| - int total_pages = 0;
|
| - int requested = MemoryAllocator::kPagesPerChunk;
|
| - int allocated;
|
| - // If we request n pages, we should get n or n - 1.
|
| - Page* first_page = memory_allocator->AllocatePages(
|
| - requested, &allocated, &faked_space);
|
| + Page* first_page =
|
| + memory_allocator->AllocatePage(&faked_space, NOT_EXECUTABLE);
|
| +
|
| + first_page->InsertAfter(faked_space.anchor()->prev_page());
|
| CHECK(first_page->is_valid());
|
| - CHECK(allocated == requested || allocated == requested - 1);
|
| - total_pages += allocated;
|
| + CHECK(first_page->next_page() == faked_space.anchor());
|
| + total_pages++;
|
|
|
| - Page* last_page = first_page;
|
| - for (Page* p = first_page; p->is_valid(); p = p->next_page()) {
|
| - CHECK(memory_allocator->IsPageInSpace(p, &faked_space));
|
| - last_page = p;
|
| + for (Page* p = first_page; p != faked_space.anchor(); p = p->next_page()) {
|
| + CHECK(p->owner() == &faked_space);
|
| }
|
|
|
| // Again, we should get n or n - 1 pages.
|
| - Page* others = memory_allocator->AllocatePages(
|
| - requested, &allocated, &faked_space);
|
| - CHECK(others->is_valid());
|
| - CHECK(allocated == requested || allocated == requested - 1);
|
| - total_pages += allocated;
|
| -
|
| - memory_allocator->SetNextPage(last_page, others);
|
| + Page* other =
|
| + memory_allocator->AllocatePage(&faked_space, NOT_EXECUTABLE);
|
| + CHECK(other->is_valid());
|
| + total_pages++;
|
| + other->InsertAfter(first_page);
|
| int page_count = 0;
|
| - for (Page* p = first_page; p->is_valid(); p = p->next_page()) {
|
| - CHECK(memory_allocator->IsPageInSpace(p, &faked_space));
|
| + for (Page* p = first_page; p != faked_space.anchor(); p = p->next_page()) {
|
| + CHECK(p->owner() == &faked_space);
|
| page_count++;
|
| }
|
| CHECK(total_pages == page_count);
|
|
|
| Page* second_page = first_page->next_page();
|
| CHECK(second_page->is_valid());
|
| -
|
| - // Freeing pages at the first chunk starting at or after the second page
|
| - // should free the entire second chunk. It will return the page it was passed
|
| - // (since the second page was in the first chunk).
|
| - Page* free_return = memory_allocator->FreePages(second_page);
|
| - CHECK(free_return == second_page);
|
| - memory_allocator->SetNextPage(first_page, free_return);
|
| -
|
| - // Freeing pages in the first chunk starting at the first page should free
|
| - // the first chunk and return an invalid page.
|
| - Page* invalid_page = memory_allocator->FreePages(first_page);
|
| - CHECK(!invalid_page->is_valid());
|
| -
|
| + memory_allocator->Free(first_page);
|
| + memory_allocator->Free(second_page);
|
| memory_allocator->TearDown();
|
| delete memory_allocator;
|
| }
|
| @@ -196,12 +187,8 @@
|
|
|
| NewSpace new_space(heap);
|
|
|
| - void* chunk =
|
| - memory_allocator->ReserveInitialChunk(4 * heap->ReservedSemiSpaceSize());
|
| - CHECK(chunk != NULL);
|
| - Address start = RoundUp(static_cast<Address>(chunk),
|
| - 2 * heap->ReservedSemiSpaceSize());
|
| - CHECK(new_space.Setup(start, 2 * heap->ReservedSemiSpaceSize()));
|
| + CHECK(new_space.Setup(HEAP->ReservedSemiSpaceSize(),
|
| + HEAP->ReservedSemiSpaceSize()));
|
| CHECK(new_space.HasBeenSetup());
|
|
|
| while (new_space.Available() >= Page::kMaxHeapObjectSize) {
|
| @@ -233,14 +220,8 @@
|
| NOT_EXECUTABLE);
|
| CHECK(s != NULL);
|
|
|
| - void* chunk = memory_allocator->ReserveInitialChunk(
|
| - 4 * heap->ReservedSemiSpaceSize());
|
| - CHECK(chunk != NULL);
|
| - Address start = static_cast<Address>(chunk);
|
| - size_t size = RoundUp(start, 2 * heap->ReservedSemiSpaceSize()) - start;
|
| + CHECK(s->Setup());
|
|
|
| - CHECK(s->Setup(start, size));
|
| -
|
| while (s->Available() > 0) {
|
| s->AllocateRaw(Page::kMaxHeapObjectSize)->ToObjectUnchecked();
|
| }
|
| @@ -258,14 +239,12 @@
|
| LargeObjectSpace* lo = HEAP->lo_space();
|
| CHECK(lo != NULL);
|
|
|
| - Map* faked_map = reinterpret_cast<Map*>(HeapObject::FromAddress(0));
|
| int lo_size = Page::kPageSize;
|
|
|
| - Object* obj = lo->AllocateRaw(lo_size)->ToObjectUnchecked();
|
| + Object* obj = lo->AllocateRaw(lo_size, NOT_EXECUTABLE)->ToObjectUnchecked();
|
| CHECK(obj->IsHeapObject());
|
|
|
| HeapObject* ho = HeapObject::cast(obj);
|
| - ho->set_map(faked_map);
|
|
|
| CHECK(lo->Contains(HeapObject::cast(obj)));
|
|
|
| @@ -275,14 +254,13 @@
|
|
|
| while (true) {
|
| intptr_t available = lo->Available();
|
| - { MaybeObject* maybe_obj = lo->AllocateRaw(lo_size);
|
| + { MaybeObject* maybe_obj = lo->AllocateRaw(lo_size, NOT_EXECUTABLE);
|
| if (!maybe_obj->ToObject(&obj)) break;
|
| }
|
| - HeapObject::cast(obj)->set_map(faked_map);
|
| CHECK(lo->Available() < available);
|
| };
|
|
|
| CHECK(!lo->IsEmpty());
|
|
|
| - CHECK(lo->AllocateRaw(lo_size)->IsFailure());
|
| + CHECK(lo->AllocateRaw(lo_size, NOT_EXECUTABLE)->IsFailure());
|
| }
|
|
|