summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/asm.js/sta-transition.js
diff options
context:
space:
mode:
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.js63
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);