mailbox.js (3462B)
1 // |reftest| skip-if(!xulRuntime.shell) 2 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 3 /* 4 * Any copyright is dedicated to the Public Domain. 5 * http://creativecommons.org/licenses/publicdomain/ 6 */ 7 8 // Tests the shared-object mailbox in the shell. 9 10 var hasSharedMemory = !!(this.SharedArrayBuffer && 11 this.getSharedObject && 12 this.setSharedObject); 13 14 if (!hasSharedMemory) { 15 reportCompare(true, true); 16 quit(0); 17 } 18 19 var sab = new SharedArrayBuffer(12); 20 var mem = new Int32Array(sab); 21 22 // SharedArrayBuffer mailbox tests 23 24 assertEq(getSharedObject(), null); // Mbx starts empty 25 26 assertEq(setSharedObject(mem.buffer), undefined); // Setter returns undefined 27 assertEq(getSharedObject() == null, false); // And then the mbx is not empty 28 29 var v = getSharedObject(); 30 assertEq(v.byteLength, mem.buffer.byteLength); // Looks like what we put in? 31 var w = new Int32Array(v); 32 mem[0] = 314159; 33 assertEq(w[0], 314159); // Shares memory (locally) with what we put in? 34 mem[0] = 0; 35 36 setSharedObject(3.14); // Share numbers 37 assertEq(getSharedObject(), 3.14); 38 39 setSharedObject(null); // Setting to null clears to null 40 assertEq(getSharedObject(), null); 41 42 setSharedObject(mem.buffer); 43 setSharedObject(undefined); // Setting to undefined clears to null 44 assertEq(getSharedObject(), null); 45 46 setSharedObject(mem.buffer); 47 setSharedObject(); // Setting without arguments clears to null 48 assertEq(getSharedObject(), null); 49 50 // Non-shared objects cannot be stored in the mbx 51 52 assertThrowsInstanceOf(() => setSharedObject({x:10, y:20}), Error); 53 assertThrowsInstanceOf(() => setSharedObject([1,2]), Error); 54 assertThrowsInstanceOf(() => setSharedObject(new ArrayBuffer(10)), Error); 55 assertThrowsInstanceOf(() => setSharedObject(new Int32Array(10)), Error); 56 assertThrowsInstanceOf(() => setSharedObject(false), Error); 57 assertThrowsInstanceOf(() => setSharedObject(mem), Error); 58 assertThrowsInstanceOf(() => setSharedObject("abracadabra"), Error); 59 assertThrowsInstanceOf(() => setSharedObject(() => 37), Error); 60 61 // We can store wasm shared memories, too 62 63 if (!this.WebAssembly || !wasmThreadsEnabled()) { 64 reportCompare(true, true); 65 quit(0); 66 } 67 68 setSharedObject(null); 69 70 var mem = new WebAssembly.Memory({initial: 1, maximum: 1, shared: true}); 71 setSharedObject(mem); 72 var ia1 = new Int32Array(mem.buffer); 73 74 var mem2 = getSharedObject(); 75 assertEq(mem2.buffer instanceof SharedArrayBuffer, true); 76 assertEq(mem2.buffer.byteLength, 65536); 77 var ia2 = new Int32Array(mem2.buffer); 78 79 ia2[37] = 0x12345678; 80 assertEq(ia1[37], 0x12345678); 81 82 // Can't store a non-shared memory 83 84 assertThrowsInstanceOf(() => setSharedObject(new WebAssembly.Memory({initial: 1, maximum: 1})), Error); 85 86 // We can store wasm modules 87 88 var mod = new WebAssembly.Module(wasmTextToBinary(`(module 89 (import "m" "f" (func (param i32) (result i32))) 90 (func (export "hi") (result i32) 91 (i32.const 37)) 92 )`)); 93 94 setSharedObject(mod); 95 96 var mod2 = getSharedObject(); 97 98 // This should fail because we're not providing the correct import object 99 assertThrowsInstanceOf(() => new WebAssembly.Instance(mod2, {m:{}}), WebAssembly.LinkError); 100 101 // But this should work 102 new WebAssembly.Instance(mod2, {m:{f:(x) => x}}); 103 104 reportCompare(true,true);