Index: src/heap/scavenger-inl.h |
diff --git a/src/heap/scavenger-inl.h b/src/heap/scavenger-inl.h |
index 3b96f648f79a818121e2076d961687680aed2bf3..702e736cebb31f3885c4c2015f9113fa16076157 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,7 +35,18 @@ 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); |
+} |
+ |
+// static |
+template <PromotionMode promotion_mode> |
ulan
2016/06/01 09:09:40
promotion_mode is not used in this function, so yo
Marcel Hlopko
2016/06/01 09:19:50
Aah sorry for not noticing this. Done.
|
+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); |
} |
SlotCallbackResult Scavenger::CheckAndScavengeObject( |
@@ -46,8 +57,13 @@ SlotCallbackResult Scavenger::CheckAndScavengeObject( |
HeapObject* heap_object = reinterpret_cast<HeapObject*>(object); |
DCHECK(heap_object->IsHeapObject()); |
- ScavengeObject(reinterpret_cast<HeapObject**>(slot), heap_object, |
- promotion_mode); |
+ if (promotion_mode == PROMOTE_MARKED) { |
+ ScavengeObject<PROMOTE_MARKED>(reinterpret_cast<HeapObject**>(slot), |
+ heap_object); |
+ } else { |
+ ScavengeObject<DEFAULT_PROMOTION>(reinterpret_cast<HeapObject**>(slot), |
+ heap_object); |
+ } |
object = *slot; |
// If the object was in from space before and is after executing the |
@@ -64,13 +80,14 @@ 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)); |
} |
} // namespace internal |