michael@0: setCachingEnabled(true); michael@0: michael@0: (function() { michael@0: /* michael@0: * NO ARGUMENT michael@0: */ michael@0: michael@0: function f0() { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: var bodyOnly = '"use asm";\n\ michael@0: function g() {}\n\ michael@0: return g;\n'; michael@0: michael@0: var funcBody = 'function f0() {\n\ michael@0: "use asm";\n\ michael@0: function g() {}\n\ michael@0: return g;\n\n\ michael@0: }'; michael@0: michael@0: assertEq(f0.toString(), funcBody); michael@0: assertEq(f0.toSource(), funcBody); michael@0: michael@0: var f0 = function() { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: funcBody1 = funcBody.replace('function f0','function '); michael@0: assertEq(f0.toString(), funcBody1); michael@0: assertEq(f0.toSource(), '(' + funcBody1 + ')'); michael@0: michael@0: var g = function g0() { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: funcBody2 = funcBody.replace('function f0', 'function g0'); michael@0: assertEq(g.toString(), funcBody2); michael@0: assertEq(g.toSource(), '(' + funcBody2 + ')'); michael@0: michael@0: f0 = new Function(bodyOnly); michael@0: assertEq(f0.toString(), "function anonymous() {\n" + bodyOnly + "\n}"); michael@0: assertEq(f0.toSource(), "(function anonymous() {\n" + bodyOnly + "\n})"); michael@0: michael@0: if (isAsmJSCompilationAvailable() && isCachingEnabled()) { michael@0: var m = new Function(bodyOnly); michael@0: assertEq(isAsmJSModuleLoadedFromCache(m), true); michael@0: assertEq(m.toString(), "function anonymous() {\n" + bodyOnly + "\n}"); michael@0: assertEq(m.toSource(), "(function anonymous() {\n" + bodyOnly + "\n})"); michael@0: } michael@0: michael@0: })(); michael@0: michael@0: (function() { michael@0: /* michael@0: * ONE ARGUMENT michael@0: */ michael@0: function f1(glob) { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: var bodyOnly = '"use asm";\n\ michael@0: function g() {}\n\ michael@0: return g;\n'; michael@0: michael@0: var funcBody = 'function f1(glob) {\n\ michael@0: "use asm";\n\ michael@0: function g() {}\n\ michael@0: return g;\n\n\ michael@0: }'; michael@0: michael@0: assertEq(f1.toString(), funcBody); michael@0: assertEq(f1.toSource(), funcBody); michael@0: michael@0: f1 = function(glob) { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: funcBody1 = funcBody.replace('function f1', 'function '); michael@0: assertEq(f1.toString(), funcBody1); michael@0: assertEq(f1.toSource(), '(' + funcBody1 + ')'); michael@0: michael@0: var g = function g0(glob) { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: funcBody2 = funcBody.replace('function f1', 'function g0'); michael@0: assertEq(g.toString(), funcBody2); michael@0: assertEq(g.toSource(), '(' + funcBody2 + ')'); michael@0: michael@0: f1 = new Function('glob', bodyOnly); michael@0: assertEq(f1.toString(), "function anonymous(glob) {\n" + bodyOnly + "\n}"); michael@0: assertEq(f1.toSource(), "(function anonymous(glob) {\n" + bodyOnly + "\n})"); michael@0: michael@0: if (isAsmJSCompilationAvailable() && isCachingEnabled()) { michael@0: var m = new Function('glob', bodyOnly); michael@0: assertEq(isAsmJSModuleLoadedFromCache(m), true); michael@0: assertEq(m.toString(), "function anonymous(glob) {\n" + bodyOnly + "\n}"); michael@0: assertEq(m.toSource(), "(function anonymous(glob) {\n" + bodyOnly + "\n})"); michael@0: } michael@0: michael@0: })(); michael@0: michael@0: michael@0: (function() { michael@0: /* michael@0: * TWO ARGUMENTS michael@0: */ michael@0: function f2(glob, ffi) { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: var bodyOnly = '"use asm";\n\ michael@0: function g() {}\n\ michael@0: return g;\n'; michael@0: michael@0: var funcBody = 'function f2(glob, ffi) {\n\ michael@0: "use asm";\n\ michael@0: function g() {}\n\ michael@0: return g;\n\n\ michael@0: }'; michael@0: michael@0: assertEq(f2.toString(), funcBody); michael@0: assertEq(f2.toSource(), funcBody); michael@0: michael@0: f2 = function (glob, ffi) { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: funcBody1 = funcBody.replace('function f2', 'function '); michael@0: assertEq(f2.toString(), funcBody1); michael@0: assertEq(f2.toSource(), '(' + funcBody1 + ')'); michael@0: michael@0: var g = function g0(glob, ffi) { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: var funcBody2 = funcBody.replace('function f2', 'function g0'); michael@0: assertEq(g.toString(), funcBody2); michael@0: assertEq(g.toSource(), '(' + funcBody2 + ')'); michael@0: michael@0: f2 = new Function('glob', 'ffi', bodyOnly); michael@0: assertEq(f2.toString(), "function anonymous(glob, ffi) {\n" + bodyOnly + "\n}"); michael@0: assertEq(f2.toSource(), "(function anonymous(glob, ffi) {\n" + bodyOnly + "\n})"); michael@0: michael@0: if (isAsmJSCompilationAvailable() && isCachingEnabled()) { michael@0: var m = new Function('glob', 'ffi', bodyOnly); michael@0: assertEq(isAsmJSModuleLoadedFromCache(m), true); michael@0: assertEq(m.toString(), "function anonymous(glob, ffi) {\n" + bodyOnly + "\n}"); michael@0: assertEq(m.toSource(), "(function anonymous(glob, ffi) {\n" + bodyOnly + "\n})"); michael@0: } michael@0: michael@0: })(); michael@0: michael@0: michael@0: (function() { michael@0: /* michael@0: * THREE ARGUMENTS michael@0: */ michael@0: function f3(glob, ffi, heap) { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: var bodyOnly = '"use asm";\n\ michael@0: function g() {}\n\ michael@0: return g;\n'; michael@0: michael@0: var funcBody = 'function f3(glob, ffi, heap) {\n\ michael@0: "use asm";\n\ michael@0: function g() {}\n\ michael@0: return g;\n\n\ michael@0: }'; michael@0: michael@0: assertEq(f3.toString(), funcBody); michael@0: assertEq(f3.toSource(), funcBody); michael@0: michael@0: f3 = function (glob, ffi, heap) { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: funcBody1 = funcBody.replace('function f3', 'function '); michael@0: assertEq(f3.toString(), funcBody1); michael@0: assertEq(f3.toSource(), '(' + funcBody1 + ')'); michael@0: michael@0: var g = function g0(glob, ffi, heap) { michael@0: "use asm"; michael@0: function g() {} michael@0: return g; michael@0: michael@0: } michael@0: michael@0: funcBody2 = funcBody.replace('function f3', 'function g0'); michael@0: assertEq(g.toString(), funcBody2); michael@0: assertEq(g.toSource(), '(' + funcBody2 + ')'); michael@0: michael@0: f3 = new Function('glob', 'ffi', 'heap', bodyOnly); michael@0: assertEq(f3.toString(), "function anonymous(glob, ffi, heap) {\n" + bodyOnly + "\n}"); michael@0: assertEq(f3.toSource(), "(function anonymous(glob, ffi, heap) {\n" + bodyOnly + "\n})"); michael@0: michael@0: if (isAsmJSCompilationAvailable() && isCachingEnabled()) { michael@0: var m = new Function('glob', 'ffi', 'heap', bodyOnly); michael@0: assertEq(isAsmJSModuleLoadedFromCache(m), true); michael@0: assertEq(m.toString(), "function anonymous(glob, ffi, heap) {\n" + bodyOnly + "\n}"); michael@0: assertEq(m.toSource(), "(function anonymous(glob, ffi, heap) {\n" + bodyOnly + "\n})"); michael@0: } michael@0: michael@0: })(); michael@0: michael@0: /* Implicit "use strict" context */ michael@0: (function() { michael@0: michael@0: var funcHeader = 'function (glob, ffi, heap) {', michael@0: funcBody = '\n"use asm";\n\ michael@0: function g() {}\n\ michael@0: return g;\n\n' michael@0: funcFooter = '}', michael@0: funcSource = funcHeader + funcBody + funcFooter michael@0: useStrict = '\n"use strict";\n'; michael@0: michael@0: var f4 = eval("\"use strict\";\n(" + funcSource + ")"); michael@0: michael@0: var expectedToString = funcHeader + useStrict + funcBody + funcFooter michael@0: var expectedToSource = '(' + expectedToString + ')' michael@0: michael@0: assertEq(f4.toString(), expectedToString); michael@0: assertEq(f4.toSource(), expectedToSource); michael@0: michael@0: if (isAsmJSCompilationAvailable() && isCachingEnabled()) { michael@0: var f5 = eval("\"use strict\";\n(" + funcSource + ")"); michael@0: assertEq(isAsmJSModuleLoadedFromCache(f5), true); michael@0: assertEq(f5.toString(), expectedToString); michael@0: assertEq(f5.toSource(), expectedToSource); michael@0: } michael@0: })(); michael@0: michael@0: /* Functions */ michael@0: (function() { michael@0: michael@0: var noSrc = "function noArgument() {\n\ michael@0: return 42;\n\ michael@0: }" michael@0: var oneSrc = "function oneArgument(x) {\n\ michael@0: x = x | 0;\n\ michael@0: return x + 1 | 0;\n\ michael@0: }"; michael@0: var twoSrc = "function twoArguments(x, y) {\n\ michael@0: x = x | 0;\n\ michael@0: y = y | 0;\n\ michael@0: return x + y | 0;\n\ michael@0: }"; michael@0: var threeSrc = "function threeArguments(a, b, c) {\n\ michael@0: a = +a;\n\ michael@0: b = +b;\n\ michael@0: c = +c;\n\ michael@0: return +(+(a * b) + c);\n\ michael@0: }"; michael@0: michael@0: var funcBody = '\n\ michael@0: "use asm";\n' michael@0: + noSrc + '\n' michael@0: + oneSrc + '\n' michael@0: + twoSrc + '\n' michael@0: + threeSrc + '\n' michael@0: + 'return {\n\ michael@0: no: noArgument,\n\ michael@0: one: oneArgument,\n\ michael@0: two: twoArguments,\n\ michael@0: three: threeArguments\n\ michael@0: }'; michael@0: michael@0: var g = new Function(funcBody); michael@0: var moduleG = g(); michael@0: michael@0: function checkFuncSrc(m) { michael@0: assertEq(m.no.toString(), noSrc); michael@0: assertEq(m.no.toSource(), noSrc); michael@0: michael@0: assertEq(m.one.toString(), oneSrc); michael@0: assertEq(m.one.toSource(), oneSrc); michael@0: michael@0: assertEq(m.two.toString(), twoSrc); michael@0: assertEq(m.two.toSource(), twoSrc); michael@0: michael@0: assertEq(m.three.toString(), threeSrc); michael@0: assertEq(m.three.toSource(), threeSrc); michael@0: } michael@0: checkFuncSrc(moduleG); michael@0: michael@0: if (isAsmJSCompilationAvailable() && isCachingEnabled()) { michael@0: var g2 = new Function(funcBody); michael@0: assertEq(isAsmJSModuleLoadedFromCache(g2), true); michael@0: m = g2(); michael@0: checkFuncSrc(m); michael@0: michael@0: var moduleDecl = 'function g3() {' + funcBody + '}'; michael@0: eval(moduleDecl); michael@0: m = g3(); michael@0: assertEq(isAsmJSModuleLoadedFromCache(g3), false); michael@0: checkFuncSrc(m); michael@0: michael@0: eval('var x = 42;' + moduleDecl); michael@0: m = g3(); michael@0: assertEq(isAsmJSModuleLoadedFromCache(g3), true); michael@0: checkFuncSrc(m); michael@0: } michael@0: michael@0: })();