function mathCeilOnIntegers(value) { return Math.ceil(value); } noInline(mathCeilOnIntegers); function mathCeilOnDoubles(value) { return Math.ceil(value); } noInline(mathCeilOnDoubles); function mathCeilOnBooleans(value) { return Math.ceil(value); } noInline(mathCeilOnBooleans); // The trivial cases first. for (var i = 1; i < 1e4; ++i) { var ceiledValue = mathCeilOnIntegers(i); if (ceiledValue !== i) throw new Error("mathCeilOnIntegers(" + i + ") = " + ceiledValue); var ceiledValue = mathCeilOnIntegers(-i); if (ceiledValue !== -i) throw new Error("mathCeilOnIntegers(" + -i + ") = " + ceiledValue); var doubleLow = i + 0.4; var ceiledValue = mathCeilOnDoubles(doubleLow); if (ceiledValue !== i + 1.0) throw new Error("mathCeilOnDoubles(" + doubleLow + ") = " + ceiledValue); var doubleHigh = i + 0.6; var ceiledValue = mathCeilOnDoubles(doubleHigh); if (ceiledValue !== i + 1) throw new Error("mathCeilOnDoubles(" + doubleHigh + ") = " + ceiledValue); var doubleMid = i + 0.5; var ceiledValue = mathCeilOnDoubles(doubleMid); if (ceiledValue !== i + 1) throw new Error("mathCeilOnDoubles(" + doubleMid + ") = " + ceiledValue); var ceiledValue = mathCeilOnDoubles(-0.6); if (ceiledValue !== -0.0) throw new Error("mathCeilOnDoubles(-0.6) = " + ceiledValue); } // Some more interesting cases, some of them well OSR exit when the return value is zero. for (var i = 0; i < 1e4; ++i) { var ceiledValue = mathCeilOnIntegers(i); if (ceiledValue !== i) throw new Error("mathCeilOnIntegers(" + i + ") = " + ceiledValue); var ceiledValue = mathCeilOnIntegers(-i); if (ceiledValue !== -i) throw new Error("mathCeilOnIntegers(-" + i + ") = " + ceiledValue); var ceiledValue = mathCeilOnDoubles(-0.4); if (ceiledValue !== 0) throw new Error("mathCeilOnDoubles(-0.4) = " + ceiledValue); var ceiledValue = mathCeilOnDoubles(-0.5); if (ceiledValue !== 0) throw new Error("mathCeilOnDoubles(-0.5) = " + ceiledValue); var ceiledValue = mathCeilOnDoubles(-0); if (!(ceiledValue === 0 && (1/ceiledValue) === -Infinity)) throw new Error("mathCeilOnDoubles(-0) = " + ceiledValue); var ceiledValue = mathCeilOnDoubles(NaN); if (ceiledValue === ceiledValue) throw new Error("mathCeilOnDoubles(NaN) = " + ceiledValue); var ceiledValue = mathCeilOnDoubles(Number.POSITIVE_INFINITY); if (ceiledValue !== Number.POSITIVE_INFINITY) throw new Error("mathCeilOnDoubles(Number.POSITIVE_INFINITY) = " + ceiledValue); var ceiledValue = mathCeilOnDoubles(Number.NEGATIVE_INFINITY); if (ceiledValue !== Number.NEGATIVE_INFINITY) throw new Error("mathCeilOnDoubles(Number.NEGATIVE_INFINITY) = " + ceiledValue); var boolean = !!(i % 2); var ceiledBoolean = mathCeilOnBooleans(boolean); if (ceiledBoolean != boolean) throw new Error("mathCeilOnDoubles(" + boolean + ") = " + ceiledBoolean); } function uselessMathCeil(value) { return Math.ceil(value|0); } noInline(uselessMathCeil); for (var i = 0; i < 1e4; ++i) { var ceiledValue = uselessMathCeil(i); if (ceiledValue !== i) throw new Error("uselessMathCeil(" + i + ") = " + ceiledValue); var doubleLow = i + 0.4; var ceiledValue = uselessMathCeil(doubleLow); if (ceiledValue !== i) throw new Error("uselessMathCeil(" + doubleLow + ") = " + ceiledValue); var doubleHigh = i + 0.6; var ceiledValue = uselessMathCeil(doubleHigh); if (ceiledValue !== i) throw new Error("uselessMathCeil(" + doubleHigh + ") = " + ceiledValue); var doubleMid = i + 0.5; var ceiledValue = uselessMathCeil(doubleMid); if (ceiledValue !== i) throw new Error("uselessMathCeil(" + doubleMid + ") = " + ceiledValue); var ceiledValue = uselessMathCeil(-0.4); if (ceiledValue !== 0) throw new Error("uselessMathCeil(-0.4) = " + ceiledValue); var ceiledValue = uselessMathCeil(-0.5); if (ceiledValue !== 0) throw new Error("uselessMathCeil(-0.5) = " + ceiledValue); var ceiledValue = uselessMathCeil(-0.6); if (ceiledValue !== 0) throw new Error("uselessMathCeil(-0.6) = " + ceiledValue); } function mathCeilWithOverflow(value) { return Math.ceil(value); } noInline(mathCeilWithOverflow); for (var i = 0; i < 1e4; ++i) { var bigValue = 1000000000000; var ceiledValue = mathCeilWithOverflow(bigValue); if (ceiledValue !== bigValue) throw new Error("mathCeilWithOverflow(" + bigValue + ") = " + ceiledValue); } function mathCeilConsumedAsDouble(value) { return Math.ceil(value) * 0.5; } noInline(mathCeilConsumedAsDouble); for (var i = 0; i < 1e4; ++i) { var doubleValue = i + 0.1; var ceiledValue = mathCeilConsumedAsDouble(doubleValue); if (ceiledValue !== ((i + 1) * 0.5)) throw new Error("mathCeilConsumedAsDouble(" + doubleValue + ") = " + ceiledValue); var doubleValue = i + 0.6; var ceiledValue = mathCeilConsumedAsDouble(doubleValue); if (ceiledValue !== ((i + 1) * 0.5)) throw new Error("mathCeilConsumedAsDouble(" + doubleValue + ") = " + ceiledValue); } function mathCeilDoesNotCareAboutMinusZero(value) { return Math.ceil(value)|0; } noInline(mathCeilDoesNotCareAboutMinusZero); for (var i = 0; i < 1e4; ++i) { var doubleMid = i + 0.5; var ceiledValue = mathCeilDoesNotCareAboutMinusZero(doubleMid); if (ceiledValue !== i + 1) throw new Error("mathCeilDoesNotCareAboutMinusZero(" + doubleMid + ") = " + ceiledValue); } // *** Function arguments. *** function mathCeilNoArguments() { return Math.ceil(); } noInline(mathCeilNoArguments); function mathCeilTooManyArguments(a, b, c) { return Math.ceil(a, b, c); } noInline(mathCeilTooManyArguments); for (var i = 0; i < 1e4; ++i) { var value = mathCeilNoArguments(); if (value === value) throw new Error("mathCeilNoArguments() = " + value); var value = mathCeilTooManyArguments(2.1, 3, 5); if (value !== 3) throw new Error("mathCeilTooManyArguments() = " + value); } // *** Constant as arguments. *** function testMathCeilOnConstants() { var value = Math.ceil(0); if (value !== 0) throw new Error("Math.ceil(0) = " + value); var value = Math.ceil(-0); if (!(value === 0 && (1/value) === -Infinity)) throw new Error("Math.ceil(-0) = " + value); var value = Math.ceil(1); if (value !== 1) throw new Error("Math.ceil(1) = " + value); var value = Math.ceil(-1); if (value !== -1) throw new Error("Math.ceil(-1) = " + value); var value = Math.ceil(42); if (value !== 42) throw new Error("Math.ceil(42) = " + value); var value = Math.ceil(-42.2); if (value !== -42) throw new Error("Math.ceil(-42.2) = " + value); var value = Math.ceil(NaN); if (value === value) throw new Error("Math.ceil(NaN) = " + value); var value = Math.ceil(Number.POSITIVE_INFINITY); if (value !== Infinity) throw new Error("Math.ceil(Number.POSITIVE_INFINITY) = " + value); var value = Math.ceil(Number.NEGATIVE_INFINITY); if (value !== -Infinity) throw new Error("Math.ceil(Number.NEGATIVE_INFINITY) = " + value); var value = Math.ceil(Math.E); if (value !== 3) throw new Error("Math.ceil(Math.E) = " + value); } noInline(testMathCeilOnConstants); for (var i = 0; i < 1e4; ++i) { testMathCeilOnConstants(); } // *** Struct transition. *** function mathCeilStructTransition(value) { return Math.ceil(value); } noInline(mathCeilStructTransition); for (var i = 0; i < 1e4; ++i) { var value = mathCeilStructTransition(42.5); if (value !== 43) throw new Error("mathCeilStructTransition(42.5) = " + value); } Math.ceil = function() { return arguments[0] + 5; } var value = mathCeilStructTransition(42); if (value !== 47) throw new Error("mathCeilStructTransition(42) after transition = " + value);