| Index: src/heap/mark-compact.cc
|
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
|
| index 2cefebf980ea1625a81e9e097623c68f12320363..1baae147d48e8082d0f4182d2d44562d68c9f55b 100644
|
| --- a/src/heap/mark-compact.cc
|
| +++ b/src/heap/mark-compact.cc
|
| @@ -2810,12 +2810,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);
|
| }
|
|
|
|
|