Chromium Code Reviews| Index: src/heap/heap.cc |
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
| index ea25bdb69869208c12021b3c6ba1bf4e663efd56..89dc0870144eea3a78ae9fd7c5c24aadec3039ca 100644 |
| --- a/src/heap/heap.cc |
| +++ b/src/heap/heap.cc |
| @@ -1653,6 +1653,7 @@ void Heap::Scavenge() { |
| Address new_space_front = new_space_.ToSpaceStart(); |
| promotion_queue_.Initialize(); |
| + PromotionMode promotion_mode = CurrentPromotionMode(); |
| ScavengeVisitor scavenge_visitor(this); |
| if (FLAG_scavenge_reclaim_unmodified_objects) { |
| @@ -1669,19 +1670,20 @@ void Heap::Scavenge() { |
| { |
| // Copy objects reachable from the old generation. |
| TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_OLD_TO_NEW_POINTERS); |
| - RememberedSet<OLD_TO_NEW>::Iterate(this, [this](Address addr) { |
| - return Scavenger::CheckAndScavengeObject(this, addr, DEFAULT_PROMOTION); |
| - }); |
| + RememberedSet<OLD_TO_NEW>::Iterate( |
| + this, [this, promotion_mode](Address addr) { |
|
ulan
2016/06/01 11:53:34
promotion mode is not needed here and below in Ite
|
| + return Scavenger::CheckAndScavengeObject(this, addr, promotion_mode); |
| + }); |
| RememberedSet<OLD_TO_NEW>::IterateTyped( |
| - this, [this](SlotType type, Address addr) { |
| + this, [this, promotion_mode](SlotType type, Address addr) { |
| return UpdateTypedSlotHelper::UpdateTypedSlot( |
| - isolate(), type, addr, [this](Object** addr) { |
| + isolate(), type, addr, [this, promotion_mode](Object** addr) { |
| // We expect that objects referenced by code are long living. |
| // If we do not force promotion, then we need to clear |
| // old_to_new slots in dead code objects after mark-compact. |
| return Scavenger::CheckAndScavengeObject( |
| - this, reinterpret_cast<Address>(addr), FORCE_PROMOTION); |
| + this, reinterpret_cast<Address>(addr), promotion_mode); |
| }); |
| }); |
| } |
| @@ -1705,7 +1707,8 @@ void Heap::Scavenge() { |
| { |
| TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE); |
| - new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
| + new_space_front = |
| + DoScavenge(&scavenge_visitor, new_space_front, promotion_mode); |
| } |
| if (FLAG_scavenge_reclaim_unmodified_objects) { |
| @@ -1714,12 +1717,14 @@ void Heap::Scavenge() { |
| isolate()->global_handles()->IterateNewSpaceWeakUnmodifiedRoots( |
| &scavenge_visitor); |
| - new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
| + new_space_front = |
| + DoScavenge(&scavenge_visitor, new_space_front, promotion_mode); |
| } else { |
| TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_OBJECT_GROUPS); |
| while (isolate()->global_handles()->IterateObjectGroups( |
| &scavenge_visitor, &IsUnscavengedHeapObject)) { |
| - new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
| + new_space_front = |
| + DoScavenge(&scavenge_visitor, new_space_front, promotion_mode); |
| } |
| isolate()->global_handles()->RemoveObjectGroups(); |
| isolate()->global_handles()->RemoveImplicitRefGroups(); |
| @@ -1729,7 +1734,8 @@ void Heap::Scavenge() { |
| isolate()->global_handles()->IterateNewSpaceWeakIndependentRoots( |
| &scavenge_visitor); |
| - new_space_front = DoScavenge(&scavenge_visitor, new_space_front); |
| + new_space_front = |
| + DoScavenge(&scavenge_visitor, new_space_front, promotion_mode); |
| } |
| UpdateNewSpaceReferencesInExternalStringTable( |
| @@ -1911,9 +1917,9 @@ void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) { |
| external_string_table_.Iterate(&external_string_table_visitor); |
| } |
| - |
| Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor, |
| - Address new_space_front) { |
| + Address new_space_front, |
| + PromotionMode promotion_mode) { |
| do { |
| SemiSpace::AssertValidRange(new_space_front, new_space_.top()); |
| // The addresses new_space_front and new_space_.top() define a |
| @@ -1922,8 +1928,14 @@ Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor, |
| while (new_space_front != new_space_.top()) { |
| if (!Page::IsAlignedToPageSize(new_space_front)) { |
| HeapObject* object = HeapObject::FromAddress(new_space_front); |
| - new_space_front += |
| - StaticScavengeVisitor::IterateBody(object->map(), object); |
| + if (promotion_mode == PROMOTE_MARKED) { |
| + new_space_front += StaticScavengeVisitor<PROMOTE_MARKED>::IterateBody( |
| + object->map(), object); |
| + } else { |
| + new_space_front += |
| + StaticScavengeVisitor<DEFAULT_PROMOTION>::IterateBody( |
| + object->map(), object); |
| + } |
| } else { |
| new_space_front = Page::FromAllocationAreaAddress(new_space_front) |
| ->next_page() |
| @@ -4689,8 +4701,8 @@ void Heap::IteratePromotedObjectPointers(HeapObject* object, Address start, |
| Object* target = *slot; |
| if (target->IsHeapObject()) { |
| if (Heap::InFromSpace(target)) { |
| - callback(reinterpret_cast<HeapObject**>(slot), HeapObject::cast(target), |
| - DEFAULT_PROMOTION); |
| + callback(reinterpret_cast<HeapObject**>(slot), |
| + HeapObject::cast(target)); |
| Object* new_target = *slot; |
| if (InNewSpace(new_target)) { |
| SLOW_DCHECK(Heap::InToSpace(new_target)); |
| @@ -5232,7 +5244,8 @@ V8_DECLARE_ONCE(initialize_gc_once); |
| static void InitializeGCOnce() { |
| Scavenger::Initialize(); |
| - StaticScavengeVisitor::Initialize(); |
| + StaticScavengeVisitor<DEFAULT_PROMOTION>::Initialize(); |
| + StaticScavengeVisitor<PROMOTE_MARKED>::Initialize(); |
| MarkCompactCollector::Initialize(); |
| } |