// Using full number + null for math. function addArgsNumberAndNull(a, b) { return a + b; } noInline(addArgsNumberAndNull); for (var i = 0; i < 1e4; ++i) { var value = addArgsNumberAndNull(i, 1); if (value !== (i + 1)) throw "addArgsNumberAndNull(i, 1) failed with i = " + i + " returned value = " + value; var value = addArgsNumberAndNull(0.5, i); if (value !== (i + 0.5)) throw "addArgsNumberAndNull(0.5, i) failed with i = " + i + " returned value = " + value; var value = addArgsNumberAndNull(null, i); if (value !== i) throw "addArgsNumberAndNull(null, i) failed with i = " + i + " returned value = " + value; var value = addArgsNumberAndNull(i, null); if (value !== i) throw "addArgsNumberAndNull(i, null) failed with i = " + i + " returned value = " + value; var value = addArgsNumberAndNull(null, null); if (value !== 0) throw "addArgsNumberAndNull(null, null) failed with i = " + i + " returned value = " + value; } // Using int32 + null for math. function addArgsInt32AndNull(a, b) { return a + b; } noInline(addArgsInt32AndNull); for (var i = 0; i < 1e4; ++i) { var value = addArgsInt32AndNull(i, 1); if (value !== (i + 1)) throw "addArgsInt32AndNull(i, 1) failed with i = " + i + " returned value = " + value; var value = addArgsInt32AndNull(null, i); if (value !== i) throw "addArgsInt32AndNull(null, i) failed with i = " + i + " returned value = " + value; var value = addArgsInt32AndNull(i, null); if (value !== i) throw "addArgsInt32AndNull(i, null) failed with i = " + i + " returned value = " + value; var value = addArgsInt32AndNull(null, null); if (value !== 0) throw "addArgsInt32AndNull(null, null) failed with i = " + i + " returned value = " + value; } function testFallbackWithDouble() { var value = addArgsNumberAndNull(Math.PI, Math.PI); if (value !== 2 * Math.PI) throw "addArgsNumberAndNull(Math.PI, Math.PI) failed with i = " + i + " returned value = " + value; } testFallbackWithDouble(); // Using full number + null for math. function addArgsDoubleAndNull(a, b) { return a + b; } noInline(addArgsDoubleAndNull); for (var i = 0; i < 1e4; ++i) { var value = addArgsDoubleAndNull(0.5, i); if (value !== (i + 0.5)) throw "addArgsDoubleAndNull(0.5, i) failed with i = " + i + " returned value = " + value; var value = addArgsDoubleAndNull(null, 0.1); if (value !== 0.1) throw "addArgsDoubleAndNull(null, i) failed with i = " + i + " returned value = " + value; var value = addArgsDoubleAndNull(0.6, null); if (value !== 0.6) throw "addArgsDoubleAndNull(i, null) failed with i = " + i + " returned value = " + value; } function testFallbackWithObject() { var value = addArgsDoubleAndNull(Math.PI, { valueOf: function() { return 5; }}); if (value !== 5 + Math.PI) throw "addArgsDoubleAndNull(Math.PI, { valueOf: function() { return 5; }}) failed with i = " + i + " returned value = " + value; } testFallbackWithObject(); // Using only null function addArgsOnlyNull(a, b) { return a + b; } noInline(addArgsOnlyNull); for (var i = 0; i < 1e4; ++i) { var value = addArgsOnlyNull(null, null); if (value !== 0) throw "addArgsOnlyNull(null, null) failed with i = " + i + " returned value = " + value; } function testFallbackWithString() { var value = addArgsOnlyNull("foo", "bar"); if (value !== "foobar") throw "addArgsOnlyNull(\"foo\", \"bar\") failed with i = " + i + " returned value = " + value; } testFallbackWithString();