Changeset 50591 in webkit for trunk/JavaScriptCore/wtf/DateMath.cpp
- Timestamp:
- Nov 5, 2009, 10:52:10 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/wtf/DateMath.cpp
r50590 r50591 51 51 #include "StringExtras.h" 52 52 53 #include "CallFrame.h"54 55 53 #include <algorithm> 56 54 #include <limits.h> … … 64 62 #endif 65 63 64 #if PLATFORM(DARWIN) 65 #include <notify.h> 66 #endif 67 66 68 #if PLATFORM(WINCE) 67 69 extern "C" size_t strftime(char * const s, const size_t maxsize, const char * const format, const struct tm * const t); … … 80 82 81 83 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 #else101 localtime_r(localTime, localTM);102 #endif103 }104 105 } // namespace WTF106 107 using namespace WTF;108 109 namespace JSC {110 84 111 85 /* Constants */ … … 320 294 } 321 295 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 322 318 // There is a hard limit at 2038 that we currently do not have a workaround 323 319 // for (rdar://problem/5052975). … … 404 400 } 405 401 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 406 408 /* 407 409 * Get the difference in milliseconds between this time zone and UTC (GMT) 408 410 * NOT including DST. 409 411 */ 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; 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; 417 432 } 418 433 … … 472 487 } 473 488 474 double gregorianDateTimeToMS( ExecState* exec,const GregorianDateTime& t, double milliSeconds, bool inputIsUTC)489 double gregorianDateTimeToMS(const GregorianDateTime& t, double milliSeconds, bool inputIsUTC) 475 490 { 476 491 int day = dateToDayInYear(t.year + 1900, t.month, t.monthDay); … … 479 494 480 495 if (!inputIsUTC) { // convert to UTC 481 double utcOffset = getUTCOffset( exec);496 double utcOffset = getUTCOffset(); 482 497 result -= utcOffset; 483 498 result -= getDSTOffset(result, utcOffset); … … 488 503 489 504 // input is UTC 490 void msToGregorianDateTime( ExecState* exec,double ms, bool outputIsUTC, GregorianDateTime& tm)505 void msToGregorianDateTime(double ms, bool outputIsUTC, GregorianDateTime& tm) 491 506 { 492 507 double dstOff = 0.0; 493 508 double utcOff = 0.0; 494 509 if (!outputIsUTC) { 495 utcOff = getUTCOffset( exec);510 utcOff = getUTCOffset(); 496 511 dstOff = getDSTOffset(ms, utcOff); 497 512 ms += dstOff + utcOff; … … 520 535 521 536 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 522 545 } 523 546 … … 600 623 } 601 624 602 // Odd case where 'exec' is allowed to be 0, to accomodate a caller in WebCore. 603 double parseDateFromNullTerminatedCharacters(const char* dateString, ExecState* exec) 625 double parseDateFromNullTerminatedCharacters(const char* dateString) 604 626 { 605 627 // This parses a date in the form: … … 868 890 year += 1900; 869 891 } 870 871 double ms = ymdhmsToSeconds(year, month + 1, day, hour, minute, second) * msPerSecond; 892 872 893 // fall back to local timezone 873 894 if (!haveTZ) { 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); 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; 886 909 } 887 910 … … 896 919 897 920 898 } // namespace JSC921 } // namespace WTF
Note:
See TracChangeset
for help on using the changeset viewer.