Index: src/date.js |
=================================================================== |
--- src/date.js (revision 4317) |
+++ src/date.js (working copy) |
@@ -121,9 +121,16 @@ |
} |
-// 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, |
@@ -149,6 +156,11 @@ |
// 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; |
@@ -185,6 +197,10 @@ |
} |
} |
+ // 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. |
@@ -215,11 +231,11 @@ |
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) { |
@@ -228,6 +244,8 @@ |
} |
// 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; |
@@ -240,6 +258,11 @@ |
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); |
} |
@@ -566,7 +589,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); |