Index: src/heap/scavenger.cc |
diff --git a/src/heap/scavenger.cc b/src/heap/scavenger.cc |
index 4fa30e2650890945097555663006d63f86040512..3e2cab6795aab13d15c9f7d2899c85d2f7215909 100644 |
--- a/src/heap/scavenger.cc |
+++ b/src/heap/scavenger.cc |
@@ -208,8 +208,8 @@ class ScavengingVisitor : public StaticVisitorBase { |
SLOW_DCHECK(object->Size() == object_size); |
Heap* heap = map->GetHeap(); |
- if (promotion_mode != FORCE_PROMOTION && |
- !heap->ShouldBePromoted(object->address(), object_size)) { |
+ if (!heap->ShouldBePromoted(object->address(), object_size, |
+ promotion_mode)) { |
// A semi-space copy may fail due to fragmentation. In that case, we |
// try to promote the object. |
if (SemiSpaceCopyObject<alignment>(map, slot, object, object_size)) { |
@@ -224,6 +224,9 @@ class ScavengingVisitor : public StaticVisitorBase { |
if (promotion_mode == FORCE_PROMOTION) { |
FatalProcessOutOfMemory("Scavenger: forced promotion\n"); |
} |
+ if (promotion_mode == PROMOTE_MARKED) { |
+ FatalProcessOutOfMemory("Scavenger: promoting marked\n"); |
+ } |
// If promotion failed, we try to copy the object to the other semi-space |
if (SemiSpaceCopyObject<alignment>(map, slot, object, object_size)) return; |
@@ -471,8 +474,12 @@ void ScavengeVisitor::VisitPointers(Object** start, Object** end) { |
void ScavengeVisitor::ScavengePointer(Object** p) { |
Object* object = *p; |
if (!heap_->InNewSpace(object)) return; |
+ PromotionMode promotion_mode = heap_->incremental_marking()->IsMarking() |
+ ? PROMOTE_MARKED |
+ : DEFAULT_PROMOTION; |
Scavenger::ScavengeObject(reinterpret_cast<HeapObject**>(p), |
- reinterpret_cast<HeapObject*>(object)); |
+ reinterpret_cast<HeapObject*>(object), |
+ promotion_mode); |
} |
} // namespace internal |