| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index ea25bdb69869208c12021b3c6ba1bf4e663efd56..735ae6e1a0fb08a053d55ec45898d45055df2679 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -1599,7 +1599,15 @@ class ScavengeWeakObjectRetainer : public WeakObjectRetainer {
|
| Heap* heap_;
|
| };
|
|
|
| +void Heap::Scavenge() {
|
| + if (incremental_marking()->IsMarking()) {
|
| + Scavenge<PROMOTE_MARKED>();
|
| + } else {
|
| + Scavenge<DEFAULT_PROMOTION>();
|
| + }
|
| +}
|
|
|
| +template <PromotionMode promotion_mode>
|
| void Heap::Scavenge() {
|
| TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SCAVENGE);
|
| RelocationLock relocation_lock(this);
|
| @@ -1653,7 +1661,7 @@ void Heap::Scavenge() {
|
| Address new_space_front = new_space_.ToSpaceStart();
|
| promotion_queue_.Initialize();
|
|
|
| - ScavengeVisitor scavenge_visitor(this);
|
| + ScavengeVisitor<promotion_mode> scavenge_visitor(this);
|
|
|
| if (FLAG_scavenge_reclaim_unmodified_objects) {
|
| isolate()->global_handles()->IdentifyWeakUnmodifiedObjects(
|
| @@ -1670,7 +1678,7 @@ 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);
|
| + return Scavenger::CheckAndScavengeObject<promotion_mode>(this, addr);
|
| });
|
|
|
| RememberedSet<OLD_TO_NEW>::IterateTyped(
|
| @@ -1680,8 +1688,8 @@ void Heap::Scavenge() {
|
| // 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);
|
| + return Scavenger::CheckAndScavengeObject<FORCE_PROMOTION>(
|
| + this, reinterpret_cast<Address>(addr));
|
| });
|
| });
|
| }
|
| @@ -1705,7 +1713,8 @@ void Heap::Scavenge() {
|
|
|
| {
|
| TRACE_GC(tracer(), GCTracer::Scope::SCAVENGER_SEMISPACE);
|
| - new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
|
| + new_space_front =
|
| + DoScavenge<promotion_mode>(&scavenge_visitor, new_space_front);
|
| }
|
|
|
| if (FLAG_scavenge_reclaim_unmodified_objects) {
|
| @@ -1714,12 +1723,14 @@ void Heap::Scavenge() {
|
|
|
| isolate()->global_handles()->IterateNewSpaceWeakUnmodifiedRoots(
|
| &scavenge_visitor);
|
| - new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
|
| + new_space_front =
|
| + DoScavenge<promotion_mode>(&scavenge_visitor, new_space_front);
|
| } 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<promotion_mode>(&scavenge_visitor, new_space_front);
|
| }
|
| isolate()->global_handles()->RemoveObjectGroups();
|
| isolate()->global_handles()->RemoveImplicitRefGroups();
|
| @@ -1729,7 +1740,8 @@ void Heap::Scavenge() {
|
|
|
| isolate()->global_handles()->IterateNewSpaceWeakIndependentRoots(
|
| &scavenge_visitor);
|
| - new_space_front = DoScavenge(&scavenge_visitor, new_space_front);
|
| + new_space_front =
|
| + DoScavenge<promotion_mode>(&scavenge_visitor, new_space_front);
|
| }
|
|
|
| UpdateNewSpaceReferencesInExternalStringTable(
|
| @@ -1911,7 +1923,7 @@ void Heap::VisitExternalResources(v8::ExternalResourceVisitor* visitor) {
|
| external_string_table_.Iterate(&external_string_table_visitor);
|
| }
|
|
|
| -
|
| +template <PromotionMode promotion_mode>
|
| Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor,
|
| Address new_space_front) {
|
| do {
|
| @@ -1922,8 +1934,8 @@ 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);
|
| + new_space_front += StaticScavengeVisitor<promotion_mode>::IterateBody(
|
| + object->map(), object);
|
| } else {
|
| new_space_front = Page::FromAllocationAreaAddress(new_space_front)
|
| ->next_page()
|
| @@ -1946,7 +1958,7 @@ Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor,
|
| DCHECK(!target->IsMap());
|
|
|
| IteratePromotedObject(target, static_cast<int>(size), was_marked_black,
|
| - &Scavenger::ScavengeObject);
|
| + &Scavenger::ScavengeObject<promotion_mode>);
|
| }
|
| }
|
|
|
| @@ -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,9 @@ V8_DECLARE_ONCE(initialize_gc_once);
|
|
|
| static void InitializeGCOnce() {
|
| Scavenger::Initialize();
|
| - StaticScavengeVisitor::Initialize();
|
| + StaticScavengeVisitor<DEFAULT_PROMOTION>::Initialize();
|
| + StaticScavengeVisitor<PROMOTE_MARKED>::Initialize();
|
| + StaticScavengeVisitor<FORCE_PROMOTION>::Initialize();
|
| MarkCompactCollector::Initialize();
|
| }
|
|
|
|
|