Index: src/spaces.cc |
diff --git a/src/spaces.cc b/src/spaces.cc |
index 2faf41912e8e3db3319ed940a5c11c1ad8cad577..8e9077ccdb82e35a0dd50b826ac58c9a10764e35 100644 |
--- a/src/spaces.cc |
+++ b/src/spaces.cc |
@@ -1520,20 +1520,18 @@ void SemiSpace::TearDown() { |
bool SemiSpace::Commit() { |
ASSERT(!is_committed()); |
int pages = capacity_ / Page::kPageSize; |
- Address end = start_ + maximum_capacity_; |
- Address start = end - pages * Page::kPageSize; |
- if (!heap()->isolate()->memory_allocator()->CommitBlock(start, |
+ if (!heap()->isolate()->memory_allocator()->CommitBlock(start_, |
capacity_, |
executable())) { |
return false; |
} |
- NewSpacePage* page = anchor(); |
- for (int i = 1; i <= pages; i++) { |
+ NewSpacePage* current = anchor(); |
+ for (int i = 0; i < pages; i++) { |
NewSpacePage* new_page = |
- NewSpacePage::Initialize(heap(), end - i * Page::kPageSize, this); |
- new_page->InsertAfter(page); |
- page = new_page; |
+ NewSpacePage::Initialize(heap(), start_ + i * Page::kPageSize, this); |
+ new_page->InsertAfter(current); |
+ current = new_page; |
} |
committed_ = true; |
@@ -1577,20 +1575,18 @@ bool SemiSpace::GrowTo(int new_capacity) { |
int pages_before = capacity_ / Page::kPageSize; |
int pages_after = new_capacity / Page::kPageSize; |
- Address end = start_ + maximum_capacity_; |
- Address start = end - new_capacity; |
size_t delta = new_capacity - capacity_; |
ASSERT(IsAligned(delta, OS::AllocateAlignment())); |
if (!heap()->isolate()->memory_allocator()->CommitBlock( |
- start, delta, executable())) { |
+ start_ + capacity_, delta, executable())) { |
return false; |
} |
capacity_ = new_capacity; |
NewSpacePage* last_page = anchor()->prev_page(); |
ASSERT(last_page != anchor()); |
- for (int i = pages_before + 1; i <= pages_after; i++) { |
- Address page_address = end - i * Page::kPageSize; |
+ for (int i = pages_before; i < pages_after; i++) { |
+ Address page_address = start_ + i * Page::kPageSize; |
NewSpacePage* new_page = NewSpacePage::Initialize(heap(), |
page_address, |
this); |
@@ -1610,25 +1606,20 @@ bool SemiSpace::ShrinkTo(int new_capacity) { |
ASSERT(new_capacity >= initial_capacity_); |
ASSERT(new_capacity < capacity_); |
if (is_committed()) { |
- // Semispaces grow backwards from the end of their allocated capacity, |
- // so we find the before and after start addresses relative to the |
- // end of the space. |
- Address space_end = start_ + maximum_capacity_; |
- Address old_start = space_end - capacity_; |
size_t delta = capacity_ - new_capacity; |
ASSERT(IsAligned(delta, OS::AllocateAlignment())); |
MemoryAllocator* allocator = heap()->isolate()->memory_allocator(); |
- if (!allocator->UncommitBlock(old_start, delta)) { |
+ if (!allocator->UncommitBlock(start_ + new_capacity, delta)) { |
return false; |
} |
int pages_after = new_capacity / Page::kPageSize; |
NewSpacePage* new_last_page = |
- NewSpacePage::FromAddress(space_end - pages_after * Page::kPageSize); |
+ NewSpacePage::FromAddress(start_ + (pages_after - 1) * Page::kPageSize); |
new_last_page->set_next_page(anchor()); |
anchor()->set_prev_page(new_last_page); |
- ASSERT((current_page_ <= first_page()) && (current_page_ >= new_last_page)); |
+ ASSERT((current_page_ >= first_page()) && (current_page_ <= new_last_page)); |
} |
capacity_ = new_capacity; |