@@ -102,7 +102,7 @@ function makeArrayBuffer(TA, primitiveOrIterable) {
102102 return new TA ( arr ) . buffer ;
103103}
104104
105- var makeResizableArrayBuffer , makeGrownArrayBuffer , makeShrunkArrayBuffer ;
105+ var makeResizableArrayBuffer , makeGrownArrayBuffer , makeShrunkArrayBuffer , makeImmutableArrayBuffer ;
106106if ( ArrayBuffer . prototype . resize ) {
107107 var copyIntoArrayBuffer = function ( destBuffer , srcBuffer ) {
108108 var destView = new Uint8Array ( destBuffer ) ;
@@ -152,16 +152,28 @@ if (ArrayBuffer.prototype.resize) {
152152 return shrunk ;
153153 } ;
154154}
155+ if ( ArrayBuffer . prototype . transferToImmutable ) {
156+ makeImmutableArrayBuffer = function makeImmutableArrayBuffer ( TA , primitiveOrIterable ) {
157+ if ( isPrimitive ( primitiveOrIterable ) ) {
158+ var n = Number ( primitiveOrIterable ) * TA . BYTES_PER_ELEMENT ;
159+ if ( ! ( n >= 0 && n < 9007199254740992 ) ) return primitiveOrIterable ;
160+ return ( new ArrayBuffer ( n ) ) . transferToImmutable ( ) ;
161+ }
162+ var mutable = makeArrayBuffer ( TA , primitiveOrIterable ) ;
163+ return mutable . transferToImmutable ( ) ;
164+ } ;
165+ }
155166
156167var typedArrayCtorArgFactories = [ makePassthrough , makeArray , makeArrayLike ] ;
157168if ( makeIterable ) typedArrayCtorArgFactories . push ( makeIterable ) ;
158169typedArrayCtorArgFactories . push ( makeArrayBuffer ) ;
159170if ( makeResizableArrayBuffer ) typedArrayCtorArgFactories . push ( makeResizableArrayBuffer ) ;
160171if ( makeGrownArrayBuffer ) typedArrayCtorArgFactories . push ( makeGrownArrayBuffer ) ;
161172if ( makeShrunkArrayBuffer ) typedArrayCtorArgFactories . push ( makeShrunkArrayBuffer ) ;
173+ if ( makeImmutableArrayBuffer ) typedArrayCtorArgFactories . push ( makeImmutableArrayBuffer ) ;
162174
163175/**
164- * @typedef {"passthrough" | "arraylike" | "iterable" | "arraybuffer" | "resizable" } typedArrayArgFactoryFeature
176+ * @typedef {"passthrough" | "arraylike" | "iterable" | "arraybuffer" | "resizable" | "immutable" } typedArrayArgFactoryFeature
165177 */
166178
167179/**
@@ -189,7 +201,8 @@ function ctorArgFactoryMatchesSome(argFactory, features) {
189201 argFactory === makeArrayBuffer ||
190202 argFactory === makeResizableArrayBuffer ||
191203 argFactory === makeGrownArrayBuffer ||
192- argFactory === makeShrunkArrayBuffer
204+ argFactory === makeShrunkArrayBuffer ||
205+ argFactory === makeImmutableArrayBuffer
193206 ) {
194207 return true ;
195208 }
@@ -203,6 +216,9 @@ function ctorArgFactoryMatchesSome(argFactory, features) {
203216 return true ;
204217 }
205218 break ;
219+ case "immutable" :
220+ if ( argFactory === makeImmutableArrayBuffer ) return true ;
221+ break ;
206222 default :
207223 throw Test262Error ( "unknown feature: " + features [ i ] ) ;
208224 }
@@ -317,26 +333,46 @@ var nonAtomicsFriendlyTypedArrayConstructors = floatArrayConstructors.concat([Ui
317333 *
318334 * @param {typedArrayConstructorCallback } f - the function to call for each typed array constructor.
319335 * @param {Array } selected - An optional Array with filtered typed arrays
336+ * @param {typedArrayArgFactoryFeature[] } [includeArgFactories] - for selecting
337+ * initial constructor argument factory functions, rather than starting with
338+ * all argument factories
339+ * @param {typedArrayArgFactoryFeature[] } [excludeArgFactories] - for excluding
340+ * constructor argument factory functions, after an initial selection
320341 */
321- function testWithNonAtomicsFriendlyTypedArrayConstructors ( f ) {
322- testWithTypedArrayConstructors ( f , nonAtomicsFriendlyTypedArrayConstructors ) ;
342+ function testWithNonAtomicsFriendlyTypedArrayConstructors ( f , includeArgFactories , excludeArgFactories ) {
343+ testWithAllTypedArrayConstructors (
344+ f ,
345+ nonAtomicsFriendlyTypedArrayConstructors ,
346+ includeArgFactories ,
347+ excludeArgFactories
348+ ) ;
323349}
324350
325351/**
326352 * Calls the provided function for every "Atomics Friendly" typed array constructor.
327353 *
328354 * @param {typedArrayConstructorCallback } f - the function to call for each typed array constructor.
329355 * @param {Array } selected - An optional Array with filtered typed arrays
356+ * @param {typedArrayArgFactoryFeature[] } [includeArgFactories] - for selecting
357+ * initial constructor argument factory functions, rather than starting with
358+ * all argument factories
359+ * @param {typedArrayArgFactoryFeature[] } [excludeArgFactories] - for excluding
360+ * constructor argument factory functions, after an initial selection
330361 */
331- function testWithAtomicsFriendlyTypedArrayConstructors ( f ) {
332- testWithTypedArrayConstructors ( f , [
333- Int32Array ,
334- Int16Array ,
335- Int8Array ,
336- Uint32Array ,
337- Uint16Array ,
338- Uint8Array ,
339- ] ) ;
362+ function testWithAtomicsFriendlyTypedArrayConstructors ( f , includeArgFactories , excludeArgFactories ) {
363+ testWithAllTypedArrayConstructors (
364+ f ,
365+ [
366+ Int32Array ,
367+ Int16Array ,
368+ Int8Array ,
369+ Uint32Array ,
370+ Uint16Array ,
371+ Uint8Array ,
372+ ] ,
373+ includeArgFactories ,
374+ excludeArgFactories
375+ ) ;
340376}
341377
342378/**
@@ -363,7 +399,7 @@ function testTypedArrayConversions(byteConversionValues, fn) {
363399 }
364400 fn ( TA , value , exp , initial ) ;
365401 } ) ;
366- } ) ;
402+ } , null , [ "passthrough" ] ) ;
367403}
368404
369405/**
0 commit comments