OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 // before UTC conversion. | 55 // before UTC conversion. |
56 static const int64_t kMaxTimeBeforeUTCInMs = | 56 static const int64_t kMaxTimeBeforeUTCInMs = |
57 kMaxTimeInMs + 10 * kMsPerDay; | 57 kMaxTimeInMs + 10 * kMsPerDay; |
58 | 58 |
59 // Sentinel that denotes an invalid local offset. | 59 // Sentinel that denotes an invalid local offset. |
60 static const int kInvalidLocalOffsetInMs = kMaxInt; | 60 static const int kInvalidLocalOffsetInMs = kMaxInt; |
61 // Sentinel that denotes an invalid cache stamp. | 61 // Sentinel that denotes an invalid cache stamp. |
62 // It is an invariant of DateCache that cache stamp is non-negative. | 62 // It is an invariant of DateCache that cache stamp is non-negative. |
63 static const int kInvalidStamp = -1; | 63 static const int kInvalidStamp = -1; |
64 | 64 |
65 DateCache() : stamp_(0) { | 65 DateCache() : stamp_(0), tz_cache_(OS::CreateTimezoneCache()) { |
66 ResetDateCache(); | 66 ResetDateCache(); |
67 } | 67 } |
68 | 68 |
69 virtual ~DateCache() {} | 69 virtual ~DateCache() { |
| 70 OS::DisposeTimezoneCache(tz_cache_); |
| 71 tz_cache_ = NULL; |
| 72 } |
70 | 73 |
71 | 74 |
72 // Clears cached timezone information and increments the cache stamp. | 75 // Clears cached timezone information and increments the cache stamp. |
73 void ResetDateCache(); | 76 void ResetDateCache(); |
74 | 77 |
75 | 78 |
76 // Computes floor(time_ms / kMsPerDay). | 79 // Computes floor(time_ms / kMsPerDay). |
77 static int DaysFromTime(int64_t time_ms) { | 80 static int DaysFromTime(int64_t time_ms) { |
78 if (time_ms < 0) time_ms -= (kMsPerDay - 1); | 81 if (time_ms < 0) time_ms -= (kMsPerDay - 1); |
79 return static_cast<int>(time_ms / kMsPerDay); | 82 return static_cast<int>(time_ms / kMsPerDay); |
(...skipping 26 matching lines...) Expand all Loading... |
106 local_offset_ms_ = GetLocalOffsetFromOS(); | 109 local_offset_ms_ = GetLocalOffsetFromOS(); |
107 } | 110 } |
108 return local_offset_ms_; | 111 return local_offset_ms_; |
109 } | 112 } |
110 | 113 |
111 | 114 |
112 const char* LocalTimezone(int64_t time_ms) { | 115 const char* LocalTimezone(int64_t time_ms) { |
113 if (time_ms < 0 || time_ms > kMaxEpochTimeInMs) { | 116 if (time_ms < 0 || time_ms > kMaxEpochTimeInMs) { |
114 time_ms = EquivalentTime(time_ms); | 117 time_ms = EquivalentTime(time_ms); |
115 } | 118 } |
116 return OS::LocalTimezone(static_cast<double>(time_ms)); | 119 return OS::LocalTimezone(static_cast<double>(time_ms), tz_cache_); |
117 } | 120 } |
118 | 121 |
119 // ECMA 262 - 15.9.5.26 | 122 // ECMA 262 - 15.9.5.26 |
120 int TimezoneOffset(int64_t time_ms) { | 123 int TimezoneOffset(int64_t time_ms) { |
121 int64_t local_ms = ToLocal(time_ms); | 124 int64_t local_ms = ToLocal(time_ms); |
122 return static_cast<int>((time_ms - local_ms) / kMsPerMin); | 125 return static_cast<int>((time_ms - local_ms) / kMsPerMin); |
123 } | 126 } |
124 | 127 |
125 // ECMA 262 - 15.9.1.9 | 128 // ECMA 262 - 15.9.1.9 |
126 int64_t ToLocal(int64_t time_ms) { | 129 int64_t ToLocal(int64_t time_ms) { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 // Cache stamp is used for invalidating caches in JSDate. | 178 // Cache stamp is used for invalidating caches in JSDate. |
176 // We increment the stamp each time when the timezone information changes. | 179 // We increment the stamp each time when the timezone information changes. |
177 // JSDate objects perform stamp check and invalidate their caches if | 180 // JSDate objects perform stamp check and invalidate their caches if |
178 // their saved stamp is not equal to the current stamp. | 181 // their saved stamp is not equal to the current stamp. |
179 Smi* stamp() { return stamp_; } | 182 Smi* stamp() { return stamp_; } |
180 void* stamp_address() { return &stamp_; } | 183 void* stamp_address() { return &stamp_; } |
181 | 184 |
182 // These functions are virtual so that we can override them when testing. | 185 // These functions are virtual so that we can override them when testing. |
183 virtual int GetDaylightSavingsOffsetFromOS(int64_t time_sec) { | 186 virtual int GetDaylightSavingsOffsetFromOS(int64_t time_sec) { |
184 double time_ms = static_cast<double>(time_sec * 1000); | 187 double time_ms = static_cast<double>(time_sec * 1000); |
185 return static_cast<int>(OS::DaylightSavingsOffset(time_ms)); | 188 return static_cast<int>(OS::DaylightSavingsOffset(time_ms, tz_cache_)); |
186 } | 189 } |
187 | 190 |
188 virtual int GetLocalOffsetFromOS() { | 191 virtual int GetLocalOffsetFromOS() { |
189 double offset = OS::LocalTimeOffset(); | 192 double offset = OS::LocalTimeOffset(tz_cache_); |
190 ASSERT(offset < kInvalidLocalOffsetInMs); | 193 ASSERT(offset < kInvalidLocalOffsetInMs); |
191 return static_cast<int>(offset); | 194 return static_cast<int>(offset); |
192 } | 195 } |
193 | 196 |
194 private: | 197 private: |
195 // The implementation relies on the fact that no time zones have | 198 // The implementation relies on the fact that no time zones have |
196 // more than one daylight savings offset change per 19 days. | 199 // more than one daylight savings offset change per 19 days. |
197 // In Egypt in 2010 they decided to suspend DST during Ramadan. This | 200 // In Egypt in 2010 they decided to suspend DST during Ramadan. This |
198 // led to a short interval where DST is in effect from September 10 to | 201 // led to a short interval where DST is in effect from September 10 to |
199 // September 30. | 202 // September 30. |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 DST* after_; | 249 DST* after_; |
247 | 250 |
248 int local_offset_ms_; | 251 int local_offset_ms_; |
249 | 252 |
250 // Year/Month/Day cache. | 253 // Year/Month/Day cache. |
251 bool ymd_valid_; | 254 bool ymd_valid_; |
252 int ymd_days_; | 255 int ymd_days_; |
253 int ymd_year_; | 256 int ymd_year_; |
254 int ymd_month_; | 257 int ymd_month_; |
255 int ymd_day_; | 258 int ymd_day_; |
| 259 |
| 260 TimezoneCache* tz_cache_; |
256 }; | 261 }; |
257 | 262 |
258 } } // namespace v8::internal | 263 } } // namespace v8::internal |
259 | 264 |
260 #endif | 265 #endif |
OLD | NEW |