Index: src/heap/mark-compact.cc |
diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc |
index f309eae9d1406150cd4dba059e238e0254d7c4ae..6eb6f0166ce5700bacbe23d7fcde1503655a7438 100644 |
--- a/src/heap/mark-compact.cc |
+++ b/src/heap/mark-compact.cc |
@@ -2808,12 +2808,23 @@ void MarkCompactCollector::MigrateObject(HeapObject* dst, HeapObject* src, |
Address dst_slot = dst_addr; |
DCHECK(IsAligned(size, kPointerSize)); |
+ bool may_contain_raw_values = src->MayContainRawValues(); |
+#if V8_DOUBLE_FIELDS_UNBOXING |
+ InobjectPropertiesHelper helper(src->map()); |
+ bool has_only_tagged_fields = helper.all_fields_tagged(); |
+#endif |
for (int remaining = size / kPointerSize; remaining > 0; remaining--) { |
Object* value = Memory::Object_at(src_slot); |
Memory::Object_at(dst_slot) = value; |
- if (!src->MayContainRawValues()) { |
+#if V8_DOUBLE_FIELDS_UNBOXING |
+ if (!may_contain_raw_values && |
+ (has_only_tagged_fields || helper.IsTagged(src_slot - src_addr))) |
+#else |
+ if (!may_contain_raw_values) |
+#endif |
+ { |
RecordMigratedSlot(value, dst_slot); |
} |