From: marja@chromium.org Date: Wed, 25 Jun 2014 07:20:13 +0000 (+0000) Subject: Revert "Update survival statistics correctly in the Scavenger." X-Git-Tag: upstream/4.7.83~8560 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=31ab363c82104c62849a08b9d3b368e52e143056;p=platform%2Fupstream%2Fv8.git Revert "Update survival statistics correctly in the Scavenger." This reverts r21991. Reason: lots of test failures. BUG= TBR=hpayer@chromium.org Review URL: https://codereview.chromium.org/352083002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21992 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/heap.cc b/src/heap.cc index 627ea77..4dea510 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -1986,14 +1986,17 @@ class ScavengingVisitor : public StaticVisitorBase { } Heap* heap = map->GetHeap(); - AllocationResult allocation; + if (heap->ShouldBePromoted(object->address(), object_size)) { + AllocationResult allocation; - if (!heap->ShouldBePromoted(object->address(), object_size)) { - ASSERT(heap->AllowedToBeMigrated(object, NEW_SPACE)); - allocation = heap->new_space()->AllocateRaw(allocation_size); + if (object_contents == DATA_OBJECT) { + ASSERT(heap->AllowedToBeMigrated(object, OLD_DATA_SPACE)); + allocation = heap->old_data_space()->AllocateRaw(allocation_size); + } else { + ASSERT(heap->AllowedToBeMigrated(object, OLD_POINTER_SPACE)); + allocation = heap->old_pointer_space()->AllocateRaw(allocation_size); + } - // Allocation in the other semi-space may fail due to fragmentation. - // In that case we allocate in the old generation. HeapObject* target = NULL; // Initialization to please compiler. if (allocation.To(&target)) { if (alignment != kObjectAlignment) { @@ -2006,48 +2009,49 @@ class ScavengingVisitor : public StaticVisitorBase { *slot = target; MigrateObject(heap, object, target, object_size); - heap->promotion_queue()->SetNewLimit(heap->new_space()->top()); - heap->IncrementSemiSpaceCopiedObjectSize(object_size); + if (object_contents == POINTER_OBJECT) { + if (map->instance_type() == JS_FUNCTION_TYPE) { + heap->promotion_queue()->insert( + target, JSFunction::kNonWeakFieldsEndOffset); + } else { + heap->promotion_queue()->insert(target, object_size); + } + } + + heap->IncrementPromotedObjectsSize(object_size); return; } } - - if (object_contents == DATA_OBJECT) { - ASSERT(heap->AllowedToBeMigrated(object, OLD_DATA_SPACE)); - allocation = heap->old_data_space()->AllocateRaw(allocation_size); - } else { - ASSERT(heap->AllowedToBeMigrated(object, OLD_POINTER_SPACE)); - allocation = heap->old_pointer_space()->AllocateRaw(allocation_size); - } - - HeapObject* target = NULL; // Initialization to please compiler. - if (allocation.To(&target)) { - if (alignment != kObjectAlignment) { - target = EnsureDoubleAligned(heap, target, allocation_size); + ASSERT(heap->AllowedToBeMigrated(object, NEW_SPACE)); + AllocationResult allocation = + heap->new_space()->AllocateRaw(allocation_size); + heap->promotion_queue()->SetNewLimit(heap->new_space()->top()); + + // Allocation in the other semi-space may fail due to fragmentation. + // In that case we allocate in the old generation. + if (allocation.IsRetry()) { + if (object_contents == DATA_OBJECT) { + ASSERT(heap->AllowedToBeMigrated(object, OLD_DATA_SPACE)); + allocation = heap->old_data_space()->AllocateRaw(allocation_size); + } else { + ASSERT(heap->AllowedToBeMigrated(object, OLD_POINTER_SPACE)); + allocation = heap->old_pointer_space()->AllocateRaw(allocation_size); } + } - // Order is important: slot might be inside of the target if target - // was allocated over a dead object and slot comes from the store - // buffer. - *slot = target; - MigrateObject(heap, object, target, object_size); - - if (object_contents == POINTER_OBJECT) { - if (map->instance_type() == JS_FUNCTION_TYPE) { - heap->promotion_queue()->insert(target, - JSFunction::kNonWeakFieldsEndOffset); - } else { - heap->promotion_queue()->insert(target, object_size); - } - } + HeapObject* target = HeapObject::cast(allocation.ToObjectChecked()); - heap->IncrementPromotedObjectsSize(object_size); - return; + if (alignment != kObjectAlignment) { + target = EnsureDoubleAligned(heap, target, allocation_size); } - // The scavenger should always have enough space available in the old - // generation for promotion. Otherwise a full gc would have been triggered. - UNREACHABLE(); + // Order is important: slot might be inside of the target if target + // was allocated over a dead object and slot comes from the store + // buffer. + *slot = target; + MigrateObject(heap, object, target, object_size); + heap->IncrementSemiSpaceCopiedObjectSize(object_size); + return; }