@@ -4,7 +4,7 @@ use std::sync::atomic::Ordering;
44
55use crate :: {
66 Context , JsExpect , JsNativeError , JsResult , JsString , JsValue ,
7- builtins:: array_buffer:: BufferObject ,
7+ builtins:: array_buffer:: { BufferObject , BufferRef } ,
88 object:: {
99 JsData , JsObject ,
1010 internal_methods:: {
@@ -279,6 +279,26 @@ impl TypedArray {
279279 // 4. Return true.
280280 Some ( index)
281281 }
282+
283+ /// Abstract operation `IsTypedArrayFixedLength ( O )`.
284+ ///
285+ /// More information:
286+ /// - [ECMAScript reference][spec]
287+ ///
288+ /// [spec]: https://tc39.es/ecma262/#sec-istypedarrayfixedlength
289+ fn is_fixed_length ( & self ) -> bool {
290+ // 1. If O.[[ArrayLength]] is auto, return false.
291+ if self . is_auto_length ( ) {
292+ return false ;
293+ }
294+
295+ // 2. Let buffer be O.[[ViewedArrayBuffer]].
296+ match self . viewed_array_buffer ( ) . as_buffer ( ) {
297+ // 3. If IsFixedLengthArrayBuffer(buffer) is false and IsSharedArrayBuffer(buffer) is false, return false.
298+ BufferRef :: Buffer ( buf) => buf. is_fixed_len ( ) ,
299+ BufferRef :: SharedBuffer ( _) => true ,
300+ }
301+ }
282302}
283303
284304// Integer-Indexed Exotic Objects [[PreventExtensions]] ( O )
@@ -295,8 +315,9 @@ pub(crate) fn typed_array_exotic_prevent_extensions(
295315 . downcast_ref :: < TypedArray > ( )
296316 . js_expect ( "must be a TypedArray" ) ?;
297317
298- ta. viewed_array_buffer ( ) . as_buffer ( ) . is_fixed_len ( )
299- } ;
318+ ta. is_fixed_length ( )
319+ } ; // Note: this block ensures that the borrow of obj is dropped
320+ // so it may be re-borrowed in step 3
300321
301322 // 1. If IsTypedArrayFixedLength(O) is false, return false.
302323 if !is_fixed_length {
0 commit comments