diff --git a/src/runtime/runtime-intl.cc b/src/runtime/runtime-intl.cc index 18e635c4f7..2868ae5980 100644 --- a/src/runtime/runtime-intl.cc +++ b/src/runtime/runtime-intl.cc @@ -785,7 +785,10 @@ RUNTIME_FUNCTION(Runtime_StringLocaleConvertCase) { s = String::Flatten(s); // All the languages requiring special-handling have two-letter codes. - if (V8_UNLIKELY(lang_arg->length() > 2)) + // Note that we have to check for '!= 2' here because private-use language + // tags (x-foo) or grandfathered irregular tags (e.g. i-enochian) would have + // only 'x' or 'i' when they get here. + if (V8_UNLIKELY(lang_arg->length() != 2)) return ConvertCase(s, is_upper, isolate); char c1, c2; diff --git a/test/intl/general/case-mapping.js b/test/intl/general/case-mapping.js index feb0ff54f6..0028c4150f 100644 --- a/test/intl/general/case-mapping.js +++ b/test/intl/general/case-mapping.js @@ -128,6 +128,8 @@ assertEquals("abci\u0307", "aBcI\u0307".toLowerCase()); assertEquals("abci\u0307", "aBcI\u0307".toLocaleLowerCase("fil")); assertEquals("abci\u0307", "aBcI\u0307".toLocaleLowerCase("zh-Hant-TW")); assertEquals("abci\u0307", "aBcI\u0307".toLocaleLowerCase("i-klingon")); +assertEquals("abci\u0307", "aBcI\u0307".toLocaleLowerCase("i-enochian")); +assertEquals("abci\u0307", "aBcI\u0307".toLocaleLowerCase("x-foobar")); // Up to 8 chars are allowed for the primary language tag in BCP 47. assertEquals("abci\u0307", "aBcI\u0307".toLocaleLowerCase("longlang"));