Chromium Code Reviews| Index: src/heap/scavenger-inl.h |
| diff --git a/src/heap/scavenger-inl.h b/src/heap/scavenger-inl.h |
| index 3b96f648f79a818121e2076d961687680aed2bf3..beec7569f1ee9f35699ad76e15ff17ab5835bcf1 100644 |
| --- a/src/heap/scavenger-inl.h |
| +++ b/src/heap/scavenger-inl.h |
| @@ -10,8 +10,8 @@ |
| namespace v8 { |
| namespace internal { |
| -void Scavenger::ScavengeObject(HeapObject** p, HeapObject* object, |
| - PromotionMode promotion_mode) { |
| +template <PromotionMode promotion_mode> |
| +void Scavenger::ScavengeObject(HeapObject** p, HeapObject* object) { |
| DCHECK(object->GetIsolate()->heap()->InFromSpace(object)); |
| // We use the first word (where the map pointer usually is) of a heap |
| @@ -35,19 +35,31 @@ void Scavenger::ScavengeObject(HeapObject** p, HeapObject* object, |
| // AllocationMementos are unrooted and shouldn't survive a scavenge |
| DCHECK(object->map() != object->GetHeap()->allocation_memento_map()); |
| // Call the slow part of scavenge object. |
| - return ScavengeObjectSlow(p, object, promotion_mode); |
| + return ScavengeObjectSlow<promotion_mode>(p, object); |
| } |
| -SlotCallbackResult Scavenger::CheckAndScavengeObject( |
| - Heap* heap, Address slot_address, PromotionMode promotion_mode) { |
| +// static |
| +template <PromotionMode promotion_mode> |
|
ulan
2016/05/30 16:09:06
Since the promotion_mode is not used, I would drop
|
| +void Scavenger::ScavengeObjectSlow(HeapObject** p, HeapObject* object) { |
| + SLOW_DCHECK(object->GetIsolate()->heap()->InFromSpace(object)); |
| + MapWord first_word = object->map_word(); |
| + SLOW_DCHECK(!first_word.IsForwardingAddress()); |
| + Map* map = first_word.ToMap(); |
| + Scavenger* scavenger = map->GetHeap()->scavenge_collector_; |
| + scavenger->scavenging_visitors_table_.GetVisitor(map)(map, p, object); |
| +} |
| + |
| +template <PromotionMode promotion_mode> |
| +SlotCallbackResult Scavenger::CheckAndScavengeObject(Heap* heap, |
| + Address slot_address) { |
| Object** slot = reinterpret_cast<Object**>(slot_address); |
| Object* object = *slot; |
| if (heap->InFromSpace(object)) { |
| HeapObject* heap_object = reinterpret_cast<HeapObject*>(object); |
| DCHECK(heap_object->IsHeapObject()); |
| - ScavengeObject(reinterpret_cast<HeapObject**>(slot), heap_object, |
| - promotion_mode); |
| + ScavengeObject<promotion_mode>(reinterpret_cast<HeapObject**>(slot), |
| + heap_object); |
| object = *slot; |
| // If the object was in from space before and is after executing the |
| @@ -64,13 +76,34 @@ SlotCallbackResult Scavenger::CheckAndScavengeObject( |
| } |
| // static |
| -void StaticScavengeVisitor::VisitPointer(Heap* heap, HeapObject* obj, |
| - Object** p) { |
| +template <PromotionMode promotion_mode> |
| +void StaticScavengeVisitor<promotion_mode>::VisitPointer(Heap* heap, |
| + HeapObject* obj, |
| + Object** p) { |
| Object* object = *p; |
| if (!heap->InNewSpace(object)) return; |
| - Scavenger::ScavengeObject(reinterpret_cast<HeapObject**>(p), |
| - reinterpret_cast<HeapObject*>(object), |
| - DEFAULT_PROMOTION); |
| + Scavenger::ScavengeObject<promotion_mode>( |
| + reinterpret_cast<HeapObject**>(p), reinterpret_cast<HeapObject*>(object)); |
| +} |
| + |
| +template <PromotionMode promotion_mode> |
| +void ScavengeVisitor<promotion_mode>::VisitPointer(Object** p) { |
| + ScavengePointer(p); |
| +} |
| + |
| +template <PromotionMode promotion_mode> |
| +void ScavengeVisitor<promotion_mode>::VisitPointers(Object** start, |
| + Object** end) { |
| + // Copy all HeapObject pointers in [start, end) |
| + for (Object** p = start; p < end; p++) ScavengePointer(p); |
| +} |
| + |
| +template <PromotionMode promotion_mode> |
| +void ScavengeVisitor<promotion_mode>::ScavengePointer(Object** p) { |
| + Object* object = *p; |
| + if (!heap_->InNewSpace(object)) return; |
| + Scavenger::ScavengeObject<promotion_mode>( |
| + reinterpret_cast<HeapObject**>(p), reinterpret_cast<HeapObject*>(object)); |
| } |
| } // namespace internal |