summaryrefslogtreecommitdiffstats
path: root/js/src/tests/shell/mailbox.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/shell/mailbox.js')
-rw-r--r--js/src/tests/shell/mailbox.js104
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);