Revision: 4328
Author: [email protected]
Date: Tue Mar 30 08:09:23 2010
Log: Initialize cached time zone offset after snapshot is created, not
before. Fixes issue 666: http://code.google.com/p/v8/issues/detail?id=666
Review URL: http://codereview.chromium.org/1589002
http://code.google.com/p/v8/source/detail?r=4328
Modified:
/trunk/src/date.js
/trunk/src/version.cc
=======================================
--- /trunk/src/date.js Wed Mar 24 01:21:20 2010
+++ /trunk/src/date.js Tue Mar 30 08:09:23 2010
@@ -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,
@@ -148,6 +155,11 @@
if (start <= 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;
@@ -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);
=======================================
--- /trunk/src/version.cc Tue Mar 30 01:36:16 2010
+++ /trunk/src/version.cc Tue Mar 30 08:09:23 2010
@@ -35,7 +35,7 @@
#define MAJOR_VERSION 2
#define MINOR_VERSION 2
#define BUILD_NUMBER 0
-#define PATCH_LEVEL 1
+#define PATCH_LEVEL 2
#define CANDIDATE_VERSION false
// Define SONAME to have the SCons build the put a specific SONAME into the
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
To unsubscribe from this group, send email to v8-dev+unsubscribegooglegroups.com or reply
to this email with the words "REMOVE ME" as the subject.