michael@0: function f1() { "use asm"; function g() {} return g } michael@0: if (this.jsFuns) { michael@0: ok(jsFuns.isAsmJSModule(f1), "f1 is an asm.js module"); michael@0: ok(jsFuns.isAsmJSFunction(f1()), "f1.g is an asm.js function"); michael@0: } michael@0: michael@0: function f2(stdlib, foreign, buffer) { michael@0: "use asm"; michael@0: var i32 = new stdlib.Int32Array(buffer); michael@0: function main(n) { michael@0: n = n|0; michael@0: var i = 0, sum = 0; michael@0: for (; (i|0) < (n|0); i=(i+1)|0) michael@0: sum = (sum + (i32[(i<<2)>>2]|0))|0; michael@0: return sum|0; michael@0: } michael@0: return main; michael@0: } michael@0: if (this.jsFuns) michael@0: ok(jsFuns.isAsmJSModule(f2), "f2 is an asm.js module"); michael@0: var i32 = new Int32Array(1024); michael@0: for (var i = 0; i < i32.length; i++) michael@0: i32[i] = i; michael@0: var f2Main = f2(this, null, i32.buffer); michael@0: if (this.jsFuns) michael@0: ok(jsFuns.isAsmJSFunction(f2Main), "f2.main is an asm.js function"); michael@0: if (f2Main(4) !== 6) michael@0: throw "f2Main(4)"; michael@0: if (f2Main(100) !== 4950) michael@0: throw "f2.main(100)"; michael@0: var sum = (((i32.length - 1) * i32.length) / 2); michael@0: if (f2Main(i32.length) !== sum) michael@0: throw "f2.main(" + i32.length + ")"; michael@0: if (f2Main(i32.length + 100) !== sum) michael@0: throw "f2.main(" + i32.length + ")"; michael@0: michael@0: function f3(stdlib, foreign, buffer) { michael@0: "use asm"; michael@0: var done = foreign.done; michael@0: var i32 = new stdlib.Int32Array(buffer); michael@0: function main() { michael@0: var i = 0, sum = 0; michael@0: while (1) { michael@0: for (i = 0; (i|0) < 1000; i=(i+1)|0) michael@0: sum = (sum + i)|0; michael@0: if (done(sum|0)|0) michael@0: break; michael@0: } michael@0: return sum|0; michael@0: } michael@0: return main; michael@0: } michael@0: var begin; michael@0: var lastSum; michael@0: function done(sum) { michael@0: if (sum !== ((lastSum + 499500)|0)) michael@0: throw "bad sum: " + sum + ", " + lastSum + ", " + ((lastSum + 499500)|0); michael@0: lastSum = sum; michael@0: return (Date.now() - begin) > 3000; michael@0: } michael@0: var f3Main = f3(this, {done:done}, i32.buffer); michael@0: if (this.jsFuns) michael@0: ok(jsFuns.isAsmJSFunction(f3Main), "f3.main is an asm.js function"); michael@0: michael@0: begin = Date.now(); michael@0: lastSum = 0; michael@0: if (f3Main() !== lastSum) michael@0: throw "f3.main()"; michael@0: michael@0: if (!this.jsFuns) michael@0: postMessage("ok");