Ensure the word after top is cleared in newspace if top < high.
BUG= R=ulan@chromium.org Review URL: https://codereview.chromium.org/151783002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19014 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
d34938fe34
commit
9e995fdd91
@ -488,7 +488,7 @@ void Heap::ScavengePointer(HeapObject** p) {
|
||||
|
||||
void Heap::UpdateAllocationSiteFeedback(HeapObject* object) {
|
||||
Heap* heap = object->GetHeap();
|
||||
ASSERT(heap->InNewSpace(object));
|
||||
ASSERT(heap->InFromSpace(object));
|
||||
|
||||
if (!FLAG_allocation_site_pretenuring ||
|
||||
!AllocationSite::CanTrack(object->map()->instance_type())) return;
|
||||
|
@ -3007,6 +3007,20 @@ void MarkCompactCollector::EvacuateNewSpace() {
|
||||
new_space->Flip();
|
||||
new_space->ResetAllocationInfo();
|
||||
|
||||
// UpdateAllocationSiteFeedback expects that only objects at the end of
|
||||
// newspace are not guaranteed to have the next word clear. It relies on
|
||||
// FromSpacePageHigh to check whether an object is at the end of newspace.
|
||||
// However, it is possible that newspace is being evacuated without it being
|
||||
// full, e.g. to make the heap iterable, hence top will not equal high. In
|
||||
// that case, fill up newspace with a filler to ensure the next word is
|
||||
// cleared.
|
||||
if (FLAG_allocation_site_pretenuring &&
|
||||
from_top < new_space->FromSpacePageHigh()) {
|
||||
Address limit = NewSpacePage::FromLimit(from_top)->area_end();
|
||||
int remaining_in_page = static_cast<int>(limit - from_top);
|
||||
heap()->CreateFillerObjectAt(from_top, remaining_in_page);
|
||||
}
|
||||
|
||||
int survivors_size = 0;
|
||||
|
||||
// First pass: traverse all objects in inactive semispace, remove marks,
|
||||
|
Loading…
Reference in New Issue
Block a user