summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/asm.js/testSource.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/asm.js/testSource.js')
-rw-r--r--js/src/jit-test/tests/asm.js/testSource.js398
1 files changed, 398 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/asm.js/testSource.js b/js/src/jit-test/tests/asm.js/testSource.js
new file mode 100644
index 000000000..b44c52a6b
--- /dev/null
+++ b/js/src/jit-test/tests/asm.js/testSource.js
@@ -0,0 +1,398 @@
+setCachingEnabled(true);
+
+(function() {
+/*
+ * NO ARGUMENT
+ */
+
+function f0() {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+var bodyOnly = '"use asm";\n\
+ function g() {}\n\
+ return g;\n';
+
+var funcBody = 'function f0() {\n\
+ "use asm";\n\
+ function g() {}\n\
+ return g;\n\n\
+}';
+
+assertEq(f0.toString(), funcBody);
+assertEq(f0.toSource(), funcBody);
+
+var f0 = function() {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+funcBody1 = funcBody.replace('function f0','function ');
+assertEq(f0.toString(), funcBody1);
+assertEq(f0.toSource(), '(' + funcBody1 + ')');
+
+var g = function g0() {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+funcBody2 = funcBody.replace('function f0', 'function g0');
+assertEq(g.toString(), funcBody2);
+assertEq(g.toSource(), '(' + funcBody2 + ')');
+
+f0 = new Function(bodyOnly);
+assertEq(f0.toString(), "function anonymous() {\n" + bodyOnly + "\n}");
+assertEq(f0.toSource(), "(function anonymous() {\n" + bodyOnly + "\n})");
+
+if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
+ var m = new Function(bodyOnly);
+ assertEq(isAsmJSModuleLoadedFromCache(m), true);
+ assertEq(m.toString(), "function anonymous() {\n" + bodyOnly + "\n}");
+ assertEq(m.toSource(), "(function anonymous() {\n" + bodyOnly + "\n})");
+}
+
+})();
+
+(function() {
+/*
+ * ONE ARGUMENT
+ */
+function f1(glob) {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+var bodyOnly = '"use asm";\n\
+ function g() {}\n\
+ return g;\n';
+
+var funcBody = 'function f1(glob) {\n\
+ "use asm";\n\
+ function g() {}\n\
+ return g;\n\n\
+}';
+
+assertEq(f1.toString(), funcBody);
+assertEq(f1.toSource(), funcBody);
+
+f1 = function(glob) {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+funcBody1 = funcBody.replace('function f1', 'function ');
+assertEq(f1.toString(), funcBody1);
+assertEq(f1.toSource(), '(' + funcBody1 + ')');
+
+var g = function g0(glob) {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+funcBody2 = funcBody.replace('function f1', 'function g0');
+assertEq(g.toString(), funcBody2);
+assertEq(g.toSource(), '(' + funcBody2 + ')');
+
+f1 = new Function('glob', bodyOnly);
+assertEq(f1.toString(), "function anonymous(glob) {\n" + bodyOnly + "\n}");
+assertEq(f1.toSource(), "(function anonymous(glob) {\n" + bodyOnly + "\n})");
+
+if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
+ var m = new Function('glob', bodyOnly);
+ assertEq(isAsmJSModuleLoadedFromCache(m), true);
+ assertEq(m.toString(), "function anonymous(glob) {\n" + bodyOnly + "\n}");
+ assertEq(m.toSource(), "(function anonymous(glob) {\n" + bodyOnly + "\n})");
+}
+
+})();
+
+
+(function() {
+/*
+ * TWO ARGUMENTS
+ */
+function f2(glob, ffi) {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+var bodyOnly = '"use asm";\n\
+ function g() {}\n\
+ return g;\n';
+
+var funcBody = 'function f2(glob, ffi) {\n\
+ "use asm";\n\
+ function g() {}\n\
+ return g;\n\n\
+}';
+
+assertEq(f2.toString(), funcBody);
+assertEq(f2.toSource(), funcBody);
+
+f2 = function (glob, ffi) {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+funcBody1 = funcBody.replace('function f2', 'function ');
+assertEq(f2.toString(), funcBody1);
+assertEq(f2.toSource(), '(' + funcBody1 + ')');
+
+var g = function g0(glob, ffi) {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+var funcBody2 = funcBody.replace('function f2', 'function g0');
+assertEq(g.toString(), funcBody2);
+assertEq(g.toSource(), '(' + funcBody2 + ')');
+
+f2 = new Function('glob', 'ffi', bodyOnly);
+assertEq(f2.toString(), "function anonymous(glob, ffi) {\n" + bodyOnly + "\n}");
+assertEq(f2.toSource(), "(function anonymous(glob, ffi) {\n" + bodyOnly + "\n})");
+
+if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
+ var m = new Function('glob', 'ffi', bodyOnly);
+ assertEq(isAsmJSModuleLoadedFromCache(m), true);
+ assertEq(m.toString(), "function anonymous(glob, ffi) {\n" + bodyOnly + "\n}");
+ assertEq(m.toSource(), "(function anonymous(glob, ffi) {\n" + bodyOnly + "\n})");
+}
+
+})();
+
+
+(function() {
+/*
+ * THREE ARGUMENTS
+ */
+function f3(glob, ffi, heap) {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+var bodyOnly = '"use asm";\n\
+ function g() {}\n\
+ return g;\n';
+
+var funcBody = 'function f3(glob, ffi, heap) {\n\
+ "use asm";\n\
+ function g() {}\n\
+ return g;\n\n\
+}';
+
+assertEq(f3.toString(), funcBody);
+assertEq(f3.toSource(), funcBody);
+
+f3 = function (glob, ffi, heap) {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+funcBody1 = funcBody.replace('function f3', 'function ');
+assertEq(f3.toString(), funcBody1);
+assertEq(f3.toSource(), '(' + funcBody1 + ')');
+
+var g = function g0(glob, ffi, heap) {
+ "use asm";
+ function g() {}
+ return g;
+
+}
+
+funcBody2 = funcBody.replace('function f3', 'function g0');
+assertEq(g.toString(), funcBody2);
+assertEq(g.toSource(), '(' + funcBody2 + ')');
+
+f3 = new Function('glob', 'ffi', 'heap', bodyOnly);
+assertEq(f3.toString(), "function anonymous(glob, ffi, heap) {\n" + bodyOnly + "\n}");
+assertEq(f3.toSource(), "(function anonymous(glob, ffi, heap) {\n" + bodyOnly + "\n})");
+
+if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
+ var m = new Function('glob', 'ffi', 'heap', bodyOnly);
+ assertEq(isAsmJSModuleLoadedFromCache(m), true);
+ assertEq(m.toString(), "function anonymous(glob, ffi, heap) {\n" + bodyOnly + "\n}");
+ assertEq(m.toSource(), "(function anonymous(glob, ffi, heap) {\n" + bodyOnly + "\n})");
+}
+
+})();
+
+/* Modules in "use strict" context */
+(function() {
+
+var funcSource =
+ `function (glob, ffi, heap) {
+ "use asm";
+ function g() {}
+ return g;
+ }`;
+
+var f4 = eval("\"use strict\";\n(" + funcSource + ")");
+
+var expectedToString = funcSource;
+var expectedToSource = '(' + expectedToString + ')'
+
+assertEq(f4.toString(), expectedToString);
+assertEq(f4.toSource(), expectedToSource);
+
+if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
+ var f5 = eval("\"use strict\";\n(" + funcSource + ")");
+ assertEq(isAsmJSModuleLoadedFromCache(f5), true);
+ assertEq(f5.toString(), expectedToString);
+ assertEq(f5.toSource(), expectedToSource);
+}
+})();
+
+/* Functions */
+(function() {
+
+var noSrc = "function noArgument() {\n\
+ return 42;\n\
+}"
+var oneSrc = "function oneArgument(x) {\n\
+ x = x | 0;\n\
+ return x + 1 | 0;\n\
+}";
+var twoSrc = "function twoArguments(x, y) {\n\
+ x = x | 0;\n\
+ y = y | 0;\n\
+ return x + y | 0;\n\
+}";
+var threeSrc = "function threeArguments(a, b, c) {\n\
+ a = +a;\n\
+ b = +b;\n\
+ c = +c;\n\
+ return +(+(a * b) + c);\n\
+}";
+
+var funcBody = '\n\
+ "use asm";\n'
+ + noSrc + '\n'
+ + oneSrc + '\n'
+ + twoSrc + '\n'
+ + threeSrc + '\n'
+ + 'return {\n\
+ no: noArgument,\n\
+ one: oneArgument,\n\
+ two: twoArguments,\n\
+ three: threeArguments\n\
+ }';
+
+var g = new Function(funcBody);
+var moduleG = g();
+
+function checkFuncSrc(m) {
+ assertEq(m.no.toString(), noSrc);
+ assertEq(m.no.toSource(), noSrc);
+
+ assertEq(m.one.toString(), oneSrc);
+ assertEq(m.one.toSource(), oneSrc);
+
+ assertEq(m.two.toString(), twoSrc);
+ assertEq(m.two.toSource(), twoSrc);
+
+ assertEq(m.three.toString(), threeSrc);
+ assertEq(m.three.toSource(), threeSrc);
+}
+checkFuncSrc(moduleG);
+
+if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
+ var g2 = new Function(funcBody);
+ assertEq(isAsmJSModuleLoadedFromCache(g2), true);
+ m = g2();
+ checkFuncSrc(m);
+
+ var moduleDecl = 'function g3() {' + funcBody + '}';
+ eval(moduleDecl);
+ m = g3();
+ assertEq(isAsmJSModuleLoadedFromCache(g3), false);
+ checkFuncSrc(m);
+
+ eval('var x = 42;' + moduleDecl);
+ m = g3();
+ assertEq(isAsmJSModuleLoadedFromCache(g3), true);
+ checkFuncSrc(m);
+}
+
+})();
+
+/* Functions in "use strict" context */
+(function () {
+
+var funcCode = 'function g(x) {\n\
+ x=x|0;\n\
+ return x + 1 | 0;}';
+var moduleCode = 'function () {\n\
+ "use asm";\n' + funcCode + '\n\
+ return g;\n\
+ }',
+ useStrict = '"use strict";';
+
+var f5 = eval(useStrict + ";\n(" + moduleCode + "())");
+
+var expectedToString = funcCode;
+var expectedToSource = expectedToString
+
+assertEq(f5.toString(), expectedToString);
+assertEq(f5.toSource(), expectedToSource);
+
+if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
+ var mf5 = eval("\"use strict\";\n(" + moduleCode + ")");
+ assertEq(isAsmJSModuleLoadedFromCache(mf5), true);
+ var f5 = mf5();
+ assertEq(f5.toString(), expectedToString);
+ assertEq(f5.toSource(), expectedToSource);
+}
+
+})();
+
+/* Functions in "use strict" context with dynamic linking failure */
+(function () {
+
+var funcCode = 'function g(x) {\n\
+ x=x|0;\n\
+ return x + 1 | 0;}';
+var moduleCode = 'function (glob) {\n\
+ "use asm";\n\
+ var fround = glob.Math.fround;\n\
+ ' + funcCode + '\n\
+ return g;\n\
+ }',
+ useStrict = '"use strict";';
+
+var f6 = eval(useStrict + ";\n(" + moduleCode + "({Math:{}}))");
+
+assertEq(f6.toString(), funcCode);
+assertEq(f6.toSource(), funcCode);
+
+if (isAsmJSCompilationAvailable() && isCachingEnabled()) {
+ var mf6 = eval("\"use strict\";\n(" + moduleCode + ")");
+ assertEq(isAsmJSModuleLoadedFromCache(mf6), true);
+ var f6 = mf6({Math:{}});
+ assertEq(f6.toString(), funcCode);
+ assertEq(f6.toSource(), funcCode);
+}
+
+})();