mirror of https://github.com/tc39/test262.git
134 lines
5.1 KiB
JavaScript
134 lines
5.1 KiB
JavaScript
/*---
|
|
defines: [typedArrayConstructors, sharedTypedArrayConstructors, anyTypedArrayConstructors, isSharedConstructor, isFloatConstructor, isUnsignedConstructor]
|
|
allow_unused: True
|
|
---*/
|
|
(function(global) {
|
|
"use strict";
|
|
|
|
const {
|
|
Float16Array, Float32Array, Float64Array, Object, Reflect, SharedArrayBuffer, WeakMap,
|
|
assertEq
|
|
} = global;
|
|
const {
|
|
apply: Reflect_apply,
|
|
construct: Reflect_construct,
|
|
} = Reflect;
|
|
const {
|
|
get: WeakMap_prototype_get,
|
|
has: WeakMap_prototype_has,
|
|
} = WeakMap.prototype;
|
|
|
|
const sharedConstructors = new WeakMap();
|
|
|
|
// Synthesize a constructor for a shared memory array from the constructor
|
|
// for unshared memory. This has "good enough" fidelity for many uses. In
|
|
// cases where it's not good enough, call isSharedConstructor for local
|
|
// workarounds.
|
|
function sharedConstructor(baseConstructor) {
|
|
// Create SharedTypedArray as a subclass of %TypedArray%, following the
|
|
// built-in %TypedArray% subclasses.
|
|
class SharedTypedArray extends Object.getPrototypeOf(baseConstructor) {
|
|
constructor(...args) {
|
|
var array = Reflect_construct(baseConstructor, args);
|
|
var {buffer, byteOffset, length} = array;
|
|
var sharedBuffer = new SharedArrayBuffer(buffer.byteLength);
|
|
var sharedArray = Reflect_construct(baseConstructor,
|
|
[sharedBuffer, byteOffset, length],
|
|
new.target);
|
|
for (var i = 0; i < length; i++)
|
|
sharedArray[i] = array[i];
|
|
assertEq(sharedArray.buffer, sharedBuffer);
|
|
return sharedArray;
|
|
}
|
|
}
|
|
|
|
// 22.2.5.1 TypedArray.BYTES_PER_ELEMENT
|
|
Object.defineProperty(SharedTypedArray, "BYTES_PER_ELEMENT",
|
|
{__proto__: null, value: baseConstructor.BYTES_PER_ELEMENT});
|
|
|
|
// 22.2.6.1 TypedArray.prototype.BYTES_PER_ELEMENT
|
|
Object.defineProperty(SharedTypedArray.prototype, "BYTES_PER_ELEMENT",
|
|
{__proto__: null, value: baseConstructor.BYTES_PER_ELEMENT});
|
|
|
|
// Share the same name with the base constructor to avoid calling
|
|
// isSharedConstructor() in multiple places.
|
|
Object.defineProperty(SharedTypedArray, "name",
|
|
{__proto__: null, value: baseConstructor.name});
|
|
|
|
sharedConstructors.set(SharedTypedArray, baseConstructor);
|
|
|
|
return SharedTypedArray;
|
|
}
|
|
|
|
/**
|
|
* All TypedArray constructors for unshared memory.
|
|
*/
|
|
const typedArrayConstructors = Object.freeze([
|
|
Int8Array,
|
|
Uint8Array,
|
|
Uint8ClampedArray,
|
|
Int16Array,
|
|
Uint16Array,
|
|
Int32Array,
|
|
Uint32Array,
|
|
Float32Array,
|
|
Float64Array,
|
|
].concat(Float16Array ?? []));
|
|
|
|
/**
|
|
* All TypedArray constructors for shared memory.
|
|
*/
|
|
const sharedTypedArrayConstructors = Object.freeze(
|
|
typeof SharedArrayBuffer === "function"
|
|
? typedArrayConstructors.map(sharedConstructor)
|
|
: []
|
|
);
|
|
|
|
/**
|
|
* All TypedArray constructors for unshared and shared memory.
|
|
*/
|
|
const anyTypedArrayConstructors = Object.freeze([
|
|
...typedArrayConstructors, ...sharedTypedArrayConstructors,
|
|
]);
|
|
|
|
/**
|
|
* Returns `true` if `constructor` is a TypedArray constructor for shared
|
|
* memory.
|
|
*/
|
|
function isSharedConstructor(constructor) {
|
|
return Reflect_apply(WeakMap_prototype_has, sharedConstructors, [constructor]);
|
|
}
|
|
|
|
/**
|
|
* Returns `true` if `constructor` is a TypedArray constructor for shared
|
|
* or unshared memory, with an underlying element type of one of Float16, Float32
|
|
* or Float64.
|
|
*/
|
|
function isFloatConstructor(constructor) {
|
|
if (isSharedConstructor(constructor))
|
|
constructor = Reflect_apply(WeakMap_prototype_get, sharedConstructors, [constructor]);
|
|
return constructor == Float32Array || constructor == Float64Array || (Float16Array && constructor == Float16Array);
|
|
}
|
|
|
|
/**
|
|
* Returns `true` if `constructor` is a TypedArray constructor for shared
|
|
* or unshared memory, with an underlying element type of one of Uint8,
|
|
* Uint8Clamped, Uint16, or Uint32.
|
|
*/
|
|
function isUnsignedConstructor(constructor) {
|
|
if (isSharedConstructor(constructor))
|
|
constructor = Reflect_apply(WeakMap_prototype_get, sharedConstructors, [constructor]);
|
|
return constructor == Uint8Array ||
|
|
constructor == Uint8ClampedArray ||
|
|
constructor == Uint16Array ||
|
|
constructor == Uint32Array;
|
|
}
|
|
|
|
global.typedArrayConstructors = typedArrayConstructors;
|
|
global.sharedTypedArrayConstructors = sharedTypedArrayConstructors;
|
|
global.anyTypedArrayConstructors = anyTypedArrayConstructors;
|
|
global.isSharedConstructor = isSharedConstructor;
|
|
global.isFloatConstructor = isFloatConstructor;
|
|
global.isUnsignedConstructor = isUnsignedConstructor;
|
|
})(this);
|