blob: 87df1ceb301604c3339797ccd58a7ef70ff180c8 [file] [log] [blame]
function isNaNOnInteger(value)
{
return isNaN(value);
}
noInline(isNaNOnInteger);
// *** Test simple cases on integers. ***
function testIsNaNOnIntegers()
{
// Bounds.
var value = isNaNOnInteger(0);
if (value)
throw "isNaNOnInteger(0) = " + value;
var value = isNaNOnInteger(-2147483648);
if (value)
throw "isNaNOnInteger(-2147483648) = " + value;
var value = isNaNOnInteger(2147483647);
if (value)
throw "isNaNOnInteger(2147483647) = " + value;
// Simple values.
var value = isNaNOnInteger(-1);
if (value)
throw "isNaNOnInteger(-1) = " + value;
var value = isNaNOnInteger(42);
if (value)
throw "isNaNOnInteger(42) = " + value;
var value = isNaNOnInteger(-42);
if (value)
throw "isNaNOnInteger(-42) = " + value;
}
noInline(testIsNaNOnIntegers);
for (var i = 0; i < 1e4; ++i) {
testIsNaNOnIntegers();
}
// Make sure we don't do anything stupid when the type is unexpected.
function verifyIsNaNOnIntegerWithOtherTypes()
{
var value = isNaNOnInteger(Math.PI);
if (value)
throw "isNaNOnInteger(Math.PI) = " + value;
var value = isNaNOnInteger("42");
if (value)
throw "isNaNOnInteger(\"42\") = " + value;
var value = isNaNOnInteger("WebKit");
if (!value)
throw "isNaNOnInteger(\"WebKit\") = " + value;
var value = isNaNOnInteger(-0);
if (value)
throw "isNaNOnInteger(-0) = " + value;
}
noInline(verifyIsNaNOnIntegerWithOtherTypes);
for (var i = 0; i < 1e4; ++i) {
verifyIsNaNOnIntegerWithOtherTypes();
}
// *** Test simple cases on doubles. ***
function isNaNOnDouble(value)
{
return isNaN(value);
}
noInline(isNaNOnDouble);
// Test simple cases on doubles.
function testIsNaNOnDoubles()
{
var value = isNaNOnDouble(Math.PI);
if (value)
throw "isNaNOnDouble(Math.PI) = " + value;
var value = isNaNOnDouble(Math.E);
if (value)
throw "isNaNOnDouble(Math.E) = " + value;
var value = isNaNOnDouble(Math.LN2);
if (value)
throw "isNaNOnDouble(Math.LN2) = " + value;
var value = isNaNOnDouble(-0);
if (value)
throw "isNaNOnDouble(-0) = " + value;
var value = isNaNOnDouble(NaN);
if (!value)
throw "isNaNOnDouble(NaN) = " + value;
var value = isNaNOnDouble(Number.POSITIVE_INFINITY);
if (value)
throw "isNaNOnDouble(Number.POSITIVE_INFINITY) = " + value;
var value = isNaNOnDouble(Number.NEGATIVE_INFINITY);
if (value)
throw "isNaNOnDouble(Number.NEGATIVE_INFINITY) = " + value;
}
noInline(testIsNaNOnDoubles);
for (var i = 0; i < 1e6; ++i) {
testIsNaNOnDoubles();
}
// Make sure we don't do anything stupid when the type is unexpected.
function verifyIsNaNOnDoublesWithOtherTypes()
{
var value = isNaNOnDouble(1);
if (value)
throw "isNaNOnDouble(1) = " + value;
var value = isNaNOnDouble("42");
if (value)
throw "isNaNOnDouble(\"42\") = " + value;
var value = isNaNOnDouble("WebKit");
if (!value)
throw "isNaNOnDouble(\"WebKit\") = " + value;
var value = isNaNOnDouble({});
if (!value)
throw "isNaNOnDouble({}) = " + value;
}
noInline(verifyIsNaNOnDoublesWithOtherTypes);
for (var i = 0; i < 1e4; ++i) {
verifyIsNaNOnDoublesWithOtherTypes();
}
// Make sure we still return NaN for type coerced values for global isNaN.
function verifyIsNaNOnCoercedTypes()
{
var value = isNaNOnInteger("NaN");
if (!value)
throw "isNaNOnInteger(\"NaN\") = " + value;
var value = isNaNOnInteger({ valueOf() { return NaN; } });
if (!value)
throw "isNaNOnInteger({ valueOf() { return NaN; } }) = " + value;
}
noInline(verifyIsNaNOnCoercedTypes);
for (var i = 0; i < 1e4; ++i) {
verifyIsNaNOnCoercedTypes();
}
// *** Unusual arguments. ***
function isNaNNoArguments()
{
return isNaN();
}
noInline(isNaNNoArguments);
function isNaNTooManyArguments(a, b, c)
{
return isNaN(a, b, c);
}
noInline(isNaNTooManyArguments);
for (var i = 0; i < 1e4; ++i) {
var value = isNaNNoArguments();
if (!value)
throw "isNaNNoArguments() = " + value;
value = isNaNTooManyArguments(2, 3, 5);
if (value)
throw "isNaNTooManyArguments() = " + value;
}
// *** Constant as arguments. ***
function testIsNaNOnConstants()
{
var value = isNaN(0);
if (value)
throw "isNaN(0) = " + value;
var value = isNaN(-0);
if (value)
throw "isNaN(-0) = " + value;
var value = isNaN(1);
if (value)
throw "isNaN(1) = " + value;
var value = isNaN(-1);
if (value)
throw "isNaN(-1) = " + value;
var value = isNaN(42);
if (value)
throw "isNaN(42) = " + value;
var value = isNaN(-42);
if (value)
throw "isNaN(-42) = " + value;
var value = isNaN(Number.POSITIVE_INFINITY);
if (value)
throw "isNaN(Number.POSITIVE_INFINITY) = " + value;
var value = isNaN(Number.NEGATIVE_INFINITY);
if (value)
throw "isNaN(Number.NEGATIVE_INFINITY) = " + value;
var value = isNaN(Math.E);
if (value)
throw "isNaN(Math.E) = " + value;
var value = isNaN(NaN);
if (!value)
throw "isNaN(NaN) = " + value;
}
noInline(testIsNaNOnConstants);
for (var i = 0; i < 1e4; ++i) {
testIsNaNOnConstants();
}
// *** Type Coercion Side effects. ***
function isNaNTypeCoercionSideEffects(value)
{
return isNaN(value);
}
noInline(isNaNTypeCoercionSideEffects);
for (var i = 0; i < 1e4; ++i) {
var value = isNaNTypeCoercionSideEffects(42);
if (value)
throw "isNaNTypeCoercionSideEffects(42) = " + value;
}
var globalCounter = 0;
for (var i = 0; i < 1e4; ++i) {
var value = isNaNTypeCoercionSideEffects({ valueOf() { return globalCounter++; } });
if (value)
throw "isNaNTypeCoercionSideEffects({ valueOf() { return globalCounter++; } }) = " + value;
}
if (globalCounter !== 1e4)
throw "globalCounter =" + globalCounter;
// *** Struct transition. ***
function isNaNStructTransition(value)
{
return isNaN(value);
}
noInline(isNaNStructTransition);
for (var i = 0; i < 1e4; ++i) {
var value = isNaNStructTransition(42);
if (value)
throw "isNaNStructTransition(42) = " + value;
}
isNaN = function() { return 123; }
var value = isNaNStructTransition(42);
if (value !== 123)
throw "isNaNStructTransition(42) after transition = " + value;