Skip to content

Commit 9a132a9

Browse files
natorionCommit Bot
authored andcommitted
Revert "Merged: Correct the misuse of uloc_{to,from}LanguageTag"
This reverts commit 593b0d8. Reason for revert: broke some branch builders like https://build.chromium.org/p/client.v8.branches/builders/V8%20arm%20-%20sim%20-%20beta%20branch%20-%20debug Original change's description: > Merged: Correct the misuse of uloc_{to,from}LanguageTag > > Revision: 69bd294 > > Merge to 6.3 branch > > - remove unused Runtime_GetLanguageTagVariants > - add test for another related bug (chromium:770452) as well as for > chromium:770450 . > > BUG=chromium:770450,chromium:770452 > LOG=N > NOTRY=true > NOPRESUBMIT=true > NOTREECHECKS=true > R=​[email protected] > > Cq-Include-Trybots: master.tryserver.v8:v8_linux_noi18n_rel_ng > Change-Id: Ia2c6dd2156c51995fb18228fc3062a86e78d719c > Reviewed-on: https://chromium-review.googlesource.com/721844 > Reviewed-by: Adam Klein <[email protected]> > Commit-Queue: Jungshik Shin <[email protected]> > Cr-Commit-Position: refs/branch-heads/6.3@{#9} > Cr-Branched-From: 094a7c9-refs/heads/6.3.292@{#1} > Cr-Branched-From: 18b8fbb-refs/heads/master@{#48432} [email protected],[email protected],[email protected] Change-Id: I37018f8241efe1431f453ff55cf8216a5daa66de No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: chromium:770450, chromium:770452 Cq-Include-Trybots: master.tryserver.v8:v8_linux_noi18n_rel_ng Reviewed-on: https://chromium-review.googlesource.com/723323 Reviewed-by: Michael Hablich <[email protected]> Commit-Queue: Michael Hablich <[email protected]> Cr-Commit-Position: refs/branch-heads/6.3@{#17} Cr-Branched-From: 094a7c9-refs/heads/6.3.292@{#1} Cr-Branched-From: 18b8fbb-refs/heads/master@{#48432}
1 parent f435a18 commit 9a132a9

File tree

3 files changed

+95
-51
lines changed

3 files changed

+95
-51
lines changed

src/runtime/runtime-intl.cc

