Changeset 50608 in webkit for trunk/JavaScriptCore/wtf/DateMath.cpp
- Timestamp:
- Nov 6, 2009, 3:33:17 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/wtf/DateMath.cpp
r50591 r50608 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); … … 81 79 #define NaN std::numeric_limits<double>::quiet_NaN() 82 80 83 namespace WTF { 81 using namespace WTF; 82 83 namespace JSC { 84 84 85 85 /* Constants */ … … 294 294 } 295 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 #else314 localtime_r(localTime, localTM);315 #endif316 }317 318 296 // There is a hard limit at 2038 that we currently do not have a workaround 319 297 // for (rdar://problem/5052975). … … 329 307 // minus 27 instead, to ensure there is a range of 28 years that all years 330 308 // can map to. 331 return std::min(msToYear( getCurrentUTCTime()), maximumYearForDST() - 27) ;309 return std::min(msToYear(jsCurrentTime()), maximumYearForDST() - 27) ; 332 310 } 333 311 … … 400 378 } 401 379 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 380 /* 409 381 * Get the difference in milliseconds between this time zone and UTC (GMT) 410 382 * NOT including DST. 411 383 */ 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; 384 double 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; 432 391 } 433 392 … … 487 446 } 488 447 489 double gregorianDateTimeToMS( const GregorianDateTime& t, double milliSeconds, bool inputIsUTC)448 double gregorianDateTimeToMS(ExecState* exec, const GregorianDateTime& t, double milliSeconds, bool inputIsUTC) 490 449 { 491 450 int day = dateToDayInYear(t.year + 1900, t.month, t.monthDay); … … 494 453 495 454 if (!inputIsUTC) { // convert to UTC 496 double utcOffset = getUTCOffset( );455 double utcOffset = getUTCOffset(exec); 497 456 result -= utcOffset; 498 457 result -= getDSTOffset(result, utcOffset); … … 503 462 504 463 // input is UTC 505 void msToGregorianDateTime( double ms, bool outputIsUTC, GregorianDateTime& tm)464 void msToGregorianDateTime(ExecState* exec, double ms, bool outputIsUTC, GregorianDateTime& tm) 506 465 { 507 466 double dstOff = 0.0; 508 467 double utcOff = 0.0; 509 468 if (!outputIsUTC) { 510 utcOff = getUTCOffset( );469 utcOff = getUTCOffset(exec); 511 470 dstOff = getDSTOffset(ms, utcOff); 512 471 ms += dstOff + utcOff; … … 535 494 536 495 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 496 } 546 497 … … 623 574 } 624 575 625 double parseDateFromNullTerminatedCharacters(const char* dateString) 576 // Odd case where 'exec' is allowed to be 0, to accomodate a caller in WebCore. 577 double parseDateFromNullTerminatedCharacters(const char* dateString, ExecState* exec) 626 578 { 627 579 // This parses a date in the form: … … 890 842 year += 1900; 891 843 } 892 844 845 double ms = ymdhmsToSeconds(year, month + 1, day, hour, minute, second) * msPerSecond; 893 846 // fall back to local timezone 894 847 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); 909 860 } 910 861 … … 919 870 920 871 921 } // namespace WTF872 } // namespace JSC
Note:
See TracChangeset
for help on using the changeset viewer.