diff options
Diffstat (limited to 'js/src/tests/shell/mailbox.js')
-rw-r--r-- | js/src/tests/shell/mailbox.js | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/js/src/tests/shell/mailbox.js b/js/src/tests/shell/mailbox.js new file mode 100644 index 0000000000..1ab2f662cd --- /dev/null +++ b/js/src/tests/shell/mailbox.js @@ -0,0 +1,104 @@ +// |reftest| skip-if(!xulRuntime.shell) +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/licenses/publicdomain/ + */ + +// Tests the shared-object mailbox in the shell. + +var hasSharedMemory = !!(this.SharedArrayBuffer && + this.getSharedObject && + this.setSharedObject); + +if (!hasSharedMemory) { + reportCompare(true, true); + quit(0); +} + +var sab = new SharedArrayBuffer(12); +var mem = new Int32Array(sab); + +// SharedArrayBuffer mailbox tests + +assertEq(getSharedObject(), null); // Mbx starts empty + +assertEq(setSharedObject(mem.buffer), undefined); // Setter returns undefined +assertEq(getSharedObject() == null, false); // And then the mbx is not empty + +var v = getSharedObject(); +assertEq(v.byteLength, mem.buffer.byteLength); // Looks like what we put in? +var w = new Int32Array(v); +mem[0] = 314159; +assertEq(w[0], 314159); // Shares memory (locally) with what we put in? +mem[0] = 0; + +setSharedObject(3.14); // Share numbers +assertEq(getSharedObject(), 3.14); + +setSharedObject(null); // Setting to null clears to null +assertEq(getSharedObject(), null); + +setSharedObject(mem.buffer); +setSharedObject(undefined); // Setting to undefined clears to null +assertEq(getSharedObject(), null); + +setSharedObject(mem.buffer); +setSharedObject(); // Setting without arguments clears to null +assertEq(getSharedObject(), null); + +// Non-shared objects cannot be stored in the mbx + +assertThrowsInstanceOf(() => setSharedObject({x:10, y:20}), Error); +assertThrowsInstanceOf(() => setSharedObject([1,2]), Error); +assertThrowsInstanceOf(() => setSharedObject(new ArrayBuffer(10)), Error); +assertThrowsInstanceOf(() => setSharedObject(new Int32Array(10)), Error); +assertThrowsInstanceOf(() => setSharedObject(false), Error); +assertThrowsInstanceOf(() => setSharedObject(mem), Error); +assertThrowsInstanceOf(() => setSharedObject("abracadabra"), Error); +assertThrowsInstanceOf(() => setSharedObject(() => 37), Error); + +// We can store wasm shared memories, too + +if (!this.WebAssembly || !wasmThreadsEnabled()) { + reportCompare(true, true); + quit(0); +} + +setSharedObject(null); + +var mem = new WebAssembly.Memory({initial: 1, maximum: 1, shared: true}); +setSharedObject(mem); +var ia1 = new Int32Array(mem.buffer); + +var mem2 = getSharedObject(); +assertEq(mem2.buffer instanceof SharedArrayBuffer, true); +assertEq(mem2.buffer.byteLength, 65536); +var ia2 = new Int32Array(mem2.buffer); + +ia2[37] = 0x12345678; +assertEq(ia1[37], 0x12345678); + +// Can't store a non-shared memory + +assertThrowsInstanceOf(() => setSharedObject(new WebAssembly.Memory({initial: 1, maximum: 1})), Error); + +// We can store wasm modules + +var mod = new WebAssembly.Module(wasmTextToBinary(`(module + (import "m" "f" (func (param i32) (result i32))) + (func (export "hi") (result i32) + (i32.const 37)) + )`)); + +setSharedObject(mod); + +var mod2 = getSharedObject(); + +// This should fail because we're not providing the correct import object +assertThrowsInstanceOf(() => new WebAssembly.Instance(mod2, {m:{}}), WebAssembly.LinkError); + +// But this should work +new WebAssembly.Instance(mod2, {m:{f:(x) => x}}); + +reportCompare(true,true); |