Lines changed: 94 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,18 @@ RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) {
6868
v8::String::Utf8Value locale_id(v8_isolate,
6969
v8::Utils::ToLocal(locale_id_str));
7070

71-
// TODO(jshin): uloc_{for,to}TanguageTag can fail even for a structually valid
72-
// language tag if it's too long (much longer than 100 chars). Even if we
73-
// allocate a longer buffer, ICU will still fail if it's too long. Either
74-
// propose to Ecma 402 to put a limit on the locale length or change ICU to
75-
// handle long locale names better. See
76-
// https://ssl.icu-project.org/trac/ticket/13417 .
77-
7871
// Return value which denotes invalid language tag.
72+
// TODO(jshin): Can uloc_{for,to}TanguageTag fail even for structually valid
73+
// language tags? If not, just add CHECK instead of returning 'invalid-tag'.
7974
const char* const kInvalidTag = "invalid-tag";
8075

8176
UErrorCode error = U_ZERO_ERROR;
8277
char icu_result[ULOC_FULLNAME_CAPACITY];
83-
uloc_forLanguageTag(*locale_id, icu_result, ULOC_FULLNAME_CAPACITY, nullptr,
84-
&error);
85-
if (U_FAILURE(error) || error == U_STRING_NOT_TERMINATED_WARNING) {
78+
int icu_length = 0;
79+
80+
uloc_forLanguageTag(*locale_id, icu_result, ULOC_FULLNAME_CAPACITY,
81+
&icu_length, &error);
82+
if (U_FAILURE(error) || icu_length == 0) {
8683
return *factory->NewStringFromAsciiChecked(kInvalidTag);
8784
}
8885

@@ -91,7 +88,7 @@ RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) {
9188
// Force strict BCP47 rules.
9289
uloc_toLanguageTag(icu_result, result, ULOC_FULLNAME_CAPACITY, TRUE, &error);
9390

94-
if (U_FAILURE(error) || error == U_STRING_NOT_TERMINATED_WARNING) {
91+
if (U_FAILURE(error)) {
9592
return *factory->NewStringFromAsciiChecked(kInvalidTag);
9693
}
9794

@@ -137,7 +134,7 @@ RUNTIME_FUNCTION(Runtime_AvailableLocalesOf) {
137134
error = U_ZERO_ERROR;
138135
// No need to force strict BCP47 rules.
139136
uloc_toLanguageTag(icu_name, result, ULOC_FULLNAME_CAPACITY, FALSE, &error);
140-
if (U_FAILURE(error) || error == U_STRING_NOT_TERMINATED_WARNING) {
137+
if (U_FAILURE(error)) {
141138
// This shouldn't happen, but lets not break the user.
142139
continue;
143140
}
@@ -176,6 +173,91 @@ RUNTIME_FUNCTION(Runtime_GetDefaultICULocale) {
176173
return *factory->NewStringFromStaticChars("und");
177174
}
178175

176+
RUNTIME_FUNCTION(Runtime_GetLanguageTagVariants) {
177+
HandleScope scope(isolate);
178+
v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
179+
Factory* factory = isolate->factory();
180+
181+
DCHECK_EQ(1, args.length());
182+
183+
CONVERT_ARG_HANDLE_CHECKED(JSArray, input, 0);
184+
185+
uint32_t length = static_cast<uint32_t>(input->length()->Number());
186+
// Set some limit to prevent fuzz tests from going OOM.
187+
// Can be bumped when callers' requirements change.
188+
if (length >= 100) return isolate->ThrowIllegalOperation();
189+
Handle<FixedArray> output = factory->NewFixedArray(length);
190+
Handle<Name> maximized = factory->NewStringFromStaticChars("maximized");
191+
Handle<Name> base = factory->NewStringFromStaticChars("base");
192+
for (unsigned int i = 0; i < length; ++i) {
193+
Handle<Object> locale_id;
194+
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
195+
isolate, locale_id, JSReceiver::GetElement(isolate, input, i));
196+
if (!locale_id->IsString()) {
197+
return isolate->Throw(*factory->illegal_argument_string());
198+
}
199+
200+
v8::String::Utf8Value utf8_locale_id(
201+
v8_isolate, v8::Utils::ToLocal(Handle<String>::cast(locale_id)));
202+
203+
UErrorCode error = U_ZERO_ERROR;
204+
205+
// Convert from BCP47 to ICU format.
206+
// de-DE-u-co-phonebk -> de_DE@collation=phonebook
207+
char icu_locale[ULOC_FULLNAME_CAPACITY];
208+
int icu_locale_length = 0;
209+
uloc_forLanguageTag(*utf8_locale_id, icu_locale, ULOC_FULLNAME_CAPACITY,
210+
&icu_locale_length, &error);
211+
if (U_FAILURE(error) || icu_locale_length == 0) {
212+
return isolate->Throw(*factory->illegal_argument_string());
213+
}
214+
215+
// Maximize the locale.
216+
// de_DE@collation=phonebook -> de_Latn_DE@collation=phonebook
217+
char icu_max_locale[ULOC_FULLNAME_CAPACITY];
218+
uloc_addLikelySubtags(icu_locale, icu_max_locale, ULOC_FULLNAME_CAPACITY,
219+
&error);
220+
221+
// Remove extensions from maximized locale.
222+
// de_Latn_DE@collation=phonebook -> de_Latn_DE
223+
char icu_base_max_locale[ULOC_FULLNAME_CAPACITY];
224+
uloc_getBaseName(icu_max_locale, icu_base_max_locale,
225+
ULOC_FULLNAME_CAPACITY, &error);
226+
227+
// Get original name without extensions.
228+
// de_DE@collation=phonebook -> de_DE
229+
char icu_base_locale[ULOC_FULLNAME_CAPACITY];
230+
uloc_getBaseName(icu_locale, icu_base_locale, ULOC_FULLNAME_CAPACITY,
231+
&error);
232+
233+
// Convert from ICU locale format to BCP47 format.
234+
// de_Latn_DE -> de-Latn-DE
235+
char base_max_locale[ULOC_FULLNAME_CAPACITY];
236+
uloc_toLanguageTag(icu_base_max_locale, base_max_locale,
237+
ULOC_FULLNAME_CAPACITY, FALSE, &error);
238+
239+
// de_DE -> de-DE
240+
char base_locale[ULOC_FULLNAME_CAPACITY];
241+
uloc_toLanguageTag(icu_base_locale, base_locale, ULOC_FULLNAME_CAPACITY,
242+
FALSE, &error);
243+
244+
if (U_FAILURE(error)) {
245+
return isolate->Throw(*factory->illegal_argument_string());
246+
}
247+
248+
Handle<JSObject> result = factory->NewJSObject(isolate->object_function());
249+
Handle<String> value = factory->NewStringFromAsciiChecked(base_max_locale);
250+
JSObject::AddProperty(result, maximized, value, NONE);
251+
value = factory->NewStringFromAsciiChecked(base_locale);
252+
JSObject::AddProperty(result, base, value, NONE);
253+
output->set(i, *result);
254+
}
255+
256+
Handle<JSArray> result = factory->NewJSArrayWithElements(output);
257+
result->set_length(Smi::FromInt(length));
258+
return *result;
259+
}
260+
179261
RUNTIME_FUNCTION(Runtime_IsInitializedIntlObject) {
180262
HandleScope scope(isolate);
181263

src/runtime/runtime.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ namespace internal {
252252
F(CanonicalizeLanguageTag, 1, 1) \
253253
F(AvailableLocalesOf, 1, 1) \
254254
F(GetDefaultICULocale, 0, 1) \
255+
F(GetLanguageTagVariants, 1, 1) \
255256
F(IsInitializedIntlObject, 1, 1) \
256257
F(IsInitializedIntlObjectOfType, 2, 1) \
257258
F(MarkAsInitializedIntlObjectOfType, 2, 1) \

test/intl/general/invalid-locale.js

Lines changed: 0 additions & 39 deletions
This file was deleted.

0 commit comments

Comments
 (0)