https://bugs.webkit.org/show_bug.cgi?id=16777
authorbarraclough@apple.com <barraclough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 11 Jun 2011 02:03:00 +0000 (02:03 +0000)
committerbarraclough@apple.com <barraclough@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 11 Jun 2011 02:03:00 +0000 (02:03 +0000)
Eliminate JSC::NaN and JSC::Inf

Reviewed by Sam Weinig.

There's no good reason for -K-J-S- JSC to have its own NAN and infinity constants.
The ones in std::numeric_limits are perfectly good.
Remove JSC::Inf, JSC::NaN, switch some cases of (isnan || isinf) to !isfinite.

Source/JavaScriptCore:

* API/JSCallbackObjectFunctions.h:
(JSC::::toNumber):
* API/JSValueRef.cpp:
(JSValueMakeNumber):
(JSValueToNumber):
* JavaScriptCore.exp:
* runtime/CachedTranscendentalFunction.h:
(JSC::CachedTranscendentalFunction::initialize):
* runtime/DateConstructor.cpp:
(JSC::constructDate):
* runtime/DateInstanceCache.h:
(JSC::DateInstanceData::DateInstanceData):
(JSC::DateInstanceCache::reset):
* runtime/JSCell.cpp:
* runtime/JSCell.h:
(JSC::JSCell::JSValue::getPrimitiveNumber):
(JSC::JSCell::JSValue::toNumber):
* runtime/JSGlobalData.cpp:
(JSC::JSGlobalData::JSGlobalData):
(JSC::JSGlobalData::resetDateCache):
* runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::reset):
* runtime/JSGlobalObjectFunctions.cpp:
(JSC::globalFuncParseInt):
(JSC::globalFuncIsFinite):
* runtime/JSNotAnObject.cpp:
(JSC::JSNotAnObject::toNumber):
* runtime/JSValue.cpp:
* runtime/JSValue.h:
* runtime/JSValueInlineMethods.h:
(JSC::jsNaN):
* runtime/MathObject.cpp:
(JSC::mathProtoFuncMax):
(JSC::mathProtoFuncMin):
* runtime/NumberConstructor.cpp:
(JSC::numberConstructorNegInfinity):
(JSC::numberConstructorPosInfinity):
* runtime/NumberPrototype.cpp:
(JSC::numberProtoFuncToExponential):
(JSC::numberProtoFuncToFixed):
(JSC::numberProtoFuncToPrecision):
(JSC::numberProtoFuncToString):
* runtime/UString.cpp:
* wtf/DecimalNumber.h:
(WTF::DecimalNumber::DecimalNumber):
* wtf/dtoa.cpp:
(WTF::dtoa):

Source/WebCore:

* bindings/js/JSDataViewCustom.cpp:
(WebCore::getDataViewMember):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@88587 268f45cc-cd09-0410-ab3c-d52691b4dbfc

25 files changed:
Source/JavaScriptCore/API/JSCallbackObjectFunctions.h
Source/JavaScriptCore/API/JSValueRef.cpp
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/JavaScriptCore.exp
Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
Source/JavaScriptCore/runtime/CachedTranscendentalFunction.h
Source/JavaScriptCore/runtime/DateConstructor.cpp
Source/JavaScriptCore/runtime/DateInstanceCache.h
Source/JavaScriptCore/runtime/JSCell.cpp
Source/JavaScriptCore/runtime/JSCell.h
Source/JavaScriptCore/runtime/JSGlobalData.cpp
Source/JavaScriptCore/runtime/JSGlobalObject.cpp
Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
Source/JavaScriptCore/runtime/JSNotAnObject.cpp
Source/JavaScriptCore/runtime/JSValue.cpp
Source/JavaScriptCore/runtime/JSValue.h
Source/JavaScriptCore/runtime/JSValueInlineMethods.h
Source/JavaScriptCore/runtime/MathObject.cpp
Source/JavaScriptCore/runtime/NumberConstructor.cpp
Source/JavaScriptCore/runtime/NumberPrototype.cpp
Source/JavaScriptCore/runtime/UString.cpp
Source/JavaScriptCore/wtf/DecimalNumber.h
Source/JavaScriptCore/wtf/dtoa.cpp
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDataViewCustom.cpp

index cc8f3a8..49b6452 100644 (file)
@@ -444,7 +444,7 @@ double JSCallbackObject<Base>::toNumber(ExecState* exec) const
     // a binary expression where lhs threw an exception in its conversion to
     // primitive
     if (exec->hadException())
