| Index: test/cctest/test-spaces.cc
 | 
| ===================================================================
 | 
| --- test/cctest/test-spaces.cc	(revision 9531)
 | 
| +++ 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());
 | 
|  }
 | 
| 
 |