Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
michael@0 | 1 | load(libdir + "asm.js"); |
michael@0 | 2 | |
michael@0 | 3 | setCachingEnabled(true); |
michael@0 | 4 | if (!isAsmJSCompilationAvailable() || !isCachingEnabled()) |
michael@0 | 5 | quit(); |
michael@0 | 6 | |
michael@0 | 7 | var body1 = "'use asm'; function f() { return 42 } function ff() { return 43 } return f"; |
michael@0 | 8 | var m = new Function(body1); |
michael@0 | 9 | assertEq(isAsmJSModule(m), true); |
michael@0 | 10 | assertEq(m()(), 42); |
michael@0 | 11 | var m = new Function(body1); |
michael@0 | 12 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 13 | assertEq(m()(), 42); |
michael@0 | 14 | var body2 = body1 + "f"; |
michael@0 | 15 | var m = new Function(body2); |
michael@0 | 16 | assertEq(isAsmJSModuleLoadedFromCache(m), false); |
michael@0 | 17 | assertEq(m()(), 43); |
michael@0 | 18 | var evalStr1 = "(function() { " + body1 + "})"; |
michael@0 | 19 | var m = eval(evalStr1); |
michael@0 | 20 | assertEq(isAsmJSModuleLoadedFromCache(m), false); |
michael@0 | 21 | assertEq(m()(), 42); |
michael@0 | 22 | var m = eval(evalStr1); |
michael@0 | 23 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 24 | assertEq(m()(), 42); |
michael@0 | 25 | var evalStr2 = "(function() { " + body2 + "})"; |
michael@0 | 26 | var m = eval(evalStr2); |
michael@0 | 27 | assertEq(isAsmJSModuleLoadedFromCache(m), false); |
michael@0 | 28 | assertEq(m()(), 43); |
michael@0 | 29 | var m = eval(evalStr2); |
michael@0 | 30 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 31 | assertEq(m()(), 43); |
michael@0 | 32 | |
michael@0 | 33 | var evalStr3 = "(function(global) { 'use asm'; var sin=global.Math.sin; function g(d) { d=+d; return +sin(d) } return g })"; |
michael@0 | 34 | var m = eval(evalStr3); |
michael@0 | 35 | assertEq(isAsmJSModule(m), true); |
michael@0 | 36 | assertEq(m(this)(.3), Math.sin(.3)); |
michael@0 | 37 | var m = eval(evalStr3); |
michael@0 | 38 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 39 | assertEq(m(this)(.3), Math.sin(.3)); |
michael@0 | 40 | var evalStr4 = "(function(gobal) { 'use asm'; var sin=global.Math.sin; function g(d) { d=+d; return +sin(d) } return g })"; |
michael@0 | 41 | var m = eval(evalStr4); |
michael@0 | 42 | assertEq(isAsmJSModule(m), false); |
michael@0 | 43 | var m = eval(evalStr3); |
michael@0 | 44 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 45 | var evalStr5 = "(function(global,foreign) { 'use asm'; var sin=global.Math.sin; function g(d) { d=+d; return +sin(d) } return g })"; |
michael@0 | 46 | var m = eval(evalStr5); |
michael@0 | 47 | assertEq(isAsmJSModuleLoadedFromCache(m), false); |
michael@0 | 48 | |
michael@0 | 49 | var m = new Function(body1); |
michael@0 | 50 | assertEq(isAsmJSModule(m), true); |
michael@0 | 51 | var body3 = "'use asm'; var sin=global.Math.sin; function g(d) { d=+d; return +sin(d) } return g"; |
michael@0 | 52 | var m = new Function('global', body3); |
michael@0 | 53 | assertEq(isAsmJSModuleLoadedFromCache(m), false); |
michael@0 | 54 | assertEq(m(this)(.2), Math.sin(.2)); |
michael@0 | 55 | var m = new Function('gobal', body3); |
michael@0 | 56 | assertEq(isAsmJSModule(m), false); |
michael@0 | 57 | var m = new Function('global', body3); |
michael@0 | 58 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 59 | var m = new Function('global','foreign', body3); |
michael@0 | 60 | assertEq(isAsmJSModuleLoadedFromCache(m), false); |
michael@0 | 61 | var m = new Function('global','foreign', body3); |
michael@0 | 62 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 63 | var m = new Function('gobal','foreign', body3); |
michael@0 | 64 | assertEq(isAsmJSModule(m), false); |
michael@0 | 65 | var m = new Function('global','foreign', body3); |
michael@0 | 66 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 67 | var m = new Function('global','foregn', body3); |
michael@0 | 68 | assertEq(isAsmJSModuleLoadedFromCache(m), false); |
michael@0 | 69 | var m = new Function('global','foreign', 'buffer', body3); |
michael@0 | 70 | assertEq(isAsmJSModuleLoadedFromCache(m), false); |
michael@0 | 71 | var m = new Function('global','foreign', 'buffer', 'foopy', body3); |
michael@0 | 72 | assertEq(isAsmJSModule(m), false); |
michael@0 | 73 | var m = new Function('global','foreign', 'buffer', body3); |
michael@0 | 74 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 75 | var m = new Function('global','foreign', 'bffer', body3); |
michael@0 | 76 | assertEq(isAsmJSModuleLoadedFromCache(m), false); |
michael@0 | 77 | var m = new Function('global','foreign', 'foreign', body3); |
michael@0 | 78 | assertEq(isAsmJSModule(m), false); |
michael@0 | 79 | |
michael@0 | 80 | var body = "f() { 'use asm'; function g() {} return g }"; |
michael@0 | 81 | var evalStr6 = "(function " + body + ")"; |
michael@0 | 82 | var evalStr7 = "(function* " + body + ")"; |
michael@0 | 83 | var m = eval(evalStr6); |
michael@0 | 84 | assertEq(isAsmJSModule(m), true); |
michael@0 | 85 | var m = eval(evalStr6); |
michael@0 | 86 | assertEq(isAsmJSModuleLoadedFromCache(m), true); |
michael@0 | 87 | var m = eval(evalStr7); |
michael@0 | 88 | assertEq(isAsmJSModule(m), false); |
michael@0 | 89 | |
michael@0 | 90 | // Test caching using a separate process (which, with ASLR, should mean a |
michael@0 | 91 | // separate address space) to compile/cache the code. Ideally, every asmCompile |
michael@0 | 92 | // would do this, but that makes jit-tests run 100x slower. Do it here, for one |
michael@0 | 93 | // of each feature. asm.js/testBullet.js should pound on everything. |
michael@0 | 94 | assertEq(asmLink(asmCompileCached(USE_ASM + "function f(i) { i=i|0; return +((i+1)|0) } function g(d) { d=+d; return +(d + +f(42) + 1.5) } return g"))(.2), .2+43+1.5); |
michael@0 | 95 | assertEq(asmLink(asmCompileCached(USE_ASM + "function f1() { return 1 } function f2() { return 2 } function f(i) { i=i|0; return T[i&1]()|0 } var T=[f1,f2]; return f"))(1), 2); |
michael@0 | 96 | assertEq(asmLink(asmCompileCached("g", USE_ASM + "var s=g.Math.sin; function f(d) { d=+d; return +s(d) } return f"), this)(.3), Math.sin(.3)); |
michael@0 | 97 | assertEq(asmLink(asmCompileCached("g","ffis", USE_ASM + "var ffi=ffis.ffi; function f(i) { i=i|0; return ffi(i|0)|0 } return f"), null, {ffi:function(i){return i+2}})(1), 3); |
michael@0 | 98 | assertEq(asmLink(asmCompileCached("g","ffis", USE_ASM + "var x=ffis.x|0; function f() { return x|0 } return f"), null, {x:43})(), 43); |
michael@0 | 99 | var i32 = new Int32Array(4096); |
michael@0 | 100 | i32[4] = 42; |
michael@0 | 101 | assertEq(asmLink(asmCompileCached("g","ffis","buf", USE_ASM + "var i32=new g.Int32Array(buf); function f(i) { i=i|0; return i32[i>>2]|0 } return f"), this, null, i32.buffer)(4*4), 42); |
michael@0 | 102 | assertEq(asmLink(asmCompileCached('glob', USE_ASM + 'var x=glob.Math.PI; function f() { return +x } return f'), this)(), Math.PI); |