-        return NaN;
+        return std::numeric_limits<double>::quiet_NaN();
     JSContextRef ctx = toRef(exec);
     JSObjectRef thisRef = toRef(this);
     
@@ -463,7 +463,7 @@ double JSCallbackObject<Base>::toNumber(ExecState* exec) const
 
             double dValue;
             if (value)
-                return toJS(exec, value).getNumber(dValue) ? dValue : NaN;
+                return toJS(exec, value).getNumber(dValue) ? dValue : std::numeric_limits<double>::quiet_NaN();
         }
             
     return Base::toNumber(exec);
index e2626be..e70534c 100644 (file)
@@ -217,7 +217,7 @@ JSValueRef JSValueMakeNumber(JSContextRef ctx, double value)
     // generated internally to JavaScriptCore naturally have that representation,
     // but an external NaN might not.
     if (isnan(value))
-        value = NaN;
+        value = std::numeric_limits<double>::quiet_NaN();
 
     return toRef(exec, jsNumber(value));
 }
@@ -276,7 +276,7 @@ double JSValueToNumber(JSContextRef ctx, JSValueRef value, JSValueRef* exception
         if (exception)
             *exception = toRef(exec, exec->exception());
         exec->clearException();
-        number = NaN;
+        number = std::numeric_limits<double>::quiet_NaN();
     }
     return number;
 }
index 521f1ff..eef365c 100644 (file)
@@ -1,3 +1,62 @@
+2011-06-10  Gavin Barraclough  <barraclough@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        https://bugs.webkit.org/show_bug.cgi?id=16777
+        Eliminate JSC::NaN and JSC::Inf
+
+        There's no good reason for -K-J-S- JSC to have its own NAN and infinity constants.
+        The ones in std::numeric_limits are perfectly good.
+        Remove JSC::Inf, JSC::NaN, switch some cases of (isnan || isinf) to !isfinite.
+
+        * API/JSCallbackObjectFunctions.h:
+        (JSC::::toNumber):
+        * API/JSValueRef.cpp:
+        (JSValueMakeNumber):
+        (JSValueToNumber):
+        * JavaScriptCore.exp:
+        * runtime/CachedTranscendentalFunction.h:
+        (JSC::CachedTranscendentalFunction::initialize):
+        * runtime/DateConstructor.cpp:
+        (JSC::constructDate):
+        * runtime/DateInstanceCache.h:
+        (JSC::DateInstanceData::DateInstanceData):
+        (JSC::DateInstanceCache::reset):
+        * runtime/JSCell.cpp:
+        * runtime/JSCell.h:
+        (JSC::JSCell::JSValue::getPrimitiveNumber):
+        (JSC::JSCell::JSValue::toNumber):
+        * runtime/JSGlobalData.cpp:
+        (JSC::JSGlobalData::JSGlobalData):
+        (JSC::JSGlobalData::resetDateCache):
+        * runtime/JSGlobalObject.cpp:
+        (JSC::JSGlobalObject::reset):
+        * runtime/JSGlobalObjectFunctions.cpp:
+        (JSC::globalFuncParseInt):
+        (JSC::globalFuncIsFinite):
+        * runtime/JSNotAnObject.cpp:
+        (JSC::JSNotAnObject::toNumber):
+        * runtime/JSValue.cpp:
+        * runtime/JSValue.h:
+        * runtime/JSValueInlineMethods.h:
+        (JSC::jsNaN):
+        * runtime/MathObject.cpp:
+        (JSC::mathProtoFuncMax):
+        (JSC::mathProtoFuncMin):
+        * runtime/NumberConstructor.cpp:
+        (JSC::numberConstructorNegInfinity):
+        (JSC::numberConstructorPosInfinity):
+        * runtime/NumberPrototype.cpp:
+        (JSC::numberProtoFuncToExponential):
+        (JSC::numberProtoFuncToFixed):
+        (JSC::numberProtoFuncToPrecision):
+        (JSC::numberProtoFuncToString):
+        * runtime/UString.cpp:
+        * wtf/DecimalNumber.h:
+        (WTF::DecimalNumber::DecimalNumber):
+        * wtf/dtoa.cpp:
+        (WTF::dtoa):
+
 2011-06-10  Tony Chang  <tony@chromium.org>
 
         Reviewed by Ojan Vafai.
