Changeset 50590 in webkit for trunk/JavaScriptCore/wtf/DateMath.cpp
- Timestamp:
- Nov 5, 2009, 10:26:47 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/wtf/DateMath.cpp
r50183 r50590 51 51 #include "StringExtras.h" 52 52 53 #include "CallFrame.h" 54 53 55 #include <algorithm> 54 56 #include <limits.h> … … 62 64 #endif 63 65 64 #if PLATFORM(DARWIN)65 #include <notify.h>66 #endif67 68 66 #if PLATFORM(WINCE) 69 67 extern "C" size_t strftime(char * const s, const size_t maxsize, const char * const format, const struct tm * const t); … … 82 80 83 81 namespace WTF { 82 83 double getCurrentUTCTime() 84 { 85 return floor(getCurrentUTCTimeWithMicroseconds()); 86 } 87 88 // Returns current time in milliseconds since 1 Jan 1970. 89 double getCurrentUTCTimeWithMicroseconds() 90 { 91 return currentTime() * 1000.0; 92 } 93 94 void getLocalTime(const time_t* localTime, struct tm* localTM) 95 { 96 #if COMPILER(MSVC7) || COMPILER(MINGW) || PLATFORM(WINCE) 97 *localTM = *localtime(localTime); 98 #elif COMPILER(MSVC) 99 localtime_s(localTM, localTime); 100 #else 101 localtime_r(localTime, localTM); 102 #endif 103 } 104 105 } // namespace WTF 106 107 using namespace WTF; 108 109 namespace JSC { 84 110 85 111 /* Constants */ … … 294 320 } 295 321 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 #else314 localtime_r(localTime, localTM);315 #endif316 }317 318 322 // There is a hard limit at 2038 that we currently do not have a workaround 319 323 // for (rdar://problem/5052975). … … 400 404 } 401 405 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 #endif407 408 406 /* 409 407 * Get the difference in milliseconds between this time zone and UTC (GMT) 410 408 * NOT including DST. 411 409 */ 412 double getUTCOffset() 413 { 414 #if PLATFORM(DARWIN) 415 if (s_haveCachedUTCOffset) { 416 int notified; 417 uint32_t status = notify_check(s_notificationToken, ¬ified); 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; 410 double getUTCOffset(ExecState* exec) 411 { 412 double utcOffset = exec->globalData().cachedUTCOffset; 413 if (!isnan(utcOffset)) 414 return utcOffset; 415 exec->globalData().cachedUTCOffset = calculateUTCOffset(); 416 return exec->globalData().cachedUTCOffset; 432 417 } 433 418 … … 487 472 } 488 473 489 double gregorianDateTimeToMS( const GregorianDateTime& t, double milliSeconds, bool inputIsUTC)474 double gregorianDateTimeToMS(ExecState* exec, const GregorianDateTime& t, double milliSeconds, bool inputIsUTC) 490 475 { 491 476 int day = dateToDayInYear(t.year + 1900, t.month, t.monthDay); … … 494 479 495 480 if (!inputIsUTC) { // convert to UTC 496 double utcOffset = getUTCOffset( );481 double utcOffset = getUTCOffset(exec); 497 482 result -= utcOffset; 498 483 result -= getDSTOffset(result, utcOffset); … … 503 488 504 489 // input is UTC 505 void msToGregorianDateTime( double ms, bool outputIsUTC, GregorianDateTime& tm)490 void msToGregorianDateTime(ExecState* exec, double ms, bool outputIsUTC, GregorianDateTime& tm) 506 491 { 507 492 double dstOff = 0.0; 508 493 double utcOff = 0.0; 509 494 if (!outputIsUTC) { 510 utcOff = getUTCOffset( );495 utcOff = getUTCOffset(exec); 511 496 dstOff = getDSTOffset(ms, utcOff); 512 497 ms += dstOff + utcOff; … … 535 520 536 521 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 #endif545 522 } 546 523 … … 623 600 } 624 601 625 double parseDateFromNullTerminatedCharacters(const char* dateString) 602 // Odd case where 'exec' is allowed to be 0, to accomodate a caller in WebCore. 603 double parseDateFromNullTerminatedCharacters(const char* dateString, ExecState* exec) 626 604 { 627 605 // This parses a date in the form: … … 890 868 year += 1900; 891 869 } 892 870 871 double ms = ymdhmsToSeconds(year, month + 1, day, hour, minute, second) * msPerSecond; 893 872 // fall back to local timezone 894 873 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; 874 if (exec) { 875 double utcOffset = getUTCOffset(exec); 876 double dstOffset = getDSTOffset(ms, utcOffset); 877 offset = static_cast<int>((utcOffset + dstOffset) / msPerMinute); 878 } else { 879 double utcOffset = calculateUTCOffset(); 880 double dstOffset = getDSTOffset(ms, utcOffset); 881 offset = static_cast<int>((utcOffset + dstOffset) / msPerMinute); 882 } 883 } 884 885 return ms - (offset * msPerMinute); 909 886 } 910 887 … … 919 896 920 897 921 } // namespace WTF898 } // namespace JSC
Note:
See TracChangeset
for help on using the changeset viewer.