| 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
|
|
|