diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp index aa189fcd0f..980a729b64 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp @@ -588,19 +588,26 @@ JS_ENUMERATE_TYPED_ARRAYS #undef __JS_ENUMERATE // 10.4.5.9 MakeTypedArrayWithBufferWitnessRecord ( obj, order ), https://tc39.es/ecma262/#sec-maketypedarraywithbufferwitnessrecord -TypedArrayWithBufferWitness make_typed_array_with_buffer_witness_record_for_known_attached_array(TypedArrayBase const& typed_array, ArrayBuffer::Order order) +TypedArrayWithBufferWitness make_typed_array_with_buffer_witness_record(TypedArrayBase const& typed_array, ArrayBuffer::Order order) { // 1. Let buffer be obj.[[ViewedArrayBuffer]]. auto* buffer = typed_array.viewed_array_buffer(); + ByteLength byte_length { 0 }; + // 2. If IsDetachedBuffer(buffer) is true, then - // a. Let byteLength be detached. + if (buffer->is_detached()) { + // a. Let byteLength be detached. + byte_length = ByteLength::detached(); + } // 3. Else, - // a. Let byteLength be ArrayBufferByteLength(buffer, order). - auto byte_length = array_buffer_byte_length(*buffer, order); + else { + // a. Let byteLength be ArrayBufferByteLength(buffer, order). + byte_length = array_buffer_byte_length(*buffer, order); + } // 4. Return the TypedArray With Buffer Witness Record { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength }. - return { .object = typed_array, .cached_buffer_byte_length = byte_length }; + return { .object = typed_array, .cached_buffer_byte_length = move(byte_length) }; } // 10.4.5.11 TypedArrayByteLength ( taRecord ), https://tc39.es/ecma262/#sec-typedarraybytelength @@ -703,7 +710,7 @@ bool is_typed_array_out_of_bounds_for_known_attached_array(TypedArrayWithBufferW bool is_valid_integer_index_slow_case(TypedArrayBase const& typed_array, CanonicalIndex property_index) { // 4. Let taRecord be MakeTypedArrayWithBufferWitnessRecord(O, unordered). - auto typed_array_record = make_typed_array_with_buffer_witness_record_for_known_attached_array(typed_array, ArrayBuffer::Unordered); + auto typed_array_record = make_typed_array_with_buffer_witness_record(typed_array, ArrayBuffer::Unordered); // 5. NOTE: Bounds checking is not a synchronizing operation when O's backing buffer is a growable SharedArrayBuffer. diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.h b/Userland/Libraries/LibJS/Runtime/TypedArray.h index 1126c09387..7eb31aa4ad 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.h @@ -94,21 +94,10 @@ struct TypedArrayWithBufferWitness { ByteLength cached_buffer_byte_length; // [[CachedBufferByteLength]] }; +TypedArrayWithBufferWitness make_typed_array_with_buffer_witness_record(TypedArrayBase const&, ArrayBuffer::Order); u32 typed_array_byte_length(TypedArrayWithBufferWitness const&); bool is_typed_array_out_of_bounds(TypedArrayWithBufferWitness const&); -// Fast-path version of MakeTypedArrayWithBufferWitnessRecord when you already know the TA is not detached. -TypedArrayWithBufferWitness make_typed_array_with_buffer_witness_record_for_known_attached_array(TypedArrayBase const&, ArrayBuffer::Order); - -// 10.4.5.9 MakeTypedArrayWithBufferWitnessRecord ( obj, order ), https://tc39.es/ecma262/#sec-maketypedarraywithbufferwitnessrecord -inline TypedArrayWithBufferWitness make_typed_array_with_buffer_witness_record(TypedArrayBase const& typed_array, ArrayBuffer::Order order) -{ - if (typed_array.viewed_array_buffer()->is_detached()) - return { .object = typed_array, .cached_buffer_byte_length = ByteLength::detached() }; - - return make_typed_array_with_buffer_witness_record_for_known_attached_array(typed_array, order); -} - // Fast-path version of TypedArrayLength when you already know the TA is within its bounds, // i.e. you previously checked IsTypedArrayOutOfBounds. u32 typed_array_length_with_known_valid_bounds(TypedArrayWithBufferWitness const&);