@@ -2755,6 +2755,28 @@ void MarkCompactCollector::MigrateObjectMixed(HeapObject* dst, HeapObject* src,
2755
2755
Address base_pointer_slot =
2756
2756
dst->address () + FixedTypedArrayBase::kBasePointerOffset ;
2757
2757
RecordMigratedSlot (Memory::Object_at (base_pointer_slot), base_pointer_slot);
2758
+ } else if (src->IsJSArrayBuffer ()) {
2759
+ heap ()->MoveBlock (dst->address (), src->address (), size);
2760
+
2761
+ // Visit inherited JSObject properties and byte length of ArrayBuffer
2762
+ Address regular_slot =
2763
+ dst->address () + JSArrayBuffer::BodyDescriptor::kStartOffset ;
2764
+ Address regular_slots_end =
2765
+ dst->address () + JSArrayBuffer::kByteLengthOffset + kPointerSize ;
2766
+ while (regular_slot < regular_slots_end) {
2767
+ RecordMigratedSlot (Memory::Object_at (regular_slot), regular_slot);
2768
+ regular_slot += kPointerSize ;
2769
+ }
2770
+
2771
+ // Skip backing store and visit just internal fields
2772
+ Address internal_field_slot = dst->address () + JSArrayBuffer::kSize ;
2773
+ Address internal_fields_end =
2774
+ dst->address () + JSArrayBuffer::kSizeWithInternalFields ;
2775
+ while (internal_field_slot < internal_fields_end) {
2776
+ RecordMigratedSlot (Memory::Object_at (internal_field_slot),
2777
+ internal_field_slot);
2778
+ internal_field_slot += kPointerSize ;
2779
+ }
2758
2780
} else if (FLAG_unbox_double_fields) {
2759
2781
Address dst_addr = dst->address ();
2760
2782
Address src_addr = src->address ();
@@ -3178,6 +3200,12 @@ bool MarkCompactCollector::IsSlotInLiveObject(Address slot) {
3178
3200
if (object->IsFixedTypedArrayBase ()) {
3179
3201
return static_cast <int >(slot - object->address ()) ==
3180
3202
FixedTypedArrayBase::kBasePointerOffset ;
3203
+ } else if (object->IsJSArrayBuffer ()) {
3204
+ int off = static_cast <int >(slot - object->address ());
3205
+ return (off >= JSArrayBuffer::BodyDescriptor::kStartOffset &&
3206
+ off <= JSArrayBuffer::kByteLengthOffset ) ||
3207
+ (off >= JSArrayBuffer::kSize &&
3208
+ off < JSArrayBuffer::kSizeWithInternalFields );
3181
3209
} else if (FLAG_unbox_double_fields) {
3182
3210
// Filter out slots that happen to point to unboxed double fields.
3183
3211
LayoutDescriptorHelper helper (object->map ());
0 commit comments