@@ -2782,6 +2782,28 @@ void MarkCompactCollector::MigrateObjectMixed(HeapObject* dst, HeapObject* src,
27822782 Address base_pointer_slot =
27832783 dst->address () + FixedTypedArrayBase::kBasePointerOffset ;
27842784 RecordMigratedSlot (Memory::Object_at (base_pointer_slot), base_pointer_slot);
2785+ } else if (src->IsJSArrayBuffer ()) {
2786+ heap ()->MoveBlock (dst->address (), src->address (), size);
2787+
2788+ // Visit inherited JSObject properties and byte length of ArrayBuffer
2789+ Address regular_slot =
2790+ dst->address () + JSArrayBuffer::BodyDescriptor::kStartOffset ;
2791+ Address regular_slots_end =
2792+ dst->address () + JSArrayBuffer::kByteLengthOffset + kPointerSize ;
2793+ while (regular_slot < regular_slots_end) {
2794+ RecordMigratedSlot (Memory::Object_at (regular_slot), regular_slot);
2795+ regular_slot += kPointerSize ;
2796+ }
2797+
2798+ // Skip backing store and visit just internal fields
2799+ Address internal_field_slot = dst->address () + JSArrayBuffer::kSize ;
2800+ Address internal_fields_end =
2801+ dst->address () + JSArrayBuffer::kSizeWithInternalFields ;
2802+ while (internal_field_slot < internal_fields_end) {
2803+ RecordMigratedSlot (Memory::Object_at (internal_field_slot),
2804+ internal_field_slot);
2805+ internal_field_slot += kPointerSize ;
2806+ }
27852807 } else if (FLAG_unbox_double_fields) {
27862808 Address dst_addr = dst->address ();
27872809 Address src_addr = src->address ();
@@ -3206,6 +3228,12 @@ bool MarkCompactCollector::IsSlotInLiveObject(Address slot) {
32063228 if (object->IsFixedTypedArrayBase ()) {
32073229 return static_cast <int >(slot - object->address ()) ==
32083230 FixedTypedArrayBase::kBasePointerOffset ;
3231+ } else if (object->IsJSArrayBuffer ()) {
3232+ int off = static_cast <int >(slot - object->address ());
3233+ return (off >= JSArrayBuffer::BodyDescriptor::kStartOffset &&
3234+ off <= JSArrayBuffer::kByteLengthOffset ) ||
3235+ (off >= JSArrayBuffer::kSize &&
3236+ off < JSArrayBuffer::kSizeWithInternalFields );
32093237 } else if (FLAG_unbox_double_fields) {
32103238 // Filter out slots that happen to point to unboxed double fields.
32113239 LayoutDescriptorHelper helper (object->map ());
0 commit comments