i18npool/source/transliteration/transliteration_body.cxx | 18 +++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
New commits: commit 636a22ffd7769c5f31844e66579c78928434df81 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Wed Jun 15 11:28:14 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Wed Jun 15 19:37:53 2022 +0200 use stack buffer in transliterateImpl Change-Id: I7c3e24f3974dafeb9abb2af9e2a986003af7bfc1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135873 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/i18npool/source/transliteration/transliteration_body.cxx b/i18npool/source/transliteration/transliteration_body.cxx index 605a3bb64284..69ba0c236714 100644 --- a/i18npool/source/transliteration/transliteration_body.cxx +++ b/i18npool/source/transliteration/transliteration_body.cxx @@ -121,8 +121,17 @@ Transliteration_body::transliterateImpl( // Yes, on massive use even such small things do count. if ( pOffset ) { - std::vector<sal_Int32> aVec; - aVec.reserve(std::max<sal_Int32>(nLocalBuf, nCount) * NMAPPINGMAX); + sal_Int32* offsetData; + std::unique_ptr<sal_Int32[]> pOffsetHeapBuf; + sal_Int32 nOffsetCount = std::max<sal_Int32>(nLocalBuf, nCount); + if (nOffsetCount <= nLocalBuf) + offsetData = static_cast<sal_Int32*>(alloca(nOffsetCount * NMAPPINGMAX * sizeof(sal_Int32))); + else + { + pOffsetHeapBuf.reset(new sal_Int32[ nOffsetCount * NMAPPINGMAX ]); + offsetData = pOffsetHeapBuf.get(); + } + sal_Int32* offsetDataEnd = offsetData; for (sal_Int32 i = 0; i < nCount; i++) { @@ -130,12 +139,13 @@ Transliteration_body::transliterateImpl( MappingType nTmpMappingType = lcl_getMappingTypeForToggleCase( nMappingType, in[i] ); const i18nutil::Mapping &map = i18nutil::casefolding::getValue( in, i, nCount, aLocale, nTmpMappingType ); - std::fill_n(std::back_inserter(aVec), map.nmap, i + startPos); + std::fill_n(offsetDataEnd, map.nmap, i + startPos); + offsetDataEnd += map.nmap; std::copy_n(map.map, map.nmap, out + j); j += map.nmap; } - *pOffset = comphelper::containerToSequence(aVec); + *pOffset = css::uno::Sequence< sal_Int32 >(offsetData, offsetDataEnd - offsetData); } else {