summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/lib/asm.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/lib/asm.js')
-rw-r--r--js/src/jit-test/lib/asm.js208
1 files changed, 208 insertions, 0 deletions
diff --git a/js/src/jit-test/lib/asm.js b/js/src/jit-test/lib/asm.js
new file mode 100644
index 000000000..4f5afa903
--- /dev/null
+++ b/js/src/jit-test/lib/asm.js
@@ -0,0 +1,208 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const ASM_TYPE_FAIL_STRING = "asm.js type error:";
+const ASM_DIRECTIVE_FAIL_STRING = "\"use asm\" is only meaningful in the Directive Prologue of a function body";
+
+const USE_ASM = '"use asm";';
+const HEAP_IMPORTS = "const i8=new glob.Int8Array(b);var u8=new glob.Uint8Array(b);"+
+ "const i16=new glob.Int16Array(b);var u16=new glob.Uint16Array(b);"+
+ "const i32=new glob.Int32Array(b);var u32=new glob.Uint32Array(b);"+
+ "const f32=new glob.Float32Array(b);var f64=new glob.Float64Array(b);";
+const BUF_MIN = 64 * 1024;
+const BUF_CHANGE_MIN = 16 * 1024 * 1024;
+const BUF_64KB = new ArrayBuffer(BUF_MIN);
+
+function asmCompile()
+{
+ var f = Function.apply(null, arguments);
+ assertEq(!isAsmJSCompilationAvailable() || isAsmJSModule(f), true);
+ return f;
+}
+
+function asmCompileCached()
+{
+ if (!isAsmJSCompilationAvailable())
+ return Function.apply(null, arguments);
+
+ if (!isCachingEnabled()) {
+ var f = Function.apply(null, arguments);
+ assertEq(isAsmJSModule(f), true);
+ return f;
+ }
+
+ var quotedArgs = [];
+ for (var i = 0; i < arguments.length; i++)
+ quotedArgs.push("'" + arguments[i] + "'");
+ var code = "setCachingEnabled(true); var f = new Function(" + quotedArgs.join(',') + ");assertEq(isAsmJSModule(f), true);";
+ nestedShell("--js-cache", "--no-js-cache-per-process", "--execute=" + code);
+
+ var f = Function.apply(null, arguments);
+ assertEq(isAsmJSModuleLoadedFromCache(f), true);
+ return f;
+}
+
+function assertAsmDirectiveFail(str)
+{
+ if (!isAsmJSCompilationAvailable())
+ return;
+
+ // Turn on warnings-as-errors
+ var oldOpts = options("werror");
+ assertEq(oldOpts.indexOf("werror"), -1);
+
+ // Verify an error is thrown
+ var caught = false;
+ try {
+ eval(str);
+ } catch (e) {
+ if ((''+e).indexOf(ASM_DIRECTIVE_FAIL_STRING) == -1)
+ throw new Error("Didn't catch the expected directive failure error; instead caught: " + e + "\nStack: " + new Error().stack);
+ caught = true;
+ }
+ if (!caught)
+ throw new Error("Didn't catch the directive failure error");
+
+ // Turn warnings-as-errors back off
+ options("werror");
+}
+
+function assertAsmTypeFail()
+{
+ if (!isAsmJSCompilationAvailable())
+ return;
+
+ // Verify no error is thrown with warnings off
+ Function.apply(null, arguments);
+
+ // Turn on throwing on validation errors
+ var oldOpts = options("throw_on_asmjs_validation_failure");
+ assertEq(oldOpts.indexOf("throw_on_asmjs_validation_failure"), -1);
+
+ // Verify an error is thrown
+ var caught = false;
+ try {
+ Function.apply(null, arguments);
+ } catch (e) {
+ if ((''+e).indexOf(ASM_TYPE_FAIL_STRING) == -1)
+ throw new Error("Didn't catch the expected type failure error; instead caught: " + e + "\nStack: " + new Error().stack);
+ caught = true;
+ }
+ if (!caught)
+ throw new Error("Didn't catch the type failure error");
+
+ // Turn warnings-as-errors back off
+ options("throw_on_asmjs_validation_failure");
+}
+
+function assertAsmLinkFail(f)
+{
+ if (!isAsmJSCompilationAvailable())
+ return;
+
+ assertEq(isAsmJSModule(f), true);
+
+ // Verify no error is thrown with warnings off
+ var ret = f.apply(null, Array.slice(arguments, 1));
+
+ assertEq(isAsmJSFunction(ret), false);
+ if (typeof ret === 'object')
+ for (var i in ret)
+ assertEq(isAsmJSFunction(ret[i]), false);
+
+ // Turn on warnings-as-errors
+ var oldOpts = options("werror");
+ assertEq(oldOpts.indexOf("werror"), -1);
+
+ // Verify an error is thrown
+ var caught = false;
+ try {
+ f.apply(null, Array.slice(arguments, 1));
+ } catch (e) {
+ // Arbitrary code an run in the GetProperty, so don't assert any
+ // particular string
+ caught = true;
+ }
+ if (!caught)
+ throw new Error("Didn't catch the link failure error");
+
+ // Turn warnings-as-errors back off
+ options("werror");
+}
+
+// Linking should throw an exception even without warnings-as-errors
+function assertAsmLinkAlwaysFail(f)
+{
+ var caught = false;
+ try {
+ f.apply(null, Array.slice(arguments, 1));
+ } catch (e) {
+ caught = true;
+ }
+ if (!caught)
+ throw new Error("Didn't catch the link failure error");
+
+ // Turn on warnings-as-errors
+ var oldOpts = options("werror");
+ assertEq(oldOpts.indexOf("werror"), -1);
+
+ // Verify an error is thrown
+ var caught = false;
+ try {
+ f.apply(null, Array.slice(arguments, 1));
+ } catch (e) {
+ caught = true;
+ }
+ if (!caught)
+ throw new Error("Didn't catch the link failure error");
+
+ // Turn warnings-as-errors back off
+ options("werror");
+}
+
+function assertAsmLinkDeprecated(f)
+{
+ if (!isAsmJSCompilationAvailable())
+ return;
+
+ // Verify no error is thrown with warnings off
+ f.apply(null, Array.slice(arguments, 1));
+
+ // Turn on warnings-as-errors
+ var oldOpts = options("werror");
+ assertEq(oldOpts.indexOf("werror"), -1);
+
+ // Verify an error is thrown
+ var caught = false;
+ try {
+ f.apply(null, Array.slice(arguments, 1));
+ } catch (e) {
+ // Arbitrary code an run in the GetProperty, so don't assert any
+ // particular string
+ caught = true;
+ }
+ if (!caught)
+ throw new Error("Didn't catch the link failure error");
+
+ // Turn warnings-as-errors back off
+ options("werror");
+}
+
+// Linking should throw a warning-as-error but otherwise run fine
+function asmLink(f)
+{
+ if (!isAsmJSCompilationAvailable())
+ return f.apply(null, Array.slice(arguments, 1));
+
+ // Turn on warnings-as-errors
+ var oldOpts = options("werror");
+ assertEq(oldOpts.indexOf("werror"), -1);
+
+ var ret = f.apply(null, Array.slice(arguments, 1));
+
+ // Turn warnings-as-errors back off
+ options("werror");
+
+ return ret;
+}