summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/lib/dataview.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/lib/dataview.js')
-rw-r--r--js/src/jit-test/lib/dataview.js82
1 files changed, 82 insertions, 0 deletions
diff --git a/js/src/jit-test/lib/dataview.js b/js/src/jit-test/lib/dataview.js
new file mode 100644
index 0000000000..68228f324b
--- /dev/null
+++ b/js/src/jit-test/lib/dataview.js
@@ -0,0 +1,82 @@
+function typeName(typedArrayCtor) {
+ return typedArrayCtor.name.slice(0, -"Array".length);
+}
+
+const nativeIsLittleEndian = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
+
+function toEndianess(type, v, littleEndian) {
+ // Disable Ion compilation to call the native, non-inlined DataView functions.
+ with ({}); // no-ion
+ assertEq(inIon() !== true, true);
+
+ let dv = new DataView(new ArrayBuffer(type.BYTES_PER_ELEMENT));
+
+ let name = typeName(type);
+ dv[`set${name}`](0, v, nativeIsLittleEndian);
+ return dv[`get${name}`](0, littleEndian);
+}
+
+function toLittleEndian(type, v) {
+ return toEndianess(type, v, true);
+}
+
+function toBigEndian(type, v) {
+ return toEndianess(type, v, false);
+}
+
+// Shared test data for various DataView tests.
+function createTestData() {
+ const tests = [
+ {
+ type: Int8Array,
+ values: [-128, -127, -2, -1, 0, 1, 2, 126, 127],
+ },
+ {
+ type: Uint8Array,
+ values: [0, 1, 2, 126, 127, 128, 254, 255],
+ },
+ {
+ type: Int16Array,
+ values: [-32768, -32767, -2, -1, 0, 1, 2, 32766, 32767],
+ },
+ {
+ type: Uint16Array,
+ values: [0, 1, 2, 32766, 32767, 32768, 65534, 65535],
+ },
+ {
+ type: Int32Array,
+ values: [-2147483648, -2147483647, -2, -1, 0, 1, 2, 2147483646, 2147483647],
+ },
+ {
+ type: Uint32Array,
+ values: [0, 1, 2, 2147483646, 2147483647], // Representable as Int32
+ },
+ {
+ type: Uint32Array,
+ values: [0, 1, 2, 2147483646, 2147483647, 2147483648, 4294967294, 4294967295],
+ },
+ {
+ type: Float32Array,
+ values: [-NaN, -Infinity, -0.5, -0, +0, 0.5, Infinity, NaN],
+ },
+ {
+ type: Float64Array,
+ values: [-NaN, -Infinity, -0.5, -0, +0, 0.5, Infinity, NaN],
+ },
+ {
+ type: BigInt64Array,
+ values: [-9223372036854775808n, -9223372036854775807n, -2n, -1n, 0n, 1n, 2n, 9223372036854775806n, 9223372036854775807n],
+ },
+ {
+ type: BigUint64Array,
+ values: [0n, 1n, 2n, 9223372036854775806n, 9223372036854775807n, 9223372036854775808n, 18446744073709551614n, 18446744073709551615n],
+ },
+ ];
+
+ tests.forEach(data => {
+ data.littleEndian = data.values.map(v => toLittleEndian(data.type, v));
+ data.bigEndian = data.values.map(v => toBigEndian(data.type, v));
+ });
+
+ return tests;
+}