Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // limitations under the License. | 4 // limitations under the License. |
| 5 | 5 |
| 6 #include "src/i18n.h" | 6 #include "src/i18n.h" |
| 7 | 7 |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "src/api.h" | 10 #include "src/api.h" |
| 11 #include "src/factory.h" | 11 #include "src/factory.h" |
| 12 #include "src/isolate.h" | 12 #include "src/isolate.h" |
| 13 #include "src/objects-inl.h" | 13 #include "src/objects-inl.h" |
| 14 #include "unicode/brkiter.h" | 14 #include "unicode/brkiter.h" |
| 15 #include "unicode/bytestream.h" | |
| 15 #include "unicode/calendar.h" | 16 #include "unicode/calendar.h" |
| 16 #include "unicode/coll.h" | 17 #include "unicode/coll.h" |
| 17 #include "unicode/curramt.h" | 18 #include "unicode/curramt.h" |
| 18 #include "unicode/dcfmtsym.h" | 19 #include "unicode/dcfmtsym.h" |
| 19 #include "unicode/decimfmt.h" | 20 #include "unicode/decimfmt.h" |
| 20 #include "unicode/dtfmtsym.h" | 21 #include "unicode/dtfmtsym.h" |
| 21 #include "unicode/dtptngen.h" | 22 #include "unicode/dtptngen.h" |
| 22 #include "unicode/gregocal.h" | 23 #include "unicode/gregocal.h" |
| 23 #include "unicode/locid.h" | 24 #include "unicode/locid.h" |
| 24 #include "unicode/numfmt.h" | 25 #include "unicode/numfmt.h" |
| (...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 902 return reinterpret_cast<icu::BreakIterator*>(obj->GetInternalField(0)); | 903 return reinterpret_cast<icu::BreakIterator*>(obj->GetInternalField(0)); |
| 903 } | 904 } |
| 904 | 905 |
| 905 void V8BreakIterator::DeleteBreakIterator( | 906 void V8BreakIterator::DeleteBreakIterator( |
| 906 const v8::WeakCallbackInfo<void>& data) { | 907 const v8::WeakCallbackInfo<void>& data) { |
| 907 delete reinterpret_cast<icu::BreakIterator*>(data.GetInternalField(0)); | 908 delete reinterpret_cast<icu::BreakIterator*>(data.GetInternalField(0)); |
| 908 delete reinterpret_cast<icu::UnicodeString*>(data.GetInternalField(1)); | 909 delete reinterpret_cast<icu::UnicodeString*>(data.GetInternalField(1)); |
| 909 GlobalHandles::Destroy(reinterpret_cast<Object**>(data.GetParameter())); | 910 GlobalHandles::Destroy(reinterpret_cast<Object**>(data.GetParameter())); |
| 910 } | 911 } |
| 911 | 912 |
| 913 ICUTimezoneCache::ICUTimezoneCache() : timezone_(nullptr) { Clear(); } | |
| 914 | |
| 915 ICUTimezoneCache::~ICUTimezoneCache() { Clear(); } | |
| 916 | |
| 917 const char* ICUTimezoneCache::LocalTimezone(double time_ms) { | |
| 918 bool is_dst = DaylightSavingsOffset(time_ms) != 0; | |
| 919 char* name = is_dst ? dst_timezone_name_ : timezone_name_; | |
| 920 if (name[0] == '\0') { | |
| 921 icu::UnicodeString result; | |
| 922 GetTimeZone()->getDisplayName(is_dst, icu::TimeZone::LONG, result); | |
| 923 result += '\0'; | |
| 924 | |
| 925 icu::CheckedArrayByteSink byte_sink(name, kMaxTimezoneChars); | |
|
ulan
2017/03/17 11:00:05
CHECK(!byte_sink.Overflowed());
Dan Ehrenberg
2017/04/06 15:35:21
Check has been added.
| |
| 926 result.toUTF8(byte_sink); | |
| 927 } | |
| 928 return const_cast<const char*>(name); | |
| 929 } | |
| 930 | |
| 931 icu::TimeZone* ICUTimezoneCache::GetTimeZone() { | |
| 932 if (timezone_ == nullptr) { | |
| 933 timezone_ = icu::TimeZone::createDefault(); | |
| 934 } | |
| 935 return timezone_; | |
| 936 } | |
| 937 | |
| 938 bool ICUTimezoneCache::GetOffsets(double time_ms, int32_t* raw_offset, | |
| 939 int32_t* dst_offset) { | |
| 940 UErrorCode status = U_ZERO_ERROR; | |
| 941 GetTimeZone()->getOffset(time_ms, false, *raw_offset, *dst_offset, status); | |
| 942 return U_SUCCESS(status); | |
| 943 } | |
| 944 | |
| 945 double ICUTimezoneCache::DaylightSavingsOffset(double time_ms) { | |
| 946 int32_t raw_offset, dst_offset; | |
| 947 if (!GetOffsets(time_ms, &raw_offset, &dst_offset)) return 0; | |
| 948 return dst_offset; | |
| 949 } | |
| 950 | |
| 951 double ICUTimezoneCache::LocalTimeOffset() { | |
| 952 int32_t raw_offset, dst_offset; | |
| 953 if (!GetOffsets(icu::Calendar::getNow(), &raw_offset, &dst_offset)) return 0; | |
| 954 return raw_offset; | |
| 955 } | |
| 956 | |
| 957 void ICUTimezoneCache::Clear() { | |
| 958 delete timezone_; | |
| 959 timezone_ = nullptr; | |
| 960 timezone_name_[0] = '\0'; | |
| 961 dst_timezone_name_[0] = '\0'; | |
| 962 } | |
| 963 | |
| 912 } // namespace internal | 964 } // namespace internal |
| 913 } // namespace v8 | 965 } // namespace v8 |
| OLD | NEW |