| 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);
|
| }
|
|
|
|
|