| Index: src/heap-inl.h
|
| diff --git a/src/heap-inl.h b/src/heap-inl.h
|
| index ea7dcda3b0acd8aee62f2507a5ab5852bd7196d1..ae10b3a121a30d4f064eea7091e4b2f384309290 100644
|
| --- a/src/heap-inl.h
|
| +++ b/src/heap-inl.h
|
| @@ -490,33 +490,51 @@ void Heap::ScavengePointer(HeapObject** p) {
|
| }
|
|
|
|
|
| -void Heap::UpdateAllocationSiteFeedback(HeapObject* object,
|
| - ScratchpadSlotMode mode) {
|
| - Heap* heap = object->GetHeap();
|
| - ASSERT(heap->InFromSpace(object));
|
| -
|
| - if (!FLAG_allocation_site_pretenuring ||
|
| - !AllocationSite::CanTrack(object->map()->instance_type())) return;
|
| -
|
| +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
|
| - // 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.
|
| + // 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;
|
| + return NULL;
|
| }
|
|
|
| HeapObject* candidate = HeapObject::FromAddress(memento_address);
|
| - if (candidate->map() != heap->allocation_memento_map()) return;
|
| + 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;
|
| + if (!memento->IsValid()) return NULL;
|
| + return memento;
|
| +}
|
| +
|
| +
|
| +void Heap::UpdateAllocationSiteFeedback(HeapObject* object,
|
| + ScratchpadSlotMode mode) {
|
| + Heap* heap = object->GetHeap();
|
| + ASSERT(heap->InFromSpace(object));
|
| +
|
| + if (!FLAG_allocation_site_pretenuring ||
|
| + !AllocationSite::CanTrack(object->map()->instance_type())) return;
|
| +
|
| + AllocationMemento* memento = heap->FindAllocationMemento(object);
|
| + if (memento == NULL) return;
|
|
|
| if (memento->GetAllocationSite()->IncrementMementoFoundCount()) {
|
| heap->AddAllocationSiteToScratchpad(memento->GetAllocationSite(), mode);
|
|
|