summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/typedarray/arraybuffer-pin.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/typedarray/arraybuffer-pin.js')
-rw-r--r--js/src/jit-test/tests/typedarray/arraybuffer-pin.js69
1 files changed, 69 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/typedarray/arraybuffer-pin.js b/js/src/jit-test/tests/typedarray/arraybuffer-pin.js
new file mode 100644
index 0000000000..8799da29de
--- /dev/null
+++ b/js/src/jit-test/tests/typedarray/arraybuffer-pin.js
@@ -0,0 +1,69 @@
+// |jit-test| --enable-arraybuffer-resizable
+
+load(libdir + "asserts.js");
+
+var ab_inline = new ArrayBuffer(4);
+assertEq(pinArrayBufferOrViewLength(ab_inline), true);
+assertEq(pinArrayBufferOrViewLength(ab_inline), false);
+assertErrorMessage(() => detachArrayBuffer(ab_inline), RangeError, /change pinned length/);
+assertEq(pinArrayBufferOrViewLength(ab_inline, false), true);
+detachArrayBuffer(ab_inline);
+
+var ab_big = new ArrayBuffer(1000);
+assertEq(pinArrayBufferOrViewLength(ab_big), true);
+assertEq(pinArrayBufferOrViewLength(ab_big), false);
+assertErrorMessage(() => detachArrayBuffer(ab_big), RangeError, /change pinned length/);
+assertEq(pinArrayBufferOrViewLength(ab_big, false), true);
+detachArrayBuffer(ab_big);
+
+if (ArrayBuffer.prototype.resize) {
+ var rab_small = new ArrayBuffer(4, { maxByteLength: 20 });
+ assertEq(pinArrayBufferOrViewLength(rab_small), true);
+ assertEq(pinArrayBufferOrViewLength(rab_small), false);
+ assertErrorMessage(() => detachArrayBuffer(rab_small), RangeError, /change pinned length/);
+ assertErrorMessage(() => rab_small.resize(18), RangeError, /change pinned length/);
+ assertEq(pinArrayBufferOrViewLength(rab_small, false), true);
+ assertEq(rab_small.byteLength, 4);
+ rab_small.resize(18);
+ assertEq(rab_small.byteLength, 18);
+ detachArrayBuffer(rab_small);
+} else {
+ print("Skipped test: resizable ArrayBuffers unavailable");
+}
+
+if (ArrayBuffer.prototype.resize) {
+ var rab_big = new ArrayBuffer(200, { maxByteLength: 1000 });
+ assertEq(pinArrayBufferOrViewLength(rab_big), true);
+ assertEq(pinArrayBufferOrViewLength(rab_big), false);
+ assertErrorMessage(() => detachArrayBuffer(rab_big), RangeError, /change pinned length/);
+ assertErrorMessage(() => rab_big.resize(400), RangeError, /change pinned length/);
+ assertEq(pinArrayBufferOrViewLength(rab_big, false), true);
+ assertEq(rab_big.byteLength, 200);
+ rab_big.resize(400);
+ assertEq(rab_big.byteLength, 400);
+ detachArrayBuffer(rab_big);
+} else {
+ print("Skipped test: resizable ArrayBuffers unavailable");
+}
+
+var sab = new SharedArrayBuffer(4);
+assertEq(pinArrayBufferOrViewLength(sab), false);
+assertEq(pinArrayBufferOrViewLength(sab), false);
+assertErrorMessage(() => serialize([sab], [sab]), TypeError, /Shared memory objects.*transfer/);
+assertEq(pinArrayBufferOrViewLength(sab, false), false);
+assertErrorMessage(() => detachArrayBuffer(sab), TypeError, /ArrayBuffer.*required/);
+
+if (SharedArrayBuffer.prototype.grow) {
+ var gab = new SharedArrayBuffer(4, { maxByteLength: 1000 });
+ assertEq(pinArrayBufferOrViewLength(gab), false);
+ assertEq(pinArrayBufferOrViewLength(gab), false);
+ assertErrorMessage(() => detachArrayBuffer(gab), TypeError, /ArrayBuffer.*required/);
+ // assertErrorMessage(() => gab.grow(400), RangeError, /change pinned length/);
+ assertEq(pinArrayBufferOrViewLength(gab, false), false);
+ assertEq(gab.byteLength, 4);
+ gab.grow(400);
+ assertEq(gab.byteLength, 400);
+ assertErrorMessage(() => detachArrayBuffer(gab), TypeError, /ArrayBuffer.*required/);
+} else {
+ print("Skipped test: growable SharedArrayBuffers unavailable");
+}