summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/rab-gsab-transfer-to-worker.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/rab-gsab-transfer-to-worker.js')
-rw-r--r--deps/v8/test/mjsunit/rab-gsab-transfer-to-worker.js232
1 files changed, 232 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/rab-gsab-transfer-to-worker.js b/deps/v8/test/mjsunit/rab-gsab-transfer-to-worker.js
new file mode 100644
index 0000000000..ef27d1947a
--- /dev/null
+++ b/deps/v8/test/mjsunit/rab-gsab-transfer-to-worker.js
@@ -0,0 +1,232 @@
+// Copyright 2022 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --harmony-rab-gsab
+
+(function TransferArrayBuffer() {
+ function workerCode() {
+ onmessage = function(msg) {
+ const ab = msg.data;
+ postMessage(ab.byteLength + ' ' + ab.maxByteLength);
+ postMessage(ab.resizable + ' ' + ab.growable);
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+
+ const ab = new ArrayBuffer(16);
+ worker.postMessage({data: ab}, [ab]);
+ assertEquals('16 16', worker.getMessage());
+ assertEquals('false undefined', worker.getMessage());
+
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+ worker.postMessage({data: rab}, [rab]);
+ assertEquals('16 1024', worker.getMessage());
+ assertEquals('true undefined', worker.getMessage());
+
+ const sab = new SharedArrayBuffer(16);
+ worker.postMessage({data: sab});
+ assertEquals('16 16', worker.getMessage());
+ assertEquals('undefined false', worker.getMessage());
+
+ const gsab = new SharedArrayBuffer(16, {maxByteLength: 1024});
+ worker.postMessage({data: gsab});
+ assertEquals('16 1024', worker.getMessage());
+ assertEquals('undefined true', worker.getMessage());
+})();
+
+(function TransferLengthTrackingRabBackedTypedArray() {
+ function workerCode() {
+ onmessage = function(msg) {
+ postMessage(msg.data.length);
+ msg.data.buffer.resize(150);
+ postMessage(msg.data.length);
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+ const ta = new Uint8Array(rab);
+ worker.postMessage({data: ta}, [rab]);
+ assertEquals(16, worker.getMessage());
+ assertEquals(150, worker.getMessage());
+})();
+
+(function TransferLengthTrackingGsabBackedTypedArray() {
+ function workerCode() {
+ onmessage = function(msg) {
+ postMessage(msg.data.length);
+ msg.data.buffer.grow(150);
+ postMessage(msg.data.length);
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const gsab = new SharedArrayBuffer(16, {maxByteLength: 1024});
+ const ta = new Uint8Array(gsab);
+ worker.postMessage({data: ta});
+ assertEquals(16, worker.getMessage());
+ assertEquals(150, worker.getMessage());
+})();
+
+(function TransferFixedLengthRabBackedTypedArray() {
+ function workerCode() {
+ onmessage = function(msg) {
+ const ta = msg.data;
+ postMessage(`${ta.length} ${ta[0]} ${ta[1]} ${ta[2]}`);
+ ta.buffer.resize(2);
+ postMessage(`${ta.length}`);
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+ const ta = new Uint8Array(rab, 0, 10);
+ ta[0] = 30;
+ ta[1] = 11;
+ ta[2] = 22;
+ worker.postMessage({data: ta}, [rab]);
+ assertEquals('10 30 11 22', worker.getMessage());
+ assertEquals('0', worker.getMessage());
+})();
+
+(function TransferOutOfBoundsFixedLengthTypedArray() {
+ function workerCode() {
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+ const ta = new Uint8Array(rab, 0, 10);
+ rab.resize(0);
+ assertThrows(() => { worker.postMessage({data: ta}, [rab]) });
+})();
+
+(function TransferGsabBackedFixedLengthTypedArray() {
+ function workerCode() {
+ onmessage = function(msg) {
+ const ta = msg.data;
+ postMessage(`${ta.length} ${ta[0]} ${ta[1]} ${ta[2]}`);
+ ta.buffer.grow(20);
+ postMessage(`${ta.length} ${ta[0]} ${ta[1]} ${ta[2]}`);
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+
+ const gsab = new SharedArrayBuffer(16, {maxByteLength: 1024});
+ const ta = new Uint8Array(gsab, 0, 10);
+ ta[0] = 30;
+ ta[1] = 11;
+ ta[2] = 22;
+ worker.postMessage({data: ta});
+ assertEquals('10 30 11 22', worker.getMessage());
+ assertEquals('10 30 11 22', worker.getMessage());
+})();
+
+(function TransferLengthTrackingDataView() {
+ function workerCode() {
+ onmessage = function(msg) {
+ const dv = msg.data;
+ postMessage(dv.byteLength);
+ dv.buffer.resize(150);
+ postMessage(dv.byteLength);
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+ const dv = new DataView(rab);
+ worker.postMessage({data: dv}, [rab]);
+ assertEquals(16, worker.getMessage());
+ assertEquals(150, worker.getMessage());
+})();
+
+(function TransferFixedLengthDataView() {
+ function workerCode() {
+ onmessage = function(msg) {
+ const dv = msg.data;
+ postMessage(`${dv.byteLength} ${dv.getUint8(0)} ${dv.getUint8(1)}`);
+ dv.buffer.resize(2);
+ try {
+ dv.byteLength;
+ } catch(e) {
+ postMessage('byteLength getter threw');
+ }
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+ const ta = new Uint8Array(rab);
+ ta[0] = 30;
+ ta[1] = 11;
+ worker.postMessage({data: new DataView(rab, 0, 10)}, [rab]);
+ assertEquals('10 30 11', worker.getMessage());
+ assertEquals('byteLength getter threw', worker.getMessage());
+})();
+
+(function TransferOutOfBoundsDataView1() {
+ function workerCode() {}
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+ const dv = new Uint8Array(rab, 0, 10);
+ rab.resize(0);
+ assertThrows(() => { worker.postMessage({data: dv}, [rab]) });
+})();
+
+(function TransferOutOfBoundsDataView2() {
+ function workerCode() {}
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+ const dv = new Uint8Array(rab, 2);
+ rab.resize(1);
+ assertThrows(() => { worker.postMessage({data: dv}, [rab]) });
+})();
+
+(function TransferZeroLengthDataView1() {
+ function workerCode() {
+ onmessage = function(msg) {
+ const dv = msg.data;
+ postMessage(`${dv.byteLength}`);
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+
+ worker.postMessage({data: new DataView(rab, 16)}, [rab]);
+ assertEquals('0', worker.getMessage());
+})();
+
+(function TransferZeroLengthDataView2() {
+ function workerCode() {
+ onmessage = function(msg) {
+ const dv = msg.data;
+ postMessage(`${dv.byteLength}`);
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+
+ worker.postMessage({data: new DataView(rab, 16, 0)}, [rab]);
+ assertEquals('0', worker.getMessage());
+})();
+
+(function TransferZeroLengthDataView3() {
+ function workerCode() {
+ onmessage = function(msg) {
+ const dv = msg.data;
+ postMessage(`${dv.byteLength}`);
+ }
+ }
+
+ const worker = new Worker(workerCode, {type: 'function'});
+ const rab = new ArrayBuffer(16, {maxByteLength: 1024});
+
+ worker.postMessage({data: new DataView(rab, 5, 0)}, [rab]);
+ assertEquals('0', worker.getMessage());
+})();