summaryrefslogtreecommitdiff
path: root/i18npool
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2023-06-14 13:32:01 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2023-06-15 18:15:18 +0200
commit1a253362f6d1e1909913dce298630c92d431e41e (patch)
treef97468cd564328fffab6870a82a7326bddf70809 /i18npool
parentc7dfec21b44b23c4e52b938721f356f75046f37b (diff)
speed up startup time
by avoid conversion of static locale data from sal_Unicode to OUString data - we can declare the data as OUStringConstExpr arrays and then no conversion is necessary. Here we trigger a problem - EditDLL has static data that tends to get torn down __after__ the i18npool shared library has been removed from memory, which means it tries to access OUStringLiteral objects that no longer exists. So use vcl::DeleteOnExit to explicitly clear that on application shutdown. Change-Id: Ie4bfcef7eb4656316ea825474ac42f85844d1dcc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153060 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'i18npool')
-rw-r--r--i18npool/source/localedata/LocaleNode.cxx60
-rw-r--r--i18npool/source/localedata/localedata.cxx51
2 files changed, 47 insertions, 64 deletions
diff --git a/i18npool/source/localedata/LocaleNode.cxx b/i18npool/source/localedata/LocaleNode.cxx
index 49024a6bc97f..d797c45c53b6 100644
--- a/i18npool/source/localedata/LocaleNode.cxx
+++ b/i18npool/source/localedata/LocaleNode.cxx
@@ -2071,7 +2071,7 @@ void LCTransliterationNode::generateCode (const OFileWriter &of) const
OUString useLocale = getAttr().getValueByName("ref");
if (!useLocale.isEmpty()) {
useLocale = useLocale.replace( '-', '_');
- of.writeRefFunction("getTransliterations_", useLocale);
+ of.writeOUStringRefFunction("getTransliterations_", useLocale);
return;
}
sal_Int16 nbOfModules = 0;
@@ -2080,20 +2080,20 @@ void LCTransliterationNode::generateCode (const OFileWriter &of) const
for ( sal_Int32 i = 0; i < getNumberOfChildren(); i++,nbOfModules++) {
LocaleNode * transNode = getChildAt (i);
str = transNode->getAttr().getValueByIndex(0);
- of.writeParameter("Transliteration", str, nbOfModules);
+ of.writeOUStringLiteralParameter("Transliteration", str, nbOfModules);
}
of.writeAsciiString("static const sal_Int16 nbOfTransliterations = ");
of.writeInt(nbOfModules);
of.writeAsciiString(";\n\n");
- of.writeAsciiString("\nstatic const sal_Unicode* LCTransliterationsArray[] = {\n");
+ of.writeAsciiString("\nstatic constexpr rtl::OUStringConstExpr LCTransliterationsArray[] = {\n");
for( sal_Int16 i = 0; i < nbOfModules; i++) {
of.writeAsciiString("\tTransliteration");
of.writeInt(i);
of.writeAsciiString(",\n");
}
of.writeAsciiString("};\n\n");
- of.writeFunction("getTransliterations_", "nbOfTransliterations", "LCTransliterationsArray");
+ of.writeOUStringFunction("getTransliterations_", "nbOfTransliterations", "LCTransliterationsArray");
}
namespace {
@@ -2125,9 +2125,9 @@ void LCMiscNode::generateCode (const OFileWriter &of) const
OUString useLocale = getAttr().getValueByName("ref");
if (!useLocale.isEmpty()) {
useLocale = useLocale.replace( '-', '_');
- of.writeRefFunction("getForbiddenCharacters_", useLocale);
- of.writeRefFunction("getBreakIteratorRules_", useLocale);
- of.writeRefFunction("getReservedWords_", useLocale);
+ of.writeOUStringRefFunction("getForbiddenCharacters_", useLocale);
+ of.writeOUStringRefFunction("getBreakIteratorRules_", useLocale);
+ of.writeOUStringRefFunction("getReservedWords_", useLocale);
return;
}
const LocaleNode * reserveNode = findNode("ReservedWords");
@@ -2155,7 +2155,7 @@ void LCMiscNode::generateCode (const OFileWriter &of) const
++nError;
fprintf( stderr, "Error: No content for ReservedWords %s.\n", ReserveWord[i].name);
}
- of.writeParameter("ReservedWord", str, nbOfWords);
+ of.writeOUStringLiteralParameter("ReservedWord", str, nbOfWords);
// "true", ..., "below" trigger untranslated warning.
if (!bEnglishLocale && curNode && i <= 7 &&
str.equalsIgnoreAsciiCaseAscii( ReserveWord[i].value))
@@ -2168,52 +2168,52 @@ void LCMiscNode::generateCode (const OFileWriter &of) const
of.writeAsciiString("static const sal_Int16 nbOfReservedWords = ");
of.writeInt(nbOfWords);
of.writeAsciiString(";\n\n");
- of.writeAsciiString("\nstatic const sal_Unicode* LCReservedWordsArray[] = {\n");
+ of.writeAsciiString("\nstatic constexpr rtl::OUStringConstExpr LCReservedWordsArray[] = {\n");
for( i = 0; i < nbOfWords; i++) {
of.writeAsciiString("\tReservedWord");
of.writeInt(i);
of.writeAsciiString(",\n");
}
of.writeAsciiString("};\n\n");
- of.writeFunction("getReservedWords_", "nbOfReservedWords", "LCReservedWordsArray");
+ of.writeOUStringFunction("getReservedWords_", "nbOfReservedWords", "LCReservedWordsArray");
if (forbidNode) {
- of.writeParameter( "forbiddenBegin", forbidNode -> getChildAt(0)->getValue());
- of.writeParameter( "forbiddenEnd", forbidNode -> getChildAt(1)->getValue());
- of.writeParameter( "hangingChars", forbidNode -> getChildAt(2)->getValue());
+ of.writeOUStringLiteralParameter( "forbiddenBegin", forbidNode -> getChildAt(0)->getValue());
+ of.writeOUStringLiteralParameter( "forbiddenEnd", forbidNode -> getChildAt(1)->getValue());
+ of.writeOUStringLiteralParameter( "hangingChars", forbidNode -> getChildAt(2)->getValue());
} else {
- of.writeParameter( "forbiddenBegin", std::u16string_view());
- of.writeParameter( "forbiddenEnd", std::u16string_view());
- of.writeParameter( "hangingChars", std::u16string_view());
+ of.writeOUStringLiteralParameter( "forbiddenBegin", std::u16string_view());
+ of.writeOUStringLiteralParameter( "forbiddenEnd", std::u16string_view());
+ of.writeOUStringLiteralParameter( "hangingChars", std::u16string_view());
}
- of.writeAsciiString("\nstatic const sal_Unicode* LCForbiddenCharactersArray[] = {\n");
+ of.writeAsciiString("\nstatic constexpr rtl::OUStringConstExpr LCForbiddenCharactersArray[] = {\n");
of.writeAsciiString("\tforbiddenBegin,\n");
of.writeAsciiString("\tforbiddenEnd,\n");
of.writeAsciiString("\thangingChars\n");
of.writeAsciiString("};\n\n");
- of.writeFunction("getForbiddenCharacters_", "3", "LCForbiddenCharactersArray");
+ of.writeOUStringFunction("getForbiddenCharacters_", "3", "LCForbiddenCharactersArray");
if (breakNode) {
- of.writeParameter( "EditMode", breakNode -> getChildAt(0)->getValue());
- of.writeParameter( "DictionaryMode", breakNode -> getChildAt(1)->getValue());
- of.writeParameter( "WordCountMode", breakNode -> getChildAt(2)->getValue());
- of.writeParameter( "CharacterMode", breakNode -> getChildAt(3)->getValue());
- of.writeParameter( "LineMode", breakNode -> getChildAt(4)->getValue());
+ of.writeOUStringLiteralParameter( "EditMode", breakNode -> getChildAt(0)->getValue());
+ of.writeOUStringLiteralParameter( "DictionaryMode", breakNode -> getChildAt(1)->getValue());
+ of.writeOUStringLiteralParameter( "WordCountMode", breakNode -> getChildAt(2)->getValue());
+ of.writeOUStringLiteralParameter( "CharacterMode", breakNode -> getChildAt(3)->getValue());
+ of.writeOUStringLiteralParameter( "LineMode", breakNode -> getChildAt(4)->getValue());
} else {
- of.writeParameter( "EditMode", std::u16string_view());
- of.writeParameter( "DictionaryMode", std::u16string_view());
- of.writeParameter( "WordCountMode", std::u16string_view());
- of.writeParameter( "CharacterMode", std::u16string_view());
- of.writeParameter( "LineMode", std::u16string_view());
+ of.writeOUStringLiteralParameter( "EditMode", std::u16string_view());
+ of.writeOUStringLiteralParameter( "DictionaryMode", std::u16string_view());
+ of.writeOUStringLiteralParameter( "WordCountMode", std::u16string_view());
+ of.writeOUStringLiteralParameter( "CharacterMode", std::u16string_view());
+ of.writeOUStringLiteralParameter( "LineMode", std::u16string_view());
}
- of.writeAsciiString("\nstatic const sal_Unicode* LCBreakIteratorRulesArray[] = {\n");
+ of.writeAsciiString("\nstatic constexpr rtl::OUStringConstExpr LCBreakIteratorRulesArray[] = {\n");
of.writeAsciiString("\tEditMode,\n");
of.writeAsciiString("\tDictionaryMode,\n");
of.writeAsciiString("\tWordCountMode,\n");
of.writeAsciiString("\tCharacterMode,\n");
of.writeAsciiString("\tLineMode\n");
of.writeAsciiString("};\n\n");
- of.writeFunction("getBreakIteratorRules_", "5", "LCBreakIteratorRulesArray");
+ of.writeOUStringFunction("getBreakIteratorRules_", "5", "LCBreakIteratorRulesArray");
}
diff --git a/i18npool/source/localedata/localedata.cxx b/i18npool/source/localedata/localedata.cxx
index 5b6c0c214bbb..7316b66fce7f 100644
--- a/i18npool/source/localedata/localedata.cxx
+++ b/i18npool/source/localedata/localedata.cxx
@@ -1105,19 +1105,12 @@ LocaleDataImpl::getFollowPageWords( const Locale& rLocale )
Sequence< OUString > SAL_CALL
LocaleDataImpl::getTransliterations( const Locale& rLocale )
{
- MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getTransliterations" ));
+ MyFuncOUString_Type func = reinterpret_cast<MyFuncOUString_Type>(getFunctionSymbol( rLocale, "getTransliterations" ));
if ( func ) {
sal_Int16 transliterationsCount = 0;
- sal_Unicode **transliterationsArray = func(transliterationsCount);
-
- Sequence< OUString > seq(transliterationsCount);
- auto seqRange = asNonConstRange(seq);
- for(int i = 0; i < transliterationsCount; i++) {
- OUString elem(transliterationsArray[i]);
- seqRange[i] = elem;
- }
- return seq;
+ const OUString *transliterationsArray = func(transliterationsCount);
+ return Sequence< OUString >(transliterationsArray, transliterationsCount);
}
else {
return {};
@@ -1153,13 +1146,14 @@ LocaleDataImpl::getLanguageCountryInfo( const Locale& rLocale )
ForbiddenCharacters SAL_CALL
LocaleDataImpl::getForbiddenCharacters( const Locale& rLocale )
{
- MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getForbiddenCharacters" ));
+ MyFuncOUString_Type func = reinterpret_cast<MyFuncOUString_Type>(getFunctionSymbol( rLocale, "getForbiddenCharacters" ));
if ( func ) {
sal_Int16 LCForbiddenCharactersCount = 0;
- sal_Unicode **LCForbiddenCharactersArray = func(LCForbiddenCharactersCount);
+ OUString const *LCForbiddenCharactersArray = func(LCForbiddenCharactersCount);
+ assert(LCForbiddenCharactersCount == 3);
ForbiddenCharacters chars{
- OUString(LCForbiddenCharactersArray[0]), OUString(LCForbiddenCharactersArray[1])};
+ LCForbiddenCharactersArray[0], LCForbiddenCharactersArray[1]};
return chars;
}
else {
@@ -1171,12 +1165,13 @@ LocaleDataImpl::getForbiddenCharacters( const Locale& rLocale )
OUString
LocaleDataImpl::getHangingCharacters( const Locale& rLocale )
{
- MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getForbiddenCharacters" ));
+ MyFuncOUString_Type func = reinterpret_cast<MyFuncOUString_Type>(getFunctionSymbol( rLocale, "getForbiddenCharacters" ));
if ( func ) {
sal_Int16 LCForbiddenCharactersCount = 0;
- sal_Unicode **LCForbiddenCharactersArray = func(LCForbiddenCharactersCount);
- return OUString(LCForbiddenCharactersArray[2]);
+ const OUString *LCForbiddenCharactersArray = func(LCForbiddenCharactersCount);
+ assert(LCForbiddenCharactersCount == 3);
+ return LCForbiddenCharactersArray[2];
}
return OUString();
@@ -1185,18 +1180,12 @@ LocaleDataImpl::getHangingCharacters( const Locale& rLocale )
Sequence< OUString >
LocaleDataImpl::getBreakIteratorRules( const Locale& rLocale )
{
- MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getBreakIteratorRules" ));
+ MyFuncOUString_Type func = reinterpret_cast<MyFuncOUString_Type>(getFunctionSymbol( rLocale, "getBreakIteratorRules" ));
if ( func ) {
sal_Int16 LCBreakIteratorRuleCount = 0;
- sal_Unicode **LCBreakIteratorRulesArray = func(LCBreakIteratorRuleCount);
- Sequence< OUString > seq(LCBreakIteratorRuleCount);
- auto seqRange = asNonConstRange(seq);
- for(int i = 0; i < LCBreakIteratorRuleCount; i++) {
- OUString elem(LCBreakIteratorRulesArray[i]);
- seqRange[i] = elem;
- }
- return seq;
+ OUString const *LCBreakIteratorRulesArray = func(LCBreakIteratorRuleCount);
+ return Sequence< OUString >(LCBreakIteratorRulesArray, LCBreakIteratorRuleCount);
}
else {
return {};
@@ -1207,18 +1196,12 @@ LocaleDataImpl::getBreakIteratorRules( const Locale& rLocale )
Sequence< OUString > SAL_CALL
LocaleDataImpl::getReservedWord( const Locale& rLocale )
{
- MyFunc_Type func = reinterpret_cast<MyFunc_Type>(getFunctionSymbol( rLocale, "getReservedWords" ));
+ MyFuncOUString_Type func = reinterpret_cast<MyFuncOUString_Type>(getFunctionSymbol( rLocale, "getReservedWords" ));
if ( func ) {
sal_Int16 LCReservedWordsCount = 0;
- sal_Unicode **LCReservedWordsArray = func(LCReservedWordsCount);
- Sequence< OUString > seq(LCReservedWordsCount);
- auto seqRange = asNonConstRange(seq);
- for(int i = 0; i < LCReservedWordsCount; i++) {
- OUString elem(LCReservedWordsArray[i]);
- seqRange[i] = elem;
- }
- return seq;
+ OUString const *LCReservedWordsArray = func(LCReservedWordsCount);
+ return Sequence< OUString >(LCReservedWordsArray, LCReservedWordsCount);
}
else {
return {};