Source code

Revision control

Copy as Markdown

Other Tools

// |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.
*/
// 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);