When shrinking semispace don't relink pages if semispace is not committed
R=mstarzinger@chromium.org Review URL: http://codereview.chromium.org/9086005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10333 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
2335545108
commit
e726c00ea6
@ -1256,6 +1256,7 @@ bool SemiSpace::ShrinkTo(int new_capacity) {
|
|||||||
ASSERT((new_capacity & Page::kPageAlignmentMask) == 0);
|
ASSERT((new_capacity & Page::kPageAlignmentMask) == 0);
|
||||||
ASSERT(new_capacity >= initial_capacity_);
|
ASSERT(new_capacity >= initial_capacity_);
|
||||||
ASSERT(new_capacity < capacity_);
|
ASSERT(new_capacity < capacity_);
|
||||||
|
if (is_committed()) {
|
||||||
// Semispaces grow backwards from the end of their allocated capacity,
|
// Semispaces grow backwards from the end of their allocated capacity,
|
||||||
// so we find the before and after start addresses relative to the
|
// so we find the before and after start addresses relative to the
|
||||||
// end of the space.
|
// end of the space.
|
||||||
@ -1263,17 +1264,21 @@ bool SemiSpace::ShrinkTo(int new_capacity) {
|
|||||||
Address old_start = space_end - capacity_;
|
Address old_start = space_end - capacity_;
|
||||||
size_t delta = capacity_ - new_capacity;
|
size_t delta = capacity_ - new_capacity;
|
||||||
ASSERT(IsAligned(delta, OS::AllocateAlignment()));
|
ASSERT(IsAligned(delta, OS::AllocateAlignment()));
|
||||||
if (!heap()->isolate()->memory_allocator()->UncommitBlock(old_start, delta)) {
|
|
||||||
|
MemoryAllocator* allocator = heap()->isolate()->memory_allocator();
|
||||||
|
if (!allocator->UncommitBlock(old_start, delta)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
capacity_ = new_capacity;
|
|
||||||
|
|
||||||
int pages_after = capacity_ / Page::kPageSize;
|
int pages_after = new_capacity / Page::kPageSize;
|
||||||
NewSpacePage* new_last_page =
|
NewSpacePage* new_last_page =
|
||||||
NewSpacePage::FromAddress(space_end - pages_after * Page::kPageSize);
|
NewSpacePage::FromAddress(space_end - pages_after * Page::kPageSize);
|
||||||
new_last_page->set_next_page(anchor());
|
new_last_page->set_next_page(anchor());
|
||||||
anchor()->set_prev_page(new_last_page);
|
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;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user