Fix BestFitMatcher due to invalid locale id in ICU
Somehow we have no-NO-NY locale data in ICU and cause problem. Bug: v8:11595 Change-Id: I68ba4c4c219bb3fbc88976f901a86219c44ea265 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2782602 Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> Reviewed-by: Shu-yu Guo <syg@chromium.org> Commit-Queue: Frank Tang <ftang@chromium.org> Cr-Commit-Position: refs/heads/master@{#73818}
This commit is contained in:
parent
e8e9e40d02
commit
fb3a854eb7
@ -1472,13 +1472,19 @@ icu::LocaleMatcher BuildLocaleMatcher(
|
||||
UErrorCode* status) {
|
||||
icu::Locale default_locale =
|
||||
icu::Locale::forLanguageTag(DefaultLocale(isolate), *status);
|
||||
DCHECK(U_SUCCESS(*status));
|
||||
icu::LocaleMatcher::Builder builder;
|
||||
if (U_FAILURE(*status)) {
|
||||
return builder.build(*status);
|
||||
}
|
||||
builder.setDefaultLocale(&default_locale);
|
||||
for (auto it = available_locales.begin(); it != available_locales.end();
|
||||
++it) {
|
||||
builder.addSupportedLocale(
|
||||
icu::Locale::forLanguageTag(it->c_str(), *status));
|
||||
*status = U_ZERO_ERROR;
|
||||
icu::Locale l = icu::Locale::forLanguageTag(it->c_str(), *status);
|
||||
// skip invalid locale such as no-NO-NY
|
||||
if (U_SUCCESS(*status)) {
|
||||
builder.addSupportedLocale(l);
|
||||
}
|
||||
}
|
||||
|
||||
return builder.build(*status);
|
||||
|
23
test/intl/regress-11595.js
Normal file
23
test/intl/regress-11595.js
Normal file
@ -0,0 +1,23 @@
|
||||
// Copyright 2021 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --harmony_intl_best_fit_matcher
|
||||
|
||||
const intl_objects = [
|
||||
Intl.Collator,
|
||||
Intl.DateTimeFormat,
|
||||
Intl.DisplayNames,
|
||||
Intl.ListFormat,
|
||||
Intl.NumberFormat,
|
||||
Intl.PluralRules,
|
||||
Intl.RelativeTimeFormat,
|
||||
Intl.Segmenter,
|
||||
];
|
||||
|
||||
// Just ensure the f.supportedLocalesOf won't cause crash.
|
||||
intl_objects.forEach(f => {
|
||||
let supported = f.supportedLocalesOf(["en"]);
|
||||
assertEquals(1, supported.length);
|
||||
assertEquals("en", supported[0]);
|
||||
});
|
Loading…
Reference in New Issue
Block a user