diff options
author | Andrei Popescu <andreip@google.com> | 2010-04-28 13:01:47 +0100 |
---|---|---|
committer | Andrei Popescu <andreip@google.com> | 2010-04-28 13:04:25 +0100 |
commit | 6599b9dd3411791c9d89ab7efbfb4131e5664c48 (patch) | |
tree | 554a046d13057ca27582bc016e6320e0784e2806 | |
parent | 6d3d5a3a3aa04585c0eb67f73374f990f20b69b8 (diff) | |
download | v8-6599b9dd3411791c9d89ab7efbfb4131e5664c48.tar.gz |
Cherry-pick http://codereview.chromium.org/1742012android-sdk-tools_r7android-sdk-tools_r6android-sdk-2.3.4_r1android-sdk-2.2_r2android-sdk-2.2_r1android-cts-2.3_r5android-cts-2.3_r4android-cts-2.3_r3android-cts-2.3_r2android-cts-2.3_r12android-cts-2.3_r11android-cts-2.3_r10android-cts-2.3_r1android-cts-2.2_r8android-cts-2.2_r7android-cts-2.2_r6android-cts-2.2_r5android-cts-2.2_r4android-cts-2.2_r3android-cts-2.2_r2android-cts-2.2_r1android-adt-0.9.9android-adt-0.9.8android-2.3_r1android-2.3.7_r1android-2.3.6_r1android-2.3.6_r0.9android-2.3.5_r1android-2.3.4_r1android-2.3.4_r0.9android-2.3.3_r1aandroid-2.3.3_r1.1android-2.3.3_r1android-2.3.2_r1android-2.3.1_r1android-2.2_r1.3android-2.2_r1.2android-2.2_r1.1android-2.2_r1android-2.2.3_r2.1android-2.2.3_r2android-2.2.3_r1android-2.2.2_r1android-2.2.1_r2android-2.2.1_r1tools_r9tools_r8tools_r7gingerbread-releasegingerbread-mr4-releasegingerbreadfroyo-releasefroyo-plus-aospfroyo
This reverts commit d69d2e30f295acb0d25771f412ca271869d0ba43, which is now included in the above change.
Fix bug: 2629965
Change-Id: I5b07ba8f9a39c4337bc03b0c9aa91eafcd6863be
-rw-r--r-- | src/date.js | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/src/date.js b/src/date.js index b4027c13..6b6ed425 100644 --- a/src/date.js +++ b/src/date.js @@ -118,9 +118,16 @@ function EquivalentTime(t) { } -// Because computing the DST offset is a pretty expensive operation -// we keep a cache of last computed offset along with a time interval +// local_time_offset is initialized when the DST_offset_cache is missed. +// It must not be used until after a call to DaylightSavingsOffset(). +// In this way, only one check, for a DST cache miss, is needed. +var local_time_offset; + + +// Because computing the DST offset is an expensive operation, +// we keep a cache of the last computed DST offset along with a time interval // where we know the cache is valid. +// When the cache is valid, local_time_offset is also valid. var DST_offset_cache = { // Cached DST offset. offset: 0, @@ -146,6 +153,11 @@ function DaylightSavingsOffset(t) { // If the time fits in the cached interval, return the cached offset. if (t <= end) return cache.offset; + // If the cache misses, the local_time_offset may not be initialized. + if (IS_UNDEFINED(local_time_offset)) { + local_time_offset = %DateLocalTimeOffset(); + } + // Compute a possible new interval end. var new_end = end + cache.increment; @@ -182,6 +194,10 @@ function DaylightSavingsOffset(t) { } } + // If the cache misses, the local_time_offset may not be initialized. + if (IS_UNDEFINED(local_time_offset)) { + local_time_offset = %DateLocalTimeOffset(); + } // Compute the DST offset for the time and shrink the cache interval // to only contain the time. This allows fast repeated DST offset // computations for the same time. @@ -212,15 +228,17 @@ function WeekDay(time) { return Modulo(DAY(time) + 4, 7); } -var local_time_offset = %DateLocalTimeOffset(); function LocalTime(time) { if (NUMBER_IS_NAN(time)) return time; - return time + local_time_offset + DaylightSavingsOffset(time); + // DaylightSavingsOffset called before local_time_offset used. + return time + DaylightSavingsOffset(time) + local_time_offset; } function LocalTimeNoCheck(time) { // Inline the DST offset cache checks for speed. + // The cache is hit, or DaylightSavingsOffset is called, + // before local_time_offset is used. var cache = DST_offset_cache; if (cache.start <= time && time <= cache.end) { var dst_offset = cache.offset; @@ -233,6 +251,11 @@ function LocalTimeNoCheck(time) { function UTC(time) { if (NUMBER_IS_NAN(time)) return time; + // local_time_offset is needed before the call to DaylightSavingsOffset, + // so it may be uninitialized. + if (IS_UNDEFINED(local_time_offset)) { + local_time_offset = %DateLocalTimeOffset(); + } var tmp = time - local_time_offset; return tmp - DaylightSavingsOffset(tmp); } @@ -628,7 +651,7 @@ function LocalTimezoneString(time) { } var timezoneOffset = - (local_time_offset + DaylightSavingsOffset(time)) / msPerMinute; + (DaylightSavingsOffset(time) + local_time_offset) / msPerMinute; var sign = (timezoneOffset >= 0) ? 1 : -1; var hours = FLOOR((sign * timezoneOffset)/60); var min = FLOOR((sign * timezoneOffset)%60); @@ -693,7 +716,8 @@ function DateNow() { function DateToString() { var t = DATE_VALUE(this); if (NUMBER_IS_NAN(t)) return kInvalidDate; - return DatePrintString(LocalTimeNoCheck(t)) + LocalTimezoneString(t); + var time_zone_string = LocalTimezoneString(t); // May update local offset. + return DatePrintString(LocalTimeNoCheck(t)) + time_zone_string; } @@ -709,8 +733,8 @@ function DateToDateString() { function DateToTimeString() { var t = DATE_VALUE(this); if (NUMBER_IS_NAN(t)) return kInvalidDate; - var lt = LocalTimeNoCheck(t); - return TimeString(lt) + LocalTimezoneString(lt); + var time_zone_string = LocalTimezoneString(t); // May update local offset. + return TimeString(LocalTimeNoCheck(t)) + time_zone_string; } |