OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 | 4 |
5 | 5 |
6 #ifdef V8_I18N_SUPPORT | 6 #ifdef V8_I18N_SUPPORT |
7 #include "src/runtime/runtime-utils.h" | 7 #include "src/runtime/runtime-utils.h" |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
(...skipping 930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 namespace { | 941 namespace { |
942 MUST_USE_RESULT Object* LocaleConvertCase(Handle<String> s, Isolate* isolate, | 942 MUST_USE_RESULT Object* LocaleConvertCase(Handle<String> s, Isolate* isolate, |
943 bool is_to_upper, const char* lang) { | 943 bool is_to_upper, const char* lang) { |
944 auto case_converter = is_to_upper ? u_strToUpper : u_strToLower; | 944 auto case_converter = is_to_upper ? u_strToUpper : u_strToLower; |
945 int32_t src_length = s->length(); | 945 int32_t src_length = s->length(); |
946 int32_t dest_length = src_length; | 946 int32_t dest_length = src_length; |
947 UErrorCode status; | 947 UErrorCode status; |
948 Handle<SeqTwoByteString> result; | 948 Handle<SeqTwoByteString> result; |
949 std::unique_ptr<uc16[]> sap; | 949 std::unique_ptr<uc16[]> sap; |
950 | 950 |
| 951 if (dest_length == 0) return isolate->heap()->empty_string(); |
| 952 |
951 // This is not a real loop. It'll be executed only once (no overflow) or | 953 // This is not a real loop. It'll be executed only once (no overflow) or |
952 // twice (overflow). | 954 // twice (overflow). |
953 for (int i = 0; i < 2; ++i) { | 955 for (int i = 0; i < 2; ++i) { |
954 // Case conversion can increase the string length (e.g. sharp-S => SS) so | 956 // Case conversion can increase the string length (e.g. sharp-S => SS) so |
955 // that we have to handle RangeError exceptions here. | 957 // that we have to handle RangeError exceptions here. |
956 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 958 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
957 isolate, result, isolate->factory()->NewRawTwoByteString(dest_length)); | 959 isolate, result, isolate->factory()->NewRawTwoByteString(dest_length)); |
958 DisallowHeapAllocation no_gc; | 960 DisallowHeapAllocation no_gc; |
959 String::FlatContent flat = s->GetFlatContent(); | 961 String::FlatContent flat = s->GetFlatContent(); |
960 const UChar* src = GetUCharBufferFromFlat(flat, &sap, src_length); | 962 const UChar* src = GetUCharBufferFromFlat(flat, &sap, src_length); |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1152 DCHECK_EQ(args.length(), 1); | 1154 DCHECK_EQ(args.length(), 1); |
1153 CONVERT_ARG_HANDLE_CHECKED(String, s, 0); | 1155 CONVERT_ARG_HANDLE_CHECKED(String, s, 0); |
1154 | 1156 |
1155 // This function could be optimized for no-op cases the way lowercase | 1157 // This function could be optimized for no-op cases the way lowercase |
1156 // counterpart is, but in empirical testing, few actual calls to upper() | 1158 // counterpart is, but in empirical testing, few actual calls to upper() |
1157 // are no-ops. So, it wouldn't be worth the extra time for pre-scanning. | 1159 // are no-ops. So, it wouldn't be worth the extra time for pre-scanning. |
1158 | 1160 |
1159 int32_t length = s->length(); | 1161 int32_t length = s->length(); |
1160 s = String::Flatten(s); | 1162 s = String::Flatten(s); |
1161 | 1163 |
1162 if (s->HasOnlyOneByteChars()) { | 1164 if (s->HasOnlyOneByteChars() && length > 0) { |
1163 Handle<SeqOneByteString> result; | 1165 Handle<SeqOneByteString> result; |
1164 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 1166 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
1165 isolate, result, isolate->factory()->NewRawOneByteString(length)); | 1167 isolate, result, isolate->factory()->NewRawOneByteString(length)); |
1166 | 1168 |
1167 int sharp_s_count; | 1169 int sharp_s_count; |
1168 bool is_result_single_byte; | 1170 bool is_result_single_byte; |
1169 { | 1171 { |
1170 DisallowHeapAllocation no_gc; | 1172 DisallowHeapAllocation no_gc; |
1171 String::FlatContent flat = s->GetFlatContent(); | 1173 String::FlatContent flat = s->GetFlatContent(); |
1172 // If it was ok to slow down ASCII-only input slightly, ToUpperFastASCII | 1174 // If it was ok to slow down ASCII-only input slightly, ToUpperFastASCII |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 Handle<FixedArray> date_cache_version = | 1249 Handle<FixedArray> date_cache_version = |
1248 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton( | 1250 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton( |
1249 EternalHandles::DATE_CACHE_VERSION)); | 1251 EternalHandles::DATE_CACHE_VERSION)); |
1250 return date_cache_version->get(0); | 1252 return date_cache_version->get(0); |
1251 } | 1253 } |
1252 | 1254 |
1253 } // namespace internal | 1255 } // namespace internal |
1254 } // namespace v8 | 1256 } // namespace v8 |
1255 | 1257 |
1256 #endif // V8_I18N_SUPPORT | 1258 #endif // V8_I18N_SUPPORT |
OLD | NEW |