Ignore:
Timestamp:
Nov 6, 2009, 3:33:17 PM (16 years ago)
Author:
[email protected]
Message:

Rolled back in r50590 with Windows build hopefully fixed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/wtf/DateMath.cpp

    r50591 r50608  
    5151#include "StringExtras.h"
    5252
     53#include "CallFrame.h"
     54
    5355#include <algorithm>
    5456#include <limits.h>
     
    6264#endif
    6365
    64 #if PLATFORM(DARWIN)
    65 #include <notify.h>
    66 #endif
    67 
    6866#if PLATFORM(WINCE)
    6967extern "C" size_t strftime(char * const s, const size_t maxsize, const char * const format, const struct tm * const t);
     
    8179#define NaN std::numeric_limits<double>::quiet_NaN()
    8280
    83 namespace WTF {
     81using namespace WTF;
     82
     83namespace JSC {
    8484
    8585/* Constants */
     
    294294}
    295295
    296 double getCurrentUTCTime()
    297 {
    298     return floor(getCurrentUTCTimeWithMicroseconds());
    299 }
    300 
    301 // Returns current time in milliseconds since 1 Jan 1970.
    302 double getCurrentUTCTimeWithMicroseconds()
    303 {
    304     return currentTime() * 1000.0;
    305 }
    306 
    307 void getLocalTime(const time_t* localTime, struct tm* localTM)
    308 {
    309 #if COMPILER(MSVC7) || COMPILER(MINGW) || PLATFORM(WINCE)
    310     *localTM = *localtime(localTime);
    311 #elif COMPILER(MSVC)
    312     localtime_s(localTM, localTime);
    313 #else
    314     localtime_r(localTime, localTM);
    315 #endif
    316 }
    317 
    318296// There is a hard limit at 2038 that we currently do not have a workaround
    319297// for (rdar://problem/5052975).
     
    329307    // minus 27 instead, to ensure there is a range of 28 years that all years
    330308    // can map to.
    331     return std::min(msToYear(getCurrentUTCTime()), maximumYearForDST() - 27) ;
     309    return std::min(msToYear(jsCurrentTime()), maximumYearForDST() - 27) ;
    332310}
    333311
     
    400378}
    401379
    402 #if PLATFORM(DARWIN)
    403 static int32_t s_cachedUTCOffset; // In milliseconds. An assumption here is that access to an int32_t variable is atomic on platforms that take this code path.
    404 static bool s_haveCachedUTCOffset;
    405 static int s_notificationToken;
    406 #endif
    407 
    408380/*
    409381 * Get the difference in milliseconds between this time zone and UTC (GMT)
    410382 * NOT including DST.
    411383 */
    412 double getUTCOffset()
    413 {
    414 #if PLATFORM(DARWIN)
    415     if (s_haveCachedUTCOffset) {
    416         int notified;
    417         uint32_t status = notify_check(s_notificationToken, &notified);
    418         if (status == NOTIFY_STATUS_OK && !notified)
    419             return s_cachedUTCOffset;
    420     }
    421 #endif
    422 
    423     int32_t utcOffset = calculateUTCOffset();
    424 
    425 #if PLATFORM(DARWIN)
    426     // Theoretically, it is possible that several threads will be executing this code at once, in which case we will have a race condition,
    427     // and a newer value may be overwritten. In practice, time zones don't change that often.
    428     s_cachedUTCOffset = utcOffset;
    429 #endif
    430 
    431     return utcOffset;
     384double getUTCOffset(ExecState* exec)
     385{
     386    double utcOffset = exec->globalData().cachedUTCOffset;
     387    if (!isnan(utcOffset))
     388        return utcOffset;
     389    exec->globalData().cachedUTCOffset = calculateUTCOffset();
     390    return exec->globalData().cachedUTCOffset;
    432391}
    433392
     
    487446}
    488447
    489 double gregorianDateTimeToMS(const GregorianDateTime& t, double milliSeconds, bool inputIsUTC)
     448double gregorianDateTimeToMS(ExecState* exec, const GregorianDateTime& t, double milliSeconds, bool inputIsUTC)
    490449{
    491450    int day = dateToDayInYear(t.year + 1900, t.month, t.monthDay);
     
    494453
    495454    if (!inputIsUTC) { // convert to UTC
    496         double utcOffset = getUTCOffset();
     455        double utcOffset = getUTCOffset(exec);
    497456        result -= utcOffset;
    498457        result -= getDSTOffset(result, utcOffset);
     
    503462
    504463// input is UTC
    505 void msToGregorianDateTime(double ms, bool outputIsUTC, GregorianDateTime& tm)
     464void msToGregorianDateTime(ExecState* exec, double ms, bool outputIsUTC, GregorianDateTime& tm)
    506465{
    507466    double dstOff = 0.0;
    508467    double utcOff = 0.0;
    509468    if (!outputIsUTC) {
    510         utcOff = getUTCOffset();
     469        utcOff = getUTCOffset(exec);
    511470        dstOff = getDSTOffset(ms, utcOff);
    512471        ms += dstOff + utcOff;
     
    535494
    536495    equivalentYearForDST(2000); // Need to call once to initialize a static used in this function.
    537 #if PLATFORM(DARWIN)
    538     // Register for a notification whenever the time zone changes.
    539     uint32_t status = notify_register_check("com.apple.system.timezone", &s_notificationToken);
    540     if (status == NOTIFY_STATUS_OK) {
    541         s_cachedUTCOffset = calculateUTCOffset();
    542         s_haveCachedUTCOffset = true;
    543     }
    544 #endif
    545496}
    546497
     
    623574}
    624575
    625 double parseDateFromNullTerminatedCharacters(const char* dateString)
     576// Odd case where 'exec' is allowed to be 0, to accomodate a caller in WebCore.
     577double parseDateFromNullTerminatedCharacters(const char* dateString, ExecState* exec)
    626578{
    627579    // This parses a date in the form:
     
    890842            year += 1900;
    891843    }
    892 
     844   
     845    double ms = ymdhmsToSeconds(year, month + 1, day, hour, minute, second) * msPerSecond;
    893846    // fall back to local timezone
    894847    if (!haveTZ) {
    895         GregorianDateTime t;
    896         t.monthDay = day;
    897         t.month = month;
    898         t.year = year - 1900;
    899         t.isDST = -1;
    900         t.second = second;
    901         t.minute = minute;
    902         t.hour = hour;
    903 
    904         // Use our gregorianDateTimeToMS() rather than mktime() as the latter can't handle the full year range.
    905         return gregorianDateTimeToMS(t, 0, false);
    906     }
    907 
    908     return (ymdhmsToSeconds(year, month + 1, day, hour, minute, second) - (offset * 60.0)) * msPerSecond;
     848        if (exec) {
     849            double utcOffset = getUTCOffset(exec);
     850            double dstOffset = getDSTOffset(ms, utcOffset);
     851            offset = static_cast<int>((utcOffset + dstOffset) / msPerMinute);
     852        } else {
     853            double utcOffset = calculateUTCOffset();
     854            double dstOffset = getDSTOffset(ms, utcOffset);
     855            offset = static_cast<int>((utcOffset + dstOffset) / msPerMinute);
     856        }
     857    }
     858
     859    return ms - (offset * msPerMinute);
    909860}
    910861
     
    919870
    920871
    921 } // namespace WTF
     872} // namespace JSC
Note: See TracChangeset for help on using the changeset viewer.