Skip to content

Commit 35645ab

Browse files
committed
ICU-22494 Avoid adding empty or duplicate variants during locale canoncalization.
It change the failure case (see the bug) from 35s to 0.126s on a very fast developement machine.
1 parent 687feb1 commit 35645ab

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

icu4c/source/common/locid.cpp

+15-3
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,13 @@ class AliasReplacer {
10671067
public:
10681068
AliasReplacer(UErrorCode status) :
10691069
language(nullptr), script(nullptr), region(nullptr),
1070-
extensions(nullptr), variants(status),
1070+
extensions(nullptr),
1071+
// store value in variants only once
1072+
variants(nullptr,
1073+
([](UElement e1, UElement e2) -> UBool {
1074+
return 0==uprv_strcmp((const char*)e1.pointer,
1075+
(const char*)e2.pointer);}),
1076+
status),
10711077
data(nullptr) {
10721078
}
10731079
~AliasReplacer() {
@@ -1653,10 +1659,16 @@ AliasReplacer::replace(const Locale& locale, CharString& out, UErrorCode& status
16531659
while ((end = uprv_strchr(start, SEP_CHAR)) != nullptr &&
16541660
U_SUCCESS(status)) {
16551661
*end = NULL_CHAR; // null terminate inside variantsBuff
1656-
variants.addElement(start, status);
1662+
// do not add "" or duplicate data to variants
1663+
if (*start && !variants.contains(start)) {
1664+
variants.addElement(start, status);
1665+
}
16571666
start = end + 1;
16581667
}
1659-
variants.addElement(start, status);
1668+
// do not add "" or duplicate data to variants
1669+
if (*start && !variants.contains(start)) {
1670+
variants.addElement(start, status);
1671+
}
16601672
}
16611673
if (U_FAILURE(status)) { return false; }
16621674

0 commit comments

Comments
 (0)