| 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 |