Index: src/spaces.cc |
=================================================================== |
--- src/spaces.cc (revision 11201) |
+++ src/spaces.cc (working copy) |
@@ -565,11 +565,10 @@ |
} |
-Page* MemoryAllocator::AllocatePage(PagedSpace* owner, |
+Page* MemoryAllocator::AllocatePage(intptr_t size, |
+ PagedSpace* owner, |
Executability executable) { |
- MemoryChunk* chunk = AllocateChunk(owner->AreaSize(), |
- executable, |
- owner); |
+ MemoryChunk* chunk = AllocateChunk(size, executable, owner); |
if (chunk == NULL) return NULL; |
@@ -833,7 +832,6 @@ |
bool PagedSpace::CanExpand() { |
ASSERT(max_capacity_ % AreaSize() == 0); |
- ASSERT(Capacity() % AreaSize() == 0); |
if (Capacity() == max_capacity_) return false; |
@@ -848,8 +846,14 @@ |
bool PagedSpace::Expand() { |
if (!CanExpand()) return false; |
- Page* p = heap()->isolate()->memory_allocator()-> |
- AllocatePage(this, executable()); |
+ intptr_t size = AreaSize(); |
+ |
+ if (anchor_.next_page() == &anchor_) { |
+ size = SizeOfFirstPage(); |
+ } |
+ |
+ Page* p = heap()->isolate()->memory_allocator()->AllocatePage( |
+ size, this, executable()); |
if (p == NULL) return false; |
ASSERT(Capacity() <= max_capacity_); |
@@ -860,6 +864,39 @@ |
} |
+intptr_t PagedSpace::SizeOfFirstPage() { |
+ int size = 0; |
+ void* dummy; |
+ switch (identity()) { |
+ case OLD_POINTER_SPACE: |
+ size = 64 * sizeof(dummy) * KB; |
Michael Starzinger
2012/04/02 08:25:05
Why not use kPointerSize here?
|
+ break; |
+ case OLD_DATA_SPACE: |
+ size = 192 * KB; |
+ break; |
+ case MAP_SPACE: |
+ size = 128 * KB; |
+ break; |
+ case CELL_SPACE: |
+ size = 96 * KB; |
+ break; |
+ case CODE_SPACE: |
+ if (sizeof(dummy) == 8) { |
Michael Starzinger
2012/04/02 08:25:05
Why not use kPointerSize here?
|
+ // On x64 we allocate code pages in a special way (from the reserved |
+ // 2Byte area). That part of the code is not yet upgraded to handle |
+ // small pages. |
+ size = AreaSize(); |
+ } else { |
+ size = 384 * KB; |
+ } |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ return Min(size, AreaSize()); |
+} |
+ |
+ |
int PagedSpace::CountTotalPages() { |
PageIterator it(this); |
int count = 0; |
@@ -903,7 +940,6 @@ |
} |
ASSERT(Capacity() > 0); |
- ASSERT(Capacity() % AreaSize() == 0); |
accounting_stats_.ShrinkSpace(AreaSize()); |
} |
@@ -1042,6 +1078,7 @@ |
if (!to_space_.Commit()) { |
return false; |
} |
+ ASSERT(!from_space_.is_committed()); // No need to use memory yet. |
start_ = chunk_base_; |
address_mask_ = ~(2 * reserved_semispace_capacity - 1); |