Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index 8415de1901d3944ea2713dc9cc59e15787941e19..b1738ee7256beb292c6f702fe69977ae1bde25f1 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -1800,8 +1800,29 @@ Address Heap::DoScavenge(ObjectVisitor* scavenge_visitor, |
// for pointers to from semispace instead of looking for pointers |
// to new space. |
DCHECK(!target->IsMap()); |
- IterateAndMarkPointersToFromSpace( |
- target->address(), target->address() + size, &ScavengeObject); |
+ Address start_address = target->address(); |
+ Address end_address = start_address + size; |
+#if V8_DOUBLE_FIELDS_UNBOXING |
+ InobjectPropertiesHelper helper(target->map()); |
+ bool has_only_tagged_fields = helper.all_fields_tagged(); |
+ |
+ if (!has_only_tagged_fields) { |
+ for (Address slot = start_address; slot < end_address; |
+ slot += kPointerSize) { |
+ if (helper.IsTagged(static_cast<int>(slot - start_address))) { |
+ // TODO(ishell): call this once for contiguous region |
+ // of tagged fields. |
+ IterateAndMarkPointersToFromSpace(slot, slot + kPointerSize, |
+ &ScavengeObject); |
+ } |
+ } |
+ } else { |
+#endif |
+ IterateAndMarkPointersToFromSpace(start_address, end_address, |
+ &ScavengeObject); |
+#if V8_DOUBLE_FIELDS_UNBOXING |
+ } |
+#endif |
} |
} |