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 | assertAsmTypeFail(USE_ASM + "var i; function f(){} return f"); |
michael@0 | 4 | assertAsmTypeFail(USE_ASM + "const i; function f(){} return f"); |
michael@0 | 5 | assertEq(asmLink(asmCompile(USE_ASM + "var i=0; function f(){} return f"))(), undefined); |
michael@0 | 6 | assertEq(asmLink(asmCompile(USE_ASM + "const i=0; function f(){} return f"))(), undefined); |
michael@0 | 7 | assertEq(asmLink(asmCompile(USE_ASM + "var i=42; function f(){ return i|0 } return f"))(), 42); |
michael@0 | 8 | assertEq(asmLink(asmCompile(USE_ASM + "const i=42; function f(){ return i|0 } return f"))(), 42); |
michael@0 | 9 | assertEq(asmLink(asmCompile(USE_ASM + "var i=4.2; function f(){ return +i } return f"))(), 4.2); |
michael@0 | 10 | assertEq(asmLink(asmCompile(USE_ASM + "const i=4.2; function f(){ return +i } return f"))(), 4.2); |
michael@0 | 11 | assertAsmTypeFail(USE_ASM + "var i=42; function f(){ return +(i+.1) } return f"); |
michael@0 | 12 | assertAsmTypeFail(USE_ASM + "const i=42; function f(){ return +(i+.1) } return f"); |
michael@0 | 13 | assertAsmTypeFail(USE_ASM + "var i=1.2; function f(){ return i|0 } return f"); |
michael@0 | 14 | assertAsmTypeFail(USE_ASM + "const i=1.2; function f(){ return i|0 } return f"); |
michael@0 | 15 | assertAsmTypeFail(USE_ASM + "var i=0; function f(e){ e=+e; i=e } return f"); |
michael@0 | 16 | assertAsmTypeFail(USE_ASM + "const i=0; function f(e){ e=+e; i=e } return f"); |
michael@0 | 17 | assertAsmTypeFail(USE_ASM + "var d=0.1; function f(i){ i=i|0; d=i } return f"); |
michael@0 | 18 | assertAsmTypeFail(USE_ASM + "const d=0.1; function f(i){ i=i|0; d=i } return f"); |
michael@0 | 19 | assertEq(asmLink(asmCompile(USE_ASM + "var i=13; function f(j) { j=j|0; i=j; return i|0 } return f"))(42), 42); |
michael@0 | 20 | assertAsmTypeFail(USE_ASM + "const i=13; function f(j) { j=j|0; i=j; return i|0 } return f"); |
michael@0 | 21 | assertAsmTypeFail(USE_ASM + "const c=0,i=13; function f(j) { j=j|0; i=j; return i|0 } return f"); |
michael@0 | 22 | assertEq(asmLink(asmCompile(USE_ASM + "var d=.1; function f(e) { e=+e; d=e; return +e } return f"))(42.1), 42.1); |
michael@0 | 23 | assertAsmTypeFail(USE_ASM + "const d=.1; function f(e) { e=+e; d=e; return +e } return f"); |
michael@0 | 24 | assertAsmTypeFail(USE_ASM + "const c=0, d=.1; function f(e) { e=+e; d=e; return +e } return f"); |
michael@0 | 25 | assertEq(asmLink(asmCompile(USE_ASM + "var i=13; function f(i, j) { i=i|0; j=j|0; i=j; return i|0 } return f"))(42,43), 43); |
michael@0 | 26 | assertEq(asmLink(asmCompile(USE_ASM + "var i=13; function f(j) { j=j|0; var i=0; i=j; return i|0 } return f"))(42), 42); |
michael@0 | 27 | |
michael@0 | 28 | var f = asmLink(asmCompile(USE_ASM + "var i=13; function f(j) { j=j|0; if ((j|0) != -1) { i=j } else { return i|0 } return 0 } return f")); |
michael@0 | 29 | assertEq(f(-1), 13); |
michael@0 | 30 | assertEq(f(42), 0); |
michael@0 | 31 | assertEq(f(-1), 42); |
michael@0 | 32 | |
michael@0 | 33 | assertAsmTypeFail(USE_ASM + "var i=13; function f() { var j=i; return j|0 } return f"); |
michael@0 | 34 | assertAsmTypeFail(USE_ASM + "var i=13.37; function f() { var j=i; return +j } return f"); |
michael@0 | 35 | assertAsmTypeFail('global', USE_ASM + "var f32 = global.Math.fround; var i=f32(13.37); function f() { var j=i; return f32(j) } return f"); |
michael@0 | 36 | |
michael@0 | 37 | assertEq(asmLink(asmCompile('global', USE_ASM + 'var i=global.Infinity; function f() { var j=i; return +j } return f'), {Infinity:Infinity})(), Infinity); |
michael@0 | 38 | assertEq(asmLink(asmCompile('global', USE_ASM + 'var i=global.NaN; function f() { var j=i; return +j } return f'), {NaN:NaN})(), NaN); |
michael@0 | 39 | |
michael@0 | 40 | assertEq(asmLink(asmCompile(USE_ASM + "const i=13; function f() { var j=i; return j|0 } return f"))(), 13); |
michael@0 | 41 | assertEq(asmLink(asmCompile(USE_ASM + "const i=13.37; function f() { var j=i; return +j } return f"))(), 13.37); |
michael@0 | 42 | assertEq(asmLink(asmCompile('global', USE_ASM + "var f32 = global.Math.fround; const i=f32(13.37); function f() { var j=i; return f32(j) } return f"), this)(), Math.fround(13.37)); |
michael@0 | 43 | |
michael@0 | 44 | assertAsmTypeFail(USE_ASM + "function f() { var j=i; return j|0 } return f"); |
michael@0 | 45 | assertAsmTypeFail(USE_ASM + "function i(){} function f() { var j=i; return j|0 } return f"); |
michael@0 | 46 | assertAsmTypeFail(USE_ASM + "function f() { var j=i; return j|0 } var i = [f]; return f"); |
michael@0 | 47 | assertAsmTypeFail('global', USE_ASM + "var i=global.Math.fround; function f() { var j=i; return j|0 } return f"); |
michael@0 | 48 | assertAsmTypeFail('global', 'imp', USE_ASM + "var i=imp.f; function f() { var j=i; return j|0 } return f"); |
michael@0 | 49 | assertAsmTypeFail('global', 'imp', USE_ASM + "var i=imp.i|0; function f() { var j=i; return j|0 } return f"); |
michael@0 | 50 | assertAsmTypeFail('global', 'imp', USE_ASM + "var i=+imp.i; function f() { var j=i; return +j } return f"); |
michael@0 | 51 | assertAsmTypeFail('global', 'imp', USE_ASM + "const i=imp.i|0; function f() { var j=i; return j|0 } return f"); |
michael@0 | 52 | assertAsmTypeFail('global', 'imp', USE_ASM + "const i=+imp.i; function f() { var j=i; return +j } return f"); |
michael@0 | 53 | assertAsmTypeFail('global', 'imp', 'heap', USE_ASM + "var i=new global.Float32Array(heap); function f() { var j=i; return +j } return f"); |
michael@0 | 54 | |
michael@0 | 55 | assertAsmTypeFail('global', USE_ASM + "var i=global; function f() { return i|0 } return f"); |
michael@0 | 56 | assertAsmTypeFail('global', USE_ASM + "const i=global; function f() { return i|0 } return f"); |
michael@0 | 57 | assertAsmTypeFail('global', USE_ASM + "var i=global|0; function f() { return i|0 } return f"); |
michael@0 | 58 | assertAsmTypeFail('global', USE_ASM + "const i=global|0; function f() { return i|0 } return f"); |
michael@0 | 59 | assertAsmTypeFail('global', USE_ASM + "var j=0;var i=j.i|0; function f() { return i|0 } return f"); |
michael@0 | 60 | assertAsmTypeFail('global', USE_ASM + "var i=global.i|0; function f() { return i|0 } return f"); |
michael@0 | 61 | assertAsmTypeFail('global', USE_ASM + "const i=global.i|0; function f() { return i|0 } return f"); |
michael@0 | 62 | assertAsmTypeFail('global', USE_ASM + "var i=global.i|0; function f() { return i|0 } return f"); |
michael@0 | 63 | assertAsmTypeFail('global', USE_ASM + 'var i=global.Infinity; function f() { i = 0.0 } return f'); |
michael@0 | 64 | assertAsmTypeFail('global', USE_ASM + 'const i=global.Infinity; function f() { i = 0.0 } return f'); |
michael@0 | 65 | assertAsmLinkAlwaysFail(asmCompile('global', USE_ASM + 'var i=global.Infinity; function f() { return +i } return f'), undefined); |
michael@0 | 66 | assertAsmLinkAlwaysFail(asmCompile('global', USE_ASM + 'const i=global.Infinity; function f() { return +i } return f'), undefined); |
michael@0 | 67 | assertAsmLinkAlwaysFail(asmCompile('global', USE_ASM + 'var i=global.Infinity; function f() { return +i } return f'), null); |
michael@0 | 68 | assertAsmLinkAlwaysFail(asmCompile('global', USE_ASM + 'const i=global.Infinity; function f() { return +i } return f'), null); |
michael@0 | 69 | assertAsmLinkFail(asmCompile('global', USE_ASM + 'var i=global.Infinity; function f() { return +i } return f'), 3); |
michael@0 | 70 | assertAsmLinkFail(asmCompile('global', USE_ASM + 'var i=global.Infinity; function f() { return +i } return f'), {}); |
michael@0 | 71 | assertAsmLinkFail(asmCompile('global', USE_ASM + 'var i=global.Infinity; function f() { return +i } return f'), {Infinity:NaN}); |
michael@0 | 72 | assertAsmLinkFail(asmCompile('global', USE_ASM + 'var i=global.Infinity; function f() { return +i } return f'), {Infinity:-Infinity}); |
michael@0 | 73 | assertEq(asmLink(asmCompile('global', USE_ASM + 'var i=global.Infinity; function f() { return +i } return f'), {Infinity:Infinity})(), Infinity); |
michael@0 | 74 | assertEq(asmLink(asmCompile('global', USE_ASM + 'const i=global.Infinity; function f() { return +i } return f'), {Infinity:Infinity})(), Infinity); |
michael@0 | 75 | assertEq(asmLink(asmCompile('global', USE_ASM + 'var i=global.Infinity; function f() { return +i } return f'), this)(), Infinity); |
michael@0 | 76 | assertEq(asmLink(asmCompile('global', USE_ASM + 'const i=global.Infinity; function f() { return +i } return f'), this)(), Infinity); |
michael@0 | 77 | assertAsmLinkAlwaysFail(asmCompile('global', USE_ASM + 'var i=global.NaN; function f() { return +i } return f'), undefined); |
michael@0 | 78 | assertAsmLinkAlwaysFail(asmCompile('global', USE_ASM + 'var i=global.NaN; function f() { return +i } return f'), null); |
michael@0 | 79 | assertAsmLinkFail(asmCompile('global', USE_ASM + 'var i=global.NaN; function f() { return +i } return f'), 3); |
michael@0 | 80 | assertAsmLinkFail(asmCompile('global', USE_ASM + 'var i=global.NaN; function f() { return +i } return f'), {}); |
michael@0 | 81 | assertAsmLinkFail(asmCompile('global', USE_ASM + 'var i=global.NaN; function f() { return +i } return f'), {Infinity:Infinity}); |
michael@0 | 82 | assertAsmLinkFail(asmCompile('global', USE_ASM + 'var i=global.NaN; function f() { return +i } return f'), {Infinity:-Infinity}); |
michael@0 | 83 | assertEq(asmLink(asmCompile('global', USE_ASM + 'var i=global.NaN; function f() { return +i } return f'), {NaN:NaN})(), NaN); |
michael@0 | 84 | assertEq(asmLink(asmCompile('global', USE_ASM + 'const i=global.NaN; function f() { return +i } return f'), {NaN:NaN})(), NaN); |
michael@0 | 85 | assertEq(asmLink(asmCompile('global', USE_ASM + 'var i=global.NaN; function f() { return +i } return f'), this)(), NaN); |
michael@0 | 86 | assertEq(asmLink(asmCompile('global', USE_ASM + 'const i=global.NaN; function f() { return +i } return f'), this)(), NaN); |
michael@0 | 87 | |
michael@0 | 88 | assertAsmLinkFail(asmCompile('glob','foreign','buf', USE_ASM + 'var t = new glob.Int32Array(buf); function f() {} return f'), {get Int32Array(){return Int32Array}}, null, new ArrayBuffer(4096)) |
michael@0 | 89 | assertAsmLinkFail(asmCompile('glob','foreign','buf', USE_ASM + 'const t = new glob.Int32Array(buf); function f() {} return f'), {get Int32Array(){return Int32Array}}, null, new ArrayBuffer(4096)) |
michael@0 | 90 | assertAsmLinkFail(asmCompile('glob','foreign','buf', USE_ASM + 'var t = new glob.Int32Array(buf); function f() {} return f'), new Proxy({}, {get:function() {return Int32Array}}), null, new ArrayBuffer(4096)) |
michael@0 | 91 | assertAsmLinkFail(asmCompile('glob','foreign','buf', USE_ASM + 'const t = new glob.Int32Array(buf); function f() {} return f'), new Proxy({}, {get:function() {return Int32Array}}), null, new ArrayBuffer(4096)) |
michael@0 | 92 | assertAsmLinkFail(asmCompile('glob', USE_ASM + 'var t = glob.Math.sin; function f() {} return f'), {get Math(){return Math}}); |
michael@0 | 93 | assertAsmLinkFail(asmCompile('glob', USE_ASM + 'var t = glob.Math.sin; function f() {} return f'), new Proxy({}, {get:function(){return Math}})); |
michael@0 | 94 | assertAsmLinkFail(asmCompile('glob', USE_ASM + 'var t = glob.Math.sin; function f() {} return f'), {Math:{get sin(){return Math.sin}}}); |
michael@0 | 95 | assertAsmLinkFail(asmCompile('glob', USE_ASM + 'var t = glob.Math.sin; function f() {} return f'), {Math:new Proxy({}, {get:function(){return Math.sin}})}); |
michael@0 | 96 | assertAsmLinkFail(asmCompile('glob', USE_ASM + 'var t = glob.Infinity; function f() {} return f'), {get Infinity(){return Infinity}}); |
michael@0 | 97 | assertAsmLinkFail(asmCompile('glob', USE_ASM + 'var t = glob.Math.sin; function f() {} return f'), new Proxy({}, {get:function(){return Infinity}})); |
michael@0 | 98 | assertAsmLinkFail(asmCompile('glob','foreign', USE_ASM + 'var i = foreign.x|0; function f() {} return f'), null, {get x(){return 42}}) |
michael@0 | 99 | assertAsmLinkFail(asmCompile('glob','foreign', USE_ASM + 'var i = +foreign.x; function f() {} return f'), null, {get x(){return 42}}) |
michael@0 | 100 | assertAsmLinkFail(asmCompile('glob','foreign', USE_ASM + 'var i = foreign.x|0; function f() {} return f'), null, new Proxy({}, {get:function() { return 42}})); |
michael@0 | 101 | assertAsmLinkFail(asmCompile('glob','foreign', USE_ASM + 'var i = +foreign.x; function f() {} return f'), null, new Proxy({}, {get:function() { return 42}})); |
michael@0 | 102 | assertAsmLinkFail(asmCompile('glob','foreign', USE_ASM + 'var i = foreign.x; function f() {} return f'), null, {get x(){return function(){}}}) |
michael@0 | 103 | assertAsmLinkFail(asmCompile('glob','foreign', USE_ASM + 'var i = foreign.x; function f() {} return f'), null, new Proxy({}, {get:function() { return function(){}}})); |
michael@0 | 104 | assertAsmTypeFail('global', 'imp', USE_ASM + "var i=imp; function f() { return i|0 } return f"); |
michael@0 | 105 | assertAsmTypeFail('global', 'imp', USE_ASM + "var j=0;var i=j.i|0; function f() { return i|0 } return f"); |
michael@0 | 106 | assertAsmLinkAlwaysFail(asmCompile('global','imp', USE_ASM + "var i=imp.i|0; function f() { return i|0 } return f"), null, undefined); |
michael@0 | 107 | assertAsmLinkAlwaysFail(asmCompile('global','imp', USE_ASM + "var i=imp.i|0; function f() { return i|0 } return f"), this, undefined); |
michael@0 | 108 | assertAsmLinkAlwaysFail(asmCompile('global', 'imp', USE_ASM + "var i=imp.i|0; function f() { return i|0 } return f"), null, null); |
michael@0 | 109 | assertAsmLinkAlwaysFail(asmCompile('global', 'imp', USE_ASM + "var i=imp.i|0; function f() { return i|0 } return f"), this, null); |
michael@0 | 110 | assertAsmLinkFail(asmCompile('global', 'imp', USE_ASM + "var i=imp.i|0; function f() { return i|0 } return f"), this, 42); |
michael@0 | 111 | assertEq(asmLink(asmCompile('global', 'imp', USE_ASM + "var i=imp.i|0; function f() { return i|0 } return f")(null, {i:42})), 42); |
michael@0 | 112 | assertEq(asmLink(asmCompile('global', 'imp', USE_ASM + "const i=imp.i|0; function f() { return i|0 } return f")(null, {i:42})), 42); |
michael@0 | 113 | assertEq(asmLink(asmCompile('global', 'imp', USE_ASM + "var i=imp.i|0; function f() { return i|0 } return f")(null, {i:1.4})), 1); |
michael@0 | 114 | assertEq(asmLink(asmCompile('global', 'imp', USE_ASM + "const i=imp.i|0; function f() { return i|0 } return f")(null, {i:1.4})), 1); |
michael@0 | 115 | assertEq(asmLink(asmCompile('global', 'imp', USE_ASM + "var i=+imp.i; function f() { return +i } return f")(null, {i:42})), 42); |
michael@0 | 116 | assertEq(asmLink(asmCompile('global', 'imp', USE_ASM + "const i=+imp.i; function f() { return +i } return f")(null, {i:42})), 42); |
michael@0 | 117 | assertEq(asmLink(asmCompile('global', 'imp', USE_ASM + "var i=+imp.i; function f() { return +i } return f")(this, {i:1.4})), 1.4); |
michael@0 | 118 | assertEq(asmLink(asmCompile('global', 'imp', USE_ASM + "const i=+imp.i; function f() { return +i } return f")(this, {i:1.4})), 1.4); |
michael@0 | 119 | assertEq(asmLink(asmCompile(USE_ASM + "var g=0; function f() { var i=42; while (1) { break; } g = i; return g|0 } return f"))(), 42); |
michael@0 | 120 | |
michael@0 | 121 | var f1 = asmCompile('global', 'foreign', 'heap', USE_ASM + 'var i32 = new global.Int32Array(heap); function g() { return i32[4]|0 } return g'); |
michael@0 | 122 | var global = this; |
michael@0 | 123 | var ab = new ArrayBuffer(4096); |
michael@0 | 124 | var p = new Proxy(global, |
michael@0 | 125 | {has:function(name) { f1(global, null, ab); return true}, |
michael@0 | 126 | getOwnPropertyDescriptor:function(name) { return {value:Int32Array}}}); |
michael@0 | 127 | new Int32Array(ab)[4] = 42; |
michael@0 | 128 | assertEq(f1(p, null, ab)(), 42); |
michael@0 | 129 | |
michael@0 | 130 | // GVN checks |
michael@0 | 131 | assertEq(asmLink(asmCompile(USE_ASM + "var g=0; function f() { var x = 0; g = 1; x = g; return (x+g)|0 } return f"))(), 2); |
michael@0 | 132 | assertEq(asmLink(asmCompile(USE_ASM + "var g=0; function f() { var x = 0; g = 1; x = g; g = 2; return (x+g)|0 } return f"))(), 3); |
michael@0 | 133 | assertEq(asmLink(asmCompile(USE_ASM + "var g=0; var h=0; function f() { var x = 0; g = 1; x = g; h = 3; return (x+g)|0 } return f"))(), 2); |