Unify mechanism to find trailing AllocationMementos
R=hpayer@chromium.org Review URL: https://codereview.chromium.org/234703003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20675 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
c5231ccba6
commit
6f2bea967c
@ -490,6 +490,41 @@ void Heap::ScavengePointer(HeapObject** p) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AllocationMemento* Heap::FindAllocationMemento(HeapObject* object) {
|
||||||
|
// Check if there is potentially a memento behind the object. If
|
||||||
|
// the last word of the momento is on another page we return
|
||||||
|
// immediately.
|
||||||
|
Address object_address = object->address();
|
||||||
|
Address memento_address = object_address + object->Size();
|
||||||
|
Address last_memento_word_address = memento_address + kPointerSize;
|
||||||
|
if (!NewSpacePage::OnSamePage(object_address,
|
||||||
|
last_memento_word_address)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeapObject* candidate = HeapObject::FromAddress(memento_address);
|
||||||
|
if (candidate->map() != allocation_memento_map()) return NULL;
|
||||||
|
|
||||||
|
// Either the object is the last object in the new space, or there is another
|
||||||
|
// object of at least word size (the header map word) following it, so
|
||||||
|
// suffices to compare ptr and top here. Note that technically we do not have
|
||||||
|
// to compare with the current top pointer of the from space page during GC,
|
||||||
|
// since we always install filler objects above the top pointer of a from
|
||||||
|
// space page when performing a garbage collection. However, always performing
|
||||||
|
// the test makes it possible to have a single, unified version of
|
||||||
|
// FindAllocationMemento that is used both by the GC and the mutator.
|
||||||
|
Address top = NewSpaceTop();
|
||||||
|
ASSERT(memento_address == top ||
|
||||||
|
memento_address + HeapObject::kHeaderSize <= top ||
|
||||||
|
!NewSpacePage::OnSamePage(memento_address, top));
|
||||||
|
if (memento_address == top) return NULL;
|
||||||
|
|
||||||
|
AllocationMemento* memento = AllocationMemento::cast(candidate);
|
||||||
|
if (!memento->IsValid()) return NULL;
|
||||||
|
return memento;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Heap::UpdateAllocationSiteFeedback(HeapObject* object,
|
void Heap::UpdateAllocationSiteFeedback(HeapObject* object,
|
||||||
ScratchpadSlotMode mode) {
|
ScratchpadSlotMode mode) {
|
||||||
Heap* heap = object->GetHeap();
|
Heap* heap = object->GetHeap();
|
||||||
@ -498,25 +533,8 @@ void Heap::UpdateAllocationSiteFeedback(HeapObject* object,
|
|||||||
if (!FLAG_allocation_site_pretenuring ||
|
if (!FLAG_allocation_site_pretenuring ||
|
||||||
!AllocationSite::CanTrack(object->map()->instance_type())) return;
|
!AllocationSite::CanTrack(object->map()->instance_type())) return;
|
||||||
|
|
||||||
// Check if there is potentially a memento behind the object. If
|
AllocationMemento* memento = heap->FindAllocationMemento(object);
|
||||||
// the last word of the momento is on another page we return
|
if (memento == NULL) return;
|
||||||
// immediatelly. Note that we do not have to compare with the current
|
|
||||||
// top pointer of the from space page, since we always install filler
|
|
||||||
// objects above the top pointer of a from space page when performing
|
|
||||||
// a garbage collection.
|
|
||||||
Address object_address = object->address();
|
|
||||||
Address memento_address = object_address + object->Size();
|
|
||||||
Address last_memento_word_address = memento_address + kPointerSize;
|
|
||||||
if (!NewSpacePage::OnSamePage(object_address,
|
|
||||||
last_memento_word_address)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
HeapObject* candidate = HeapObject::FromAddress(memento_address);
|
|
||||||
if (candidate->map() != heap->allocation_memento_map()) return;
|
|
||||||
|
|
||||||
AllocationMemento* memento = AllocationMemento::cast(candidate);
|
|
||||||
if (!memento->IsValid()) return;
|
|
||||||
|
|
||||||
if (memento->GetAllocationSite()->IncrementMementoFoundCount()) {
|
if (memento->GetAllocationSite()->IncrementMementoFoundCount()) {
|
||||||
heap->AddAllocationSiteToScratchpad(memento->GetAllocationSite(), mode);
|
heap->AddAllocationSiteToScratchpad(memento->GetAllocationSite(), mode);
|
||||||
|
@ -1452,6 +1452,10 @@ class Heap {
|
|||||||
RECORD_SCRATCHPAD_SLOT
|
RECORD_SCRATCHPAD_SLOT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// If an object has an AllocationMemento trailing it, return it, otherwise
|
||||||
|
// return NULL;
|
||||||
|
inline AllocationMemento* FindAllocationMemento(HeapObject* object);
|
||||||
|
|
||||||
// An object may have an AllocationSite associated with it through a trailing
|
// An object may have an AllocationSite associated with it through a trailing
|
||||||
// AllocationMemento. Its feedback should be updated when objects are found
|
// AllocationMemento. Its feedback should be updated when objects are found
|
||||||
// in the heap.
|
// in the heap.
|
||||||
|
@ -12778,30 +12778,9 @@ void JSObject::UpdateAllocationSite(Handle<JSObject> object,
|
|||||||
Handle<AllocationSite> site;
|
Handle<AllocationSite> site;
|
||||||
{
|
{
|
||||||
DisallowHeapAllocation no_allocation;
|
DisallowHeapAllocation no_allocation;
|
||||||
// Check if there is potentially a memento behind the object. If
|
|
||||||
// the last word of the momento is on another page we return
|
|
||||||
// immediatelly.
|
|
||||||
Address object_address = object->address();
|
|
||||||
Address memento_address = object_address + JSArray::kSize;
|
|
||||||
Address last_memento_word_address = memento_address + kPointerSize;
|
|
||||||
if (!NewSpacePage::OnSamePage(object_address,
|
|
||||||
last_memento_word_address)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Either object is the last object in the new space, or there is another
|
AllocationMemento* memento = heap->FindAllocationMemento(*object);
|
||||||
// object of at least word size (the header map word) following it, so
|
if (memento == NULL) return;
|
||||||
// suffices to compare ptr and top here.
|
|
||||||
Address top = heap->NewSpaceTop();
|
|
||||||
ASSERT(memento_address == top ||
|
|
||||||
memento_address + HeapObject::kHeaderSize <= top);
|
|
||||||
if (memento_address == top) return;
|
|
||||||
|
|
||||||
HeapObject* candidate = HeapObject::FromAddress(memento_address);
|
|
||||||
if (candidate->map() != heap->allocation_memento_map()) return;
|
|
||||||
|
|
||||||
AllocationMemento* memento = AllocationMemento::cast(candidate);
|
|
||||||
if (!memento->IsValid()) return;
|
|
||||||
|
|
||||||
// Walk through to the Allocation Site
|
// Walk through to the Allocation Site
|
||||||
site = handle(memento->GetAllocationSite());
|
site = handle(memento->GetAllocationSite());
|
||||||
|
Loading…
Reference in New Issue
Block a user