[heap] Let caller figure out target space for evacuation when compacting.

R=hpayer@chromium.org
BUG=chromium:524425
LOG=N

Review URL: https://codereview.chromium.org/1340253004

Cr-Commit-Position: refs/heads/master@{#30742}
This commit is contained in:
mlippautz 2015-09-15 04:44:48 -07:00 committed by Commit bot
parent ee86a749bf
commit 7611c3b98b
2 changed files with 9 additions and 9 deletions

View File

@ -3176,9 +3176,9 @@ void MarkCompactCollector::EvacuateNewSpace() {
}
void MarkCompactCollector::EvacuateLiveObjectsFromPage(Page* p) {
void MarkCompactCollector::EvacuateLiveObjectsFromPage(
Page* p, PagedSpace* target_space) {
AlwaysAllocateScope always_allocate(isolate());
PagedSpace* space = static_cast<PagedSpace*>(p->owner());
DCHECK(p->IsEvacuationCandidate() && !p->WasSwept());
p->SetWasSwept();
@ -3199,12 +3199,12 @@ void MarkCompactCollector::EvacuateLiveObjectsFromPage(Page* p) {
int size = object->Size();
AllocationAlignment alignment = object->RequiredAlignment();
HeapObject* target_object = nullptr;
AllocationResult allocation = space->AllocateRaw(size, alignment);
AllocationResult allocation = target_space->AllocateRaw(size, alignment);
if (!allocation.To(&target_object)) {
// If allocation failed, use emergency memory and re-try allocation.
CHECK(space->HasEmergencyMemory());
space->UseEmergencyMemory();
allocation = space->AllocateRaw(size, alignment);
CHECK(target_space->HasEmergencyMemory());
target_space->UseEmergencyMemory();
allocation = target_space->AllocateRaw(size, alignment);
}
if (!allocation.To(&target_object)) {
// OS refused to give us memory.
@ -3212,7 +3212,7 @@ void MarkCompactCollector::EvacuateLiveObjectsFromPage(Page* p) {
return;
}
MigrateObject(target_object, object, size, space->identity());
MigrateObject(target_object, object, size, target_space->identity());
DCHECK(object->map_word().IsForwardingAddress());
}
@ -3256,7 +3256,7 @@ void MarkCompactCollector::EvacuatePages() {
// up a page. Check that we actually got an emergency page above so we
// can guarantee that this succeeds.
if (space->HasEmergencyMemory()) {
EvacuateLiveObjectsFromPage(p);
EvacuateLiveObjectsFromPage(p, static_cast<PagedSpace*>(p->owner()));
// Unlink the page from the list of pages here. We must not iterate
// over that page later (e.g. when scan on scavenge pages are
// processed). The page itself will be freed later and is still

View File

@ -881,7 +881,7 @@ class MarkCompactCollector {
void EvacuateNewSpace();
void EvacuateLiveObjectsFromPage(Page* p);
void EvacuateLiveObjectsFromPage(Page* p, PagedSpace* target_space);
void EvacuatePages();