index a8d82de..eb47417 100644 (file)
@@ -148,7 +148,6 @@ __ZN3JSC12StringObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10Identifie
 __ZN3JSC12StringObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE
 __ZN3JSC12StringObject6s_infoE
 __ZN3JSC12StringObjectC2EPNS_9ExecStateEPNS_9StructureERKNS_7UStringE
-__ZN3JSC12nonInlineNaNEv
 __ZN3JSC13SamplingFlags4stopEv
 __ZN3JSC13SamplingFlags5startEv
 __ZN3JSC13SamplingFlags7s_flagsE
@@ -219,7 +218,6 @@ __ZN3JSC24JSObjectWithGlobalObjectC2ERNS_12JSGlobalDataEPNS_14JSGlobalObjectEPNS
 __ZN3JSC24createStackOverflowErrorEPNS_9ExecStateE
 __ZN3JSC25evaluateInGlobalCallFrameERKNS_7UStringERNS_7JSValueEPNS_14JSGlobalObjectE
 __ZN3JSC35createInterruptedExecutionExceptionEPNS_12JSGlobalDataE
-__ZN3JSC3NaNE
 __ZN3JSC41constructFunctionSkippingEvalEnabledCheckEPNS_9ExecStateEPNS_14JSGlobalObjectERKNS_7ArgListERKNS_10IdentifierERKNS_7UStringEi
 __ZN3JSC4Heap11objectCountEv
 __ZN3JSC4Heap16activityCallbackEv
index 88f5cef..22903b6 100644 (file)
@@ -43,7 +43,6 @@ EXPORTS
     ??2JSGlobalObject@JSC@@SAPAXIPAVJSGlobalData@1@@Z
     ??8JSC@@YA_NABVUString@0@0@Z
     ??8WTF@@YA_NABVCString@0@0@Z
-    ?NaN@JSC@@3NB
     ?absoluteTimeToWaitTimeoutInterval@WTF@@YAKN@Z
     ?activityCallback@Heap@JSC@@QAEPAVGCActivityCallback@2@XZ
     ?add@Identifier@JSC@@SA?AV?$PassRefPtr@VStringImpl@WTF@@@WTF@@PAVExecState@2@PBD@Z
@@ -247,7 +246,6 @@ EXPORTS
     ?name@InternalFunction@JSC@@QAEABVUString@2@PAVExecState@2@@Z
     ?name@JSFunction@JSC@@QAEABVUString@2@PAVExecState@2@@Z
     ?newUninitialized@CString@WTF@@SA?AV12@IAAPAD@Z
-    ?nonInlineNaN@JSC@@YANXZ
     ?nullptr@@3Vnullptr_t@std@@A
     ?number@UString@JSC@@SA?AV12@H@Z
     ?number@UString@JSC@@SA?AV12@I@Z
index 67c7af8..f31b4a0 100644 (file)
@@ -30,8 +30,6 @@
 
 namespace JSC {
 
-extern const double NaN;
-
 typedef double (*TranscendentalFunctionPtr)(double);
 
 // CachedTranscendentalFunction provides a generic mechanism to cache results
@@ -76,8 +74,8 @@ private:
         // Lazily allocate the table, populate with NaN->NaN mapping.
         m_cache = static_cast<CacheEntry*>(fastMalloc(s_cacheSize * sizeof(CacheEntry)));
         for (unsigned x = 0; x < s_cacheSize; ++x) {
-            m_cache[x].operand = NaN;
-            m_cache[x].result = NaN;
+            m_cache[x].operand = std::numeric_limits<double>::quiet_NaN();
+            m_cache[x].result = std::numeric_limits<double>::quiet_NaN();
         }
     }
 
index 8fb5aef..bf30ef6 100644 (file)
@@ -126,7 +126,7 @@ JSObject* constructDate(ExecState* exec, JSGlobalObject* globalObject, const Arg
                 || (numArgs >= 5 && isnan(doubleArguments[4]))
                 || (numArgs >= 6 && isnan(doubleArguments[5]))
                 || (numArgs >= 7 && isnan(doubleArguments[6])))
-            value = NaN;
+            value = std::numeric_limits<double>::quiet_NaN();
         else {
             GregorianDateTime t;
             int year = JSC::toInt32(doubleArguments[0]);
index b60c29a..0d89eb8 100644 (file)
@@ -33,8 +33,6 @@
 
 namespace JSC {
 
-    extern const double NaN;
-
     class DateInstanceData : public RefCounted<DateInstanceData> {
     public:
         static PassRefPtr<DateInstanceData> create() { return adoptRef(new DateInstanceData); }
@@ -46,8 +44,8 @@ namespace JSC {
 
     private:
         DateInstanceData()
-            : m_gregorianDateTimeCachedForMS(NaN)
-            , m_gregorianDateTimeUTCCachedForMS(NaN)
+            : m_gregorianDateTimeCachedForMS(std::numeric_limits<double>::quiet_NaN())
+            , m_gregorianDateTimeUTCCachedForMS(std::numeric_limits<double>::quiet_NaN())
         {
         }
     };
@@ -62,7 +60,7 @@ namespace JSC {
         void reset()
         {
             for (size_t i = 0; i < cacheSize; ++i)
-                m_cache[i].key = NaN;
+                m_cache[i].key = std::numeric_limits<double>::quiet_NaN();
         }
         
         DateInstanceData* add(double d)
index 0606cd4..936c737 100644 (file)
 
 namespace JSC {
 
-#if defined NAN && defined INFINITY
-
-extern const double NaN = NAN;
-extern const double Inf = INFINITY;
-
-#else // !(defined NAN && defined INFINITY)
-
-// The trick is to define the NaN and Inf globals with a different type than the declaration.
-// This trick works because the mangled name of the globals does not include the type, although
-// I'm not sure that's guaranteed. There could be alignment issues with this, since arrays of
-// characters don't necessarily need the same alignment doubles do, but for now it seems to work.
-// It would be good to figure out a 100% clean way that still avoids code that runs at init time.
-
-// Note, we have to use union to ensure alignment. Otherwise, NaN_Bytes can start anywhere,
-// while NaN_double has to be 4-byte aligned for 32-bits.
-// With -fstrict-aliasing enabled, unions are the only safe way to do type masquerading.
-
-static const union {
-    struct {
-        unsigned char NaN_Bytes[8];
-        unsigned char Inf_Bytes[8];
-    } bytes;
-    
-    struct {
-        double NaN_Double;
-        double Inf_Double;
-    } doubles;
-    
-} NaNInf = { {
-#if CPU(BIG_ENDIAN)
-    { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 },
-    { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 }
-#elif CPU(MIDDLE_ENDIAN)
-    { 0, 0, 0xf8, 0x7f, 0, 0, 0, 0 },
-    { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 }
-#else
-    { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f },
-    { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f }
-#endif
-} } ;
-
-extern const double NaN = NaNInf.doubles.NaN_Double;
-extern const double Inf = NaNInf.doubles.Inf_Double;
-#endif // !(defined NAN && defined INFINITY)
-
 const ClassInfo JSCell::s_dummyCellInfo = { "DummyCell", 0, 0, 0 };
 
 bool JSCell::getUInt32(uint32_t&) const
index 2241d58..6361236 100644 (file)
@@ -294,7 +294,7 @@ namespace JSC {
             return true;
         }
         ASSERT(isUndefined());
-        number = nonInlineNaN();
+        number = std::numeric_limits<double>::quiet_NaN();
         value = *this;
         return true;
     }
@@ -320,7 +320,7 @@ namespace JSC {
             return asCell()->toNumber(exec);
         if (isTrue())
             return 1.0;
-        return isUndefined() ? nonInlineNaN() : 0; // null and false both convert to 0.
+        return isUndefined() ? std::numeric_limits<double>::quiet_NaN() : 0; // null and false both convert to 0.
     }
 
     inline JSValue JSValue::getJSNumber()
index 6ef7542..74faf15 100644 (file)
@@ -187,7 +187,7 @@ JSGlobalData::JSGlobalData(GlobalDataType globalDataType, ThreadStackType thread
     , interpreter(0)
     , heap(this)
     , dynamicGlobalObject(0)
-    , cachedUTCOffset(NaN)
+    , cachedUTCOffset(std::numeric_limits<double>::quiet_NaN())
     , maxReentryDepth(threadStackType == ThreadStackTypeSmall ? MaxSmallThreadReentryDepth : MaxLargeThreadReentryDepth)
     , m_regExpCache(new RegExpCache(this))
 #if ENABLE(REGEXP_TRACING)
@@ -419,10 +419,10 @@ JSGlobalData::ClientData::~ClientData()
 
 void JSGlobalData::resetDateCache()
 {
-    cachedUTCOffset = NaN;
+    cachedUTCOffset = std::numeric_limits<double>::quiet_NaN();
     dstOffsetCache.reset();
     cachedDateString = UString();
-    cachedDateStringValue = NaN;
+    cachedDateStringValue = std::numeric_limits<double>::quiet_NaN();
     dateInstanceCache.reset();
 }
 
index 4bb20aa..742040f 100644 (file)
@@ -287,7 +287,7 @@ void JSGlobalObject::reset(JSValue prototype)
     GlobalPropertyInfo staticGlobals[] = {
         GlobalPropertyInfo(Identifier(exec, "Math"), new (exec) MathObject(exec, this, MathObject::createStructure(exec->globalData(), m_objectPrototype.get())), DontEnum | DontDelete),
         GlobalPropertyInfo(Identifier(exec, "NaN"), jsNaN(), DontEnum | DontDelete | ReadOnly),
-        GlobalPropertyInfo(Identifier(exec, "Infinity"), jsNumber(Inf), DontEnum | DontDelete | ReadOnly),
+        GlobalPropertyInfo(Identifier(exec, "Infinity"), jsNumber(std::numeric_limits<double>::infinity()), DontEnum | DontDelete | ReadOnly),
         GlobalPropertyInfo(Identifier(exec, "undefined"), jsUndefined(), DontEnum | DontDelete | ReadOnly),
         GlobalPropertyInfo(Identifier(exec, "JSON"), new (exec) JSONObject(this, JSONObject::createStructure(exec->globalData(), m_objectPrototype.get())), DontEnum | DontDelete)
     };
index 56ebe0e..2a00d1c 100644 (file)
@@ -49,6 +49,9 @@ using namespace Unicode;
 
 namespace JSC {
 
+#define NaN std::numeric_limits<double>::quiet_NaN()
+#define Inf std::numeric_limits<double>::infinity()
+
 static JSValue encode(ExecState* exec, const char* doNotEscape)
 {
     UString str = exec->argument(0).toString(exec);
@@ -472,9 +475,7 @@ EncodedJSValue JSC_HOST_CALL globalFuncParseInt(ExecState* exec)
         double d = value.asDouble();
         if (isfinite(d))
             return JSValue::encode(jsNumber((d > 0) ? floor(d) : ceil(d)));
-        if (isnan(d) || isinf(d))
-            return JSValue::encode(jsNaN());
-        return JSValue::encode(jsNumber(0));
+        return JSValue::encode(jsNaN());
     }
 
     return JSValue::encode(jsNumber(parseInt(value.toString(exec), radix)));
@@ -493,7 +494,7 @@ EncodedJSValue JSC_HOST_CALL globalFuncIsNaN(ExecState* exec)
 EncodedJSValue JSC_HOST_CALL globalFuncIsFinite(ExecState* exec)
 {
     double n = exec->argument(0).toNumber(exec);
-    return JSValue::encode(jsBoolean(!isnan(n) && !isinf(n)));
+    return JSValue::encode(jsBoolean(isfinite(n)));
 }
 
 EncodedJSValue JSC_HOST_CALL globalFuncDecodeURI(ExecState* exec)
index 1115dc0..5f948f4 100644 (file)
@@ -58,7 +58,7 @@ bool JSNotAnObject::toBoolean(ExecState* exec) const
 double JSNotAnObject::toNumber(ExecState* exec) const
 {
     ASSERT_UNUSED(exec, exec->hadException());
-    return NaN;
+    return std::numeric_limits<double>::quiet_NaN();
 }
 
 UString JSNotAnObject::toString(ExecState* exec) const
index d3ee89e..e03cb5d 100644 (file)
@@ -180,15 +180,6 @@ int32_t toInt32(double number)
     return bits < 0 ? -result : result;
 }
 
-NEVER_INLINE double nonInlineNaN()
-{
-#if OS(SYMBIAN)
-    return nanval();
-#else
-    return std::numeric_limits<double>::quiet_NaN();
-#endif
-}
-
 bool JSValue::isValidCallee()
 {
     return asObject(asObject(asCell())->getAnonymousValue(0))->isGlobalObject();
index de50011..e544d5e 100644 (file)
@@ -34,9 +34,6 @@
 
 namespace JSC {
 
-    extern const double NaN;
-    extern const double Inf;
-
     class ExecState;
     class Identifier;
     class JSCell;
@@ -83,8 +80,6 @@ namespace JSC {
 #endif
     };
 
-    double nonInlineNaN();
-
     // This implements ToInt32, defined in ECMA-262 9.5.
     int32_t toInt32(double);
 
index b4f6f80..a761c4e 100644 (file)
@@ -67,7 +67,7 @@ namespace JSC {
 
     inline JSValue jsNaN()
     {
-        return JSValue(nonInlineNaN());
+        return JSValue(std::numeric_limits<double>::quiet_NaN());
     }
 
     inline bool JSValue::getNumber(double& result) const
index 9c85a69..e4c4b5b 100644 (file)
@@ -166,11 +166,11 @@ EncodedJSValue JSC_HOST_CALL mathProtoFuncLog(ExecState* exec)
 EncodedJSValue JSC_HOST_CALL mathProtoFuncMax(ExecState* exec)
 {
     unsigned argsCount = exec->argumentCount();
-    double result = -Inf;
+    double result = -std::numeric_limits<double>::infinity();
     for (unsigned k = 0; k < argsCount; ++k) {
         double val = exec->argument(k).toNumber(exec);
         if (isnan(val)) {
-            result = NaN;
+            result = std::numeric_limits<double>::quiet_NaN();
             break;
         }
         if (val > result || (val == 0 && result == 0 && !signbit(val)))
@@ -182,11 +182,11 @@ EncodedJSValue JSC_HOST_CALL mathProtoFuncMax(ExecState* exec)
 EncodedJSValue JSC_HOST_CALL mathProtoFuncMin(ExecState* exec)
 {
     unsigned argsCount = exec->argumentCount();
-    double result = +Inf;
+    double result = +std::numeric_limits<double>::infinity();
     for (unsigned k = 0; k < argsCount; ++k) {
         double val = exec->argument(k).toNumber(exec);
         if (isnan(val)) {
-            result = NaN;
+            result = std::numeric_limits<double>::quiet_NaN();
             break;
         }
         if (val < result || (val == 0 && result == 0 && signbit(val)))
index 6e46969..e1d3daa 100644 (file)
@@ -83,12 +83,12 @@ static JSValue numberConstructorNaNValue(ExecState*, JSValue, const Identifier&)
 
 static JSValue numberConstructorNegInfinity(ExecState*, JSValue, const Identifier&)
 {
-    return jsNumber(-Inf);
+    return jsNumber(-std::numeric_limits<double>::infinity());
 }
 
 static JSValue numberConstructorPosInfinity(ExecState*, JSValue, const Identifier&)
 {
-    return jsNumber(Inf);
+    return jsNumber(std::numeric_limits<double>::infinity());
 }
 
 static JSValue numberConstructorMaxValue(ExecState*, JSValue, const Identifier&)
index cbf29da..f599323 100644 (file)
@@ -129,7 +129,7 @@ EncodedJSValue JSC_HOST_CALL numberProtoFuncToExponential(ExecState* exec)
         return throwVMError(exec, createRangeError(exec, "toExponential() argument must be between 0 and 20"));
 
     // Handle NaN and Infinity.
-    if (isnan(x) || isinf(x))
+    if (!isfinite(x))
         return JSValue::encode(jsString(exec, UString::number(x)));
 
     // Round if the argument is not undefined, always format as exponential.
@@ -168,7 +168,7 @@ EncodedJSValue JSC_HOST_CALL numberProtoFuncToFixed(ExecState* exec)
 
     // The check above will return false for NaN or Infinity, these will be
     // handled by numberToString.
-    ASSERT(!isnan(x) && !isinf(x));
+    ASSERT(isfinite(x));
 
     // Convert to decimal with rounding, and format as decimal.
     NumberToStringBuffer buffer;
@@ -203,7 +203,7 @@ EncodedJSValue JSC_HOST_CALL numberProtoFuncToPrecision(ExecState* exec)
         return JSValue::encode(jsString(exec, UString::number(x)));
 
     // Handle NaN and Infinity.
-    if (isnan(x) || isinf(x))
+    if (!isfinite(x))
         return JSValue::encode(jsString(exec, UString::number(x)));
 
     // Convert to decimal with rounding.
@@ -260,7 +260,7 @@ EncodedJSValue JSC_HOST_CALL numberProtoFuncToString(ExecState* exec)
     char s[2048 + 3];
     const char* lastCharInString = s + sizeof(s) - 1;
     double x = v.uncheckedGetNumber();
-    if (isnan(x) || isinf(x))
+    if (!isfinite(x))
         return JSValue::encode(jsString(exec, UString::number(x)));
 
     bool isNegative = x < 0.0;
index b70d505..c14f319 100644 (file)
@@ -51,9 +51,6 @@ using namespace std;
 
 namespace JSC {
 
-extern const double NaN;
-extern const double Inf;
-
 COMPILE_ASSERT(sizeof(UString) == sizeof(void*), UString_should_stay_small);
 
 // Construct a string with UTF-16 data.
index c42f00b..ac7b800 100644 (file)
@@ -40,7 +40,7 @@ class DecimalNumber {
 public:
     DecimalNumber(double d)
     {
-        ASSERT(!isnan(d) && !isinf(d));
+        ASSERT(isfinite(d));
         dtoa(m_significand, d, m_sign, m_exponent, m_precision);
 
         ASSERT(m_precision);
@@ -54,7 +54,7 @@ public:
 
     DecimalNumber(double d, RoundingSignificantFiguresType, unsigned significantFigures)
     {
-        ASSERT(!isnan(d) && !isinf(d));
+        ASSERT(isfinite(d));
         dtoaRoundSF(m_significand, d, significantFigures, m_sign, m_exponent, m_precision);
 
         ASSERT(significantFigures && significantFigures <= sizeof(DtoaBuffer));
@@ -68,7 +68,7 @@ public:
 
     DecimalNumber(double d, RoundingDecimalPlacesType, unsigned decimalPlaces)
     {
-        ASSERT(!isnan(d) && !isinf(d));
+        ASSERT(isfinite(d));
         dtoaRoundDP(m_significand, d, decimalPlaces, m_sign, m_exponent, m_precision);
 
         unsigned significantFigures = 1 + m_exponent + decimalPlaces;
index b162543..5725fba 100644 (file)
@@ -1317,7 +1317,7 @@ void dtoa(DtoaBuffer result, double dd, int ndigits, bool& signOut, int& exponen
     // roundingNone only allowed (only sensible?) with leftright set.
     ASSERT(!roundingNone || leftright);
 
-    ASSERT(!isnan(dd) && !isinf(dd));
+    ASSERT(isfinite(dd));
 
     int bbits, b2, b5, be, dig, i, ieps, ilim = 0, ilim0, ilim1 = 0,
         j, j1, k, k0, k_check, m2, m5, s2, s5,
@@ -1811,7 +1811,7 @@ static ALWAYS_INLINE void copyAsciiToUTF16(UChar* next, const char* src, unsigne
 unsigned numberToString(double d, NumberToStringBuffer buffer)
 {
     // Handle NaN and Infinity.
-    if (isnan(d) || isinf(d)) {
+    if (!isfinite(d)) {
         if (isnan(d)) {
             copyAsciiToUTF16(buffer, "NaN", 3);
             return 3;
index 8b36a53..1706600 100644 (file)
@@ -1,3 +1,17 @@
+2011-06-10  Gavin Barraclough  <barraclough@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        https://bugs.webkit.org/show_bug.cgi?id=16777
+        Eliminate JSC::NaN and JSC::Inf
+
+        There's no good reason for -K-J-S- JSC to have its own NAN and infinity constants.
+        The ones in std::numeric_limits are perfectly good.
+        Remove JSC::Inf, JSC::NaN, switch some cases of (isnan || isinf) to !isfinite.
+
+        * bindings/js/JSDataViewCustom.cpp:
+        (WebCore::getDataViewMember):
+
 2011-06-10  James Simonsen  <simonjam@chromium.org>
 
         Reviewed by Eric Seidel.
index 48d56d8..1249d00 100644 (file)
@@ -89,7 +89,7 @@ static JSValue getDataViewMember(ExecState* exec, DataView* imp, DataViewAccessT
     case AccessDataViewMemberAsFloat32:
     case AccessDataViewMemberAsFloat64: {
         double value = (type == AccessDataViewMemberAsFloat32) ? imp->getFloat32(byteOffset, littleEndian, ec) : imp->getFloat64(byteOffset, littleEndian, ec);
-        result = isnan(value) ? JSValue(nonInlineNaN()) : jsNumber(value);
+        result = isnan(value) ? jsNaN() : jsNumber(value);
         break;
     } default:
         ASSERT_NOT_REACHED();