Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/runtime/runtime-i18n.cc

Issue 2236343002: Revert of Throw when case mapping result > max string length (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/js/i18n.js ('k') | test/intl/general/case-mapping.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 CopyChars(dest->get(), flat.ToOneByteVector().start(), length); 56 CopyChars(dest->get(), flat.ToOneByteVector().start(), length);
57 } 57 }
58 return reinterpret_cast<const UChar*>(dest->get()); 58 return reinterpret_cast<const UChar*>(dest->get());
59 } else { 59 } else {
60 return reinterpret_cast<const UChar*>(flat.ToUC16Vector().start()); 60 return reinterpret_cast<const UChar*>(flat.ToUC16Vector().start());
61 } 61 }
62 } 62 }
63 63
64 } // namespace 64 } // namespace
65 65
66 // ECMA 402 6.2.3
67 RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) { 66 RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) {
68 HandleScope scope(isolate); 67 HandleScope scope(isolate);
69 Factory* factory = isolate->factory(); 68 Factory* factory = isolate->factory();
70 69
71 DCHECK(args.length() == 1); 70 DCHECK(args.length() == 1);
72 CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0); 71 CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0);
73 72
74 v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str)); 73 v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str));
75 74
76 // Return value which denotes invalid language tag. 75 // Return value which denotes invalid language tag.
77 // TODO(jshin): Can uloc_{for,to}TanguageTag fail even for structually valid
78 // language tags? If not, just add CHECK instead of returning 'invalid-tag'.
79 const char* const kInvalidTag = "invalid-tag"; 76 const char* const kInvalidTag = "invalid-tag";
80 77
81 UErrorCode error = U_ZERO_ERROR; 78 UErrorCode error = U_ZERO_ERROR;
82 char icu_result[ULOC_FULLNAME_CAPACITY]; 79 char icu_result[ULOC_FULLNAME_CAPACITY];
83 int icu_length = 0; 80 int icu_length = 0;
84 81
85 uloc_forLanguageTag(*locale_id, icu_result, ULOC_FULLNAME_CAPACITY, 82 uloc_forLanguageTag(*locale_id, icu_result, ULOC_FULLNAME_CAPACITY,
86 &icu_length, &error); 83 &icu_length, &error);
87 if (U_FAILURE(error) || icu_length == 0) { 84 if (U_FAILURE(error) || icu_length == 0) {
88 return *factory->NewStringFromAsciiChecked(kInvalidTag); 85 return *factory->NewStringFromAsciiChecked(kInvalidTag);
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 auto case_converter = is_to_upper ? u_strToUpper : u_strToLower; 852 auto case_converter = is_to_upper ? u_strToUpper : u_strToLower;
856 853
857 int32_t dest_length = src_length; 854 int32_t dest_length = src_length;
858 UErrorCode status; 855 UErrorCode status;
859 Handle<SeqTwoByteString> result; 856 Handle<SeqTwoByteString> result;
860 std::unique_ptr<uc16[]> sap; 857 std::unique_ptr<uc16[]> sap;
861 858
862 // This is not a real loop. It'll be executed only once (no overflow) or 859 // This is not a real loop. It'll be executed only once (no overflow) or
863 // twice (overflow). 860 // twice (overflow).
864 for (int i = 0; i < 2; ++i) { 861 for (int i = 0; i < 2; ++i) {
865 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 862 result =
866 isolate, result, isolate->factory()->NewRawTwoByteString(dest_length)); 863 isolate->factory()->NewRawTwoByteString(dest_length).ToHandleChecked();
867 DisallowHeapAllocation no_gc; 864 DisallowHeapAllocation no_gc;
868 String::FlatContent flat = s->GetFlatContent(); 865 String::FlatContent flat = s->GetFlatContent();
869 const UChar* src = GetUCharBufferFromFlat(flat, &sap, src_length); 866 const UChar* src = GetUCharBufferFromFlat(flat, &sap, src_length);
870 status = U_ZERO_ERROR; 867 status = U_ZERO_ERROR;
871 dest_length = case_converter(reinterpret_cast<UChar*>(result->GetChars()), 868 dest_length = case_converter(reinterpret_cast<UChar*>(result->GetChars()),
872 dest_length, src, src_length, lang, &status); 869 dest_length, src, src_length, lang, &status);
873 if (status != U_BUFFER_OVERFLOW_ERROR) break; 870 if (status != U_BUFFER_OVERFLOW_ERROR) break;
874 } 871 }
875 872
876 // In most cases, the output will fill the destination buffer completely 873 // In most cases, the output will fill the destination buffer completely
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 Handle<FixedArray> date_cache_version = 1151 Handle<FixedArray> date_cache_version =
1155 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton( 1152 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton(
1156 EternalHandles::DATE_CACHE_VERSION)); 1153 EternalHandles::DATE_CACHE_VERSION));
1157 return date_cache_version->get(0); 1154 return date_cache_version->get(0);
1158 } 1155 }
1159 1156
1160 } // namespace internal 1157 } // namespace internal
1161 } // namespace v8 1158 } // namespace v8
1162 1159
1163 #endif // V8_I18N_SUPPORT 1160 #endif // V8_I18N_SUPPORT
OLDNEW
« no previous file with comments | « src/js/i18n.js ('k') | test/intl/general/case-mapping.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698