mathImul.js (1672B)
1 var table = [ 2 [NaN, 0, 0], 3 [Infinity, Infinity, 0], 4 [NaN, 1000, 0], 5 6 [-1, -2, 2], 7 [1, 2, 2], 8 [-1, 2, -2], 9 [1, -2, -2], 10 [-0, 0, 0], 11 [0, -0, 0], 12 [-1, -0, 0], 13 [1, -0, 0], 14 15 [0xffffffff, 1, -1], 16 17 [0xffffffff, 0xffffffff, 1], 18 [0xffffffff, -0xffffffff, -1], 19 [0xffffffff, 0xfffffffe, 2], 20 [0xffffffff, -0xfffffffe, -2], 21 [0x10000, 0x10000, 0], 22 23 [{}, {}, 0], 24 [[], [], 0], 25 [{}, [], 0], 26 [[], {}, 0], 27 28 [{valueOf: function() { return -1; }}, 0x100000, -1048576], 29 ["3", "-4", -12], 30 [3.4, 6, 18] 31 ]; 32 33 try { 34 Math.imul({ valueOf: function() { throw "ha ha ha"; } }); 35 assertEq(true, false, "no error thrown"); 36 } catch (e) { 37 assertEq(e, "ha ha ha"); 38 } 39 40 var order = []; 41 assertEq(Math.imul({ valueOf: function() { order.push("first"); return 0; } }, 42 { valueOf: function() { order.push("second"); return 0; } }), 43 0); 44 assertEq(order[0], "first"); 45 assertEq(order[1], "second"); 46 47 var seen = []; 48 try 49 { 50 Math.imul({ valueOf: function() { seen.push("one"); return 17; } }, 51 { valueOf: function() { throw "abort!"; } }); 52 assertEq(true, false, "no error thrown"); 53 } 54 catch (e) 55 { 56 assertEq(e, "abort!", "should have thrown partway through, instead threw " + e); 57 } 58 assertEq(seen.length, 1); 59 assertEq(seen[0], "one"); 60 61 assertEq(Math.imul(), 0); 62 assertEq(Math.imul(100), 0); 63 assertEq(Math.imul(NaN, 100), 0); 64 assertEq(Math.imul(NaN, NaN), 0); 65 assertEq(Math.imul(5, Infinity), 0); 66 67 for (var i = 0; i < table.length; i++) { 68 assertEq(Math.imul(table[i][0], table[i][1]), table[i][2]); 69 assertEq(Math.imul(table[i][1], table[i][0]), table[i][2]); 70 }