From fb3a854eb7e3ff7cfb28a67e4485388a24a4ada0 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Tue, 23 Mar 2021 14:00:02 -0700 Subject: [PATCH] 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 Reviewed-by: Shu-yu Guo Commit-Queue: Frank Tang Cr-Commit-Position: refs/heads/master@{#73818} --- src/objects/intl-objects.cc | 12 +++++++++--- test/intl/regress-11595.js | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 test/intl/regress-11595.js diff --git a/src/objects/intl-objects.cc b/src/objects/intl-objects.cc index 8267308439..d9fca11e73 100644 --- a/src/objects/intl-objects.cc +++ b/src/objects/intl-objects.cc @@ -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); diff --git a/test/intl/regress-11595.js b/test/intl/regress-11595.js new file mode 100644 index 0000000000..cd7d869654 --- /dev/null +++ b/test/intl/regress-11595.js @@ -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]); +});