| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index 6a4acda903ed8cb6e7a95288b041f79197114b81..62c19ba3d1f01292f5f76afb348efc1a59975242 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -2084,15 +2084,17 @@ Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor,
|
| int end_of_region_offset;
|
| if (helper.IsTagged(offset, size, &end_of_region_offset)) {
|
| IterateAndMarkPointersToFromSpace(
|
| - record_slots, obj_address + offset,
|
| - obj_address + end_of_region_offset, &ScavengeObject);
|
| + target, obj_address + offset,
|
| + obj_address + end_of_region_offset, record_slots,
|
| + &ScavengeObject);
|
| }
|
| offset = end_of_region_offset;
|
| }
|
| } else {
|
| #endif
|
| - IterateAndMarkPointersToFromSpace(
|
| - record_slots, obj_address, obj_address + size, &ScavengeObject);
|
| + IterateAndMarkPointersToFromSpace(target, obj_address,
|
| + obj_address + size, record_slots,
|
| + &ScavengeObject);
|
| #if V8_DOUBLE_FIELDS_UNBOXING
|
| }
|
| #endif
|
| @@ -2418,7 +2420,7 @@ class ScavengingVisitor : public StaticVisitorBase {
|
| target->address() + JSFunction::kCodeEntryOffset;
|
| Code* code = Code::cast(Code::GetObjectFromEntryAddress(code_entry_slot));
|
| map->GetHeap()->mark_compact_collector()->RecordCodeEntrySlot(
|
| - code_entry_slot, code);
|
| + target, code_entry_slot, code);
|
| }
|
| }
|
|
|
| @@ -3582,8 +3584,8 @@ void Heap::AddAllocationSiteToScratchpad(AllocationSite* site,
|
| // candidates are not part of the global list of old space pages and
|
| // releasing an evacuation candidate due to a slots buffer overflow
|
| // results in lost pages.
|
| - mark_compact_collector()->RecordSlot(slot, slot, *slot,
|
| - SlotsBuffer::IGNORE_OVERFLOW);
|
| + mark_compact_collector()->RecordSlot(allocation_sites_scratchpad(), slot,
|
| + *slot, SlotsBuffer::IGNORE_OVERFLOW);
|
| }
|
| allocation_sites_scratchpad_length_++;
|
| }
|
| @@ -5132,33 +5134,33 @@ void Heap::ZapFromSpace() {
|
| }
|
|
|
|
|
| -void Heap::IterateAndMarkPointersToFromSpace(bool record_slots, Address start,
|
| - Address end,
|
| +void Heap::IterateAndMarkPointersToFromSpace(HeapObject* object, Address start,
|
| + Address end, bool record_slots,
|
| ObjectSlotCallback callback) {
|
| Address slot_address = start;
|
|
|
| while (slot_address < end) {
|
| Object** slot = reinterpret_cast<Object**>(slot_address);
|
| - Object* object = *slot;
|
| + Object* target = *slot;
|
| // If the store buffer becomes overfull we mark pages as being exempt from
|
| // the store buffer. These pages are scanned to find pointers that point
|
| // to the new space. In that case we may hit newly promoted objects and
|
| // fix the pointers before the promotion queue gets to them. Thus the 'if'.
|
| - if (object->IsHeapObject()) {
|
| - if (Heap::InFromSpace(object)) {
|
| + if (target->IsHeapObject()) {
|
| + if (Heap::InFromSpace(target)) {
|
| callback(reinterpret_cast<HeapObject**>(slot),
|
| - HeapObject::cast(object));
|
| - Object* new_object = *slot;
|
| - if (InNewSpace(new_object)) {
|
| - SLOW_DCHECK(Heap::InToSpace(new_object));
|
| - SLOW_DCHECK(new_object->IsHeapObject());
|
| + HeapObject::cast(target));
|
| + Object* new_target = *slot;
|
| + if (InNewSpace(new_target)) {
|
| + SLOW_DCHECK(Heap::InToSpace(new_target));
|
| + SLOW_DCHECK(new_target->IsHeapObject());
|
| store_buffer_.EnterDirectlyIntoStoreBuffer(
|
| reinterpret_cast<Address>(slot));
|
| }
|
| - SLOW_DCHECK(!MarkCompactCollector::IsOnEvacuationCandidate(new_object));
|
| + SLOW_DCHECK(!MarkCompactCollector::IsOnEvacuationCandidate(new_target));
|
| } else if (record_slots &&
|
| - MarkCompactCollector::IsOnEvacuationCandidate(object)) {
|
| - mark_compact_collector()->RecordSlot(slot, slot, object);
|
| + MarkCompactCollector::IsOnEvacuationCandidate(target)) {
|
| + mark_compact_collector()->RecordSlot(object, slot, target);
|
| }
|
| }
|
| slot_address += kPointerSize;
|
|
|