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()); |
} |