diff options
Diffstat (limited to 'js/src/jit-test/tests/asm.js/sta-transition.js')
-rw-r--r-- | js/src/jit-test/tests/asm.js/sta-transition.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/asm.js/sta-transition.js b/js/src/jit-test/tests/asm.js/sta-transition.js new file mode 100644 index 000000000..9c33da5e2 --- /dev/null +++ b/js/src/jit-test/tests/asm.js/sta-transition.js @@ -0,0 +1,63 @@ +// Test the inference of shared memory in asm.js. +// +// These should not be run with --no-asmjs, the guard below checks this. + +load(libdir + "asm.js"); + +if (!this.SharedArrayBuffer || !isAsmJSCompilationAvailable()) + quit(0); + +setJitCompilerOption('asmjs.atomics.enable', 1); + +////////////////////////////////////////////////////////////////////// +// +// Int8Array can be used on SharedArrayBuffer, if atomics are present + +var m1 = asmCompile("stdlib", "ffi", "heap", ` + "use asm"; + + var i8 = new stdlib.Int8Array(heap); + var add = stdlib.Atomics.add; + + function f() { + add(i8, 0, 1); + return 37; + } + + return { f:f } +`); + +assertEq(isAsmJSModule(m1), true); + +var { f } = m1(this, {}, new SharedArrayBuffer(65536)); +assertEq(f(), 37); + +////////////////////////////////////////////////////////////////////// +// +// Int8Array cannot be used on SharedArrayBuffer if atomics are not imported. +// One argument for the restriction is that there are some optimizations +// that are legal if the memory is known not to be shared that are illegal +// when it is shared. + +var m4 = asmCompile("stdlib", "ffi", "heap", ` + "use asm"; + + var i8 = new stdlib.Int8Array(heap); + + function i() { + return i8[0]|0; + } + + return { i:i } +`); + +assertEq(isAsmJSModule(m4), true); + +// An error is not actually thrown because the link failure drops us +// back to JS execution and then the Int8Array constructor will copy data +// from the SharedArrayBuffer. +// +// Running the shell with -w you should see an error here. + +var { i } = m4(this, {}, new SharedArrayBuffer(65536)); +assertEq(isAsmJSFunction(i), false); |