function mathFloorOnIntegers(value) { return Math.floor(value); } noInline(mathFloorOnIntegers); function mathFloorOnDoubles(value) { return Math.floor(value); } noInline(mathFloorOnDoubles); function mathFloorOnBooleans(value) { return Math.floor(value); } noInline(mathFloorOnBooleans); // The trivial cases first. for (var i = 1; i < 1e4; ++i) { var flooredValue = mathFloorOnIntegers(i); if (flooredValue !== i) throw new Error("mathFloorOnIntegers(" + i + ") = " + flooredValue); var flooredValue = mathFloorOnIntegers(-i); if (flooredValue !== -i) throw new Error("mathFloorOnIntegers(" + -i + ") = " + flooredValue); var doubleLow = i + 0.4; var flooredValue = mathFloorOnDoubles(doubleLow); if (flooredValue !== i) throw new Error("mathFloorOnDoubles(" + doubleLow + ") = " + flooredValue); var doubleHigh = i + 0.6; var flooredValue = mathFloorOnDoubles(doubleHigh); if (flooredValue !== i) throw new Error("mathFloorOnDoubles(" + doubleHigh + ") = " + flooredValue); var doubleMid = i + 0.5; var flooredValue = mathFloorOnDoubles(doubleMid); if (flooredValue !== i) throw new Error("mathFloorOnDoubles(" + doubleMid + ") = " + flooredValue); var flooredValue = mathFloorOnDoubles(-0.6); if (flooredValue !== -1.0) throw new Error("mathFloorOnDoubles(-0.6) = " + flooredValue); } // Some more interesting cases, some of them well OSR exit when the return value is zero. for (var i = 0; i < 1e4; ++i) { var flooredValue = mathFloorOnIntegers(i); if (flooredValue !== i) throw new Error("mathFloorOnIntegers(" + i + ") = " + flooredValue); var flooredValue = mathFloorOnIntegers(-i); if (flooredValue !== -i) throw new Error("mathFloorOnIntegers(-" + i + ") = " + flooredValue); var flooredValue = mathFloorOnDoubles(-0.4); if (flooredValue !== -1.00) throw new Error("mathFloorOnDoubles(-0.4) = " + flooredValue); var flooredValue = mathFloorOnDoubles(-0.5); if (flooredValue !== -1.0) throw new Error("mathFloorOnDoubles(-0.5) = " + flooredValue); var flooredValue = mathFloorOnDoubles(-0); if (!(flooredValue === 0 && (1/flooredValue) === -Infinity)) throw new Error("mathFloorOnDoubles(-0) = " + flooredValue); var flooredValue = mathFloorOnDoubles(NaN); if (flooredValue === flooredValue) throw new Error("mathFloorOnDoubles(NaN) = " + flooredValue); var flooredValue = mathFloorOnDoubles(Number.POSITIVE_INFINITY); if (flooredValue !== Number.POSITIVE_INFINITY) throw new Error("mathFloorOnDoubles(Number.POSITIVE_INFINITY) = " + flooredValue); var flooredValue = mathFloorOnDoubles(Number.NEGATIVE_INFINITY); if (flooredValue !== Number.NEGATIVE_INFINITY) throw new Error("mathFloorOnDoubles(Number.NEGATIVE_INFINITY) = " + flooredValue); var boolean = !!(i % 2); var flooredBoolean = mathFloorOnBooleans(boolean); if (flooredBoolean != boolean) throw new Error("mathFloorOnDoubles(" + boolean + ") = " + flooredBoolean); } function uselessMathFloor(value) { return Math.floor(value|0); } noInline(uselessMathFloor); for (var i = 0; i < 1e4; ++i) { var flooredValue = uselessMathFloor(i); if (flooredValue !== i) throw new Error("uselessMathFloor(" + i + ") = " + flooredValue); var doubleLow = i + 0.4; var flooredValue = uselessMathFloor(doubleLow); if (flooredValue !== i) throw new Error("uselessMathFloor(" + doubleLow + ") = " + flooredValue); var doubleHigh = i + 0.6; var flooredValue = uselessMathFloor(doubleHigh); if (flooredValue !== i) throw new Error("uselessMathFloor(" + doubleHigh + ") = " + flooredValue); var doubleMid = i + 0.5; var flooredValue = uselessMathFloor(doubleMid); if (flooredValue !== i) throw new Error("uselessMathFloor(" + doubleMid + ") = " + flooredValue); var flooredValue = uselessMathFloor(-0.4); if (flooredValue !== 0) throw new Error("uselessMathFloor(-0.4) = " + flooredValue); var flooredValue = uselessMathFloor(-0.5); if (flooredValue !== 0) throw new Error("uselessMathFloor(-0.5) = " + flooredValue); var flooredValue = uselessMathFloor(-0.6); if (flooredValue !== 0) throw new Error("uselessMathFloor(-0.6) = " + flooredValue); } function mathFloorWithOverflow(value) { return Math.floor(value); } noInline(mathFloorWithOverflow); for (var i = 0; i < 1e4; ++i) { var bigValue = 1000000000000; var flooredValue = mathFloorWithOverflow(bigValue); if (flooredValue !== bigValue) throw new Error("mathFloorWithOverflow(" + bigValue + ") = " + flooredValue); } function mathFloorConsumedAsDouble(value) { return Math.floor(value) * 0.5; } noInline(mathFloorConsumedAsDouble); for (var i = 0; i < 1e4; ++i) { var doubleValue = i + 0.1; var flooredValue = mathFloorConsumedAsDouble(doubleValue); if (flooredValue !== (i * 0.5)) throw new Error("mathFloorConsumedAsDouble(" + doubleValue + ") = " + flooredValue); var doubleValue = i + 0.6; var flooredValue = mathFloorConsumedAsDouble(doubleValue); if (flooredValue !== (i * 0.5)) throw new Error("mathFloorConsumedAsDouble(" + doubleValue + ") = " + flooredValue); } function mathFloorDoesNotCareAboutMinusZero(value) { return Math.floor(value)|0; } noInline(mathFloorDoesNotCareAboutMinusZero); for (var i = 0; i < 1e4; ++i) { var doubleMid = i + 0.5; var flooredValue = mathFloorDoesNotCareAboutMinusZero(doubleMid); if (flooredValue !== i) throw new Error("mathFloorDoesNotCareAboutMinusZero(" + doubleMid + ") = " + flooredValue); } // *** Function arguments. *** function mathFloorNoArguments() { return Math.floor(); } noInline(mathFloorNoArguments); function mathFloorTooManyArguments(a, b, c) { return Math.floor(a, b, c); } noInline(mathFloorTooManyArguments); for (var i = 0; i < 1e4; ++i) { var value = mathFloorNoArguments(); if (value === value) throw new Error("mathFloorNoArguments() = " + value); var value = mathFloorTooManyArguments(2.1, 3, 5); if (value !== 2) throw new Error("mathFloorTooManyArguments() = " + value); } // *** Constant as arguments. *** function testMathFloorOnConstants() { var value = Math.floor(0); if (value !== 0) throw new Error("Math.floor(0) = " + value); var value = Math.floor(-0); if (!(value === 0 && (1/value) === -Infinity)) throw new Error("Math.floor(-0) = " + value); var value = Math.floor(1); if (value !== 1) throw new Error("Math.floor(1) = " + value); var value = Math.floor(-1); if (value !== -1) throw new Error("Math.floor(-1) = " + value); var value = Math.floor(42); if (value !== 42) throw new Error("Math.floor(42) = " + value); var value = Math.floor(-42.2); if (value !== -43) throw new Error("Math.floor(-42.2) = " + value); var value = Math.floor(NaN); if (value === value) throw new Error("Math.floor(NaN) = " + value); var value = Math.floor(Number.POSITIVE_INFINITY); if (value !== Infinity) throw new Error("Math.floor(Number.POSITIVE_INFINITY) = " + value); var value = Math.floor(Number.NEGATIVE_INFINITY); if (value !== -Infinity) throw new Error("Math.floor(Number.NEGATIVE_INFINITY) = " + value); var value = Math.floor(Math.E); if (value !== 2) throw new Error("Math.floor(Math.E) = " + value); } noInline(testMathFloorOnConstants); for (var i = 0; i < 1e4; ++i) { testMathFloorOnConstants(); } // *** Struct transition. *** function mathFloorStructTransition(value) { return Math.floor(value); } noInline(mathFloorStructTransition); for (var i = 0; i < 1e4; ++i) { var value = mathFloorStructTransition(42.5); if (value !== 42) throw new Error("mathFloorStructTransition(42.5) = " + value); } Math.floor = function() { return arguments[0] + 5; } var value = mathFloorStructTransition(42); if (value !== 47) throw new Error("mathFloorStructTransition(42) after transition = " + value);