sc/source/core/inc/interpre.hxx  |   14 +++++++-------
 sc/source/core/tool/interpr1.cxx |    9 ++++-----
 sc/source/core/tool/interpr2.cxx |    4 +---
 sc/source/core/tool/interpr5.cxx |    2 +-
 sc/source/core/tool/interpr8.cxx |   18 +++++++++---------
 5 files changed, 22 insertions(+), 25 deletions(-)

New commits:
commit 1c635de6ed48dec4566341c174351432ddab757d
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Sun Feb 6 18:48:44 2022 +0100
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Sun Feb 6 21:06:55 2022 +0100

    Avoid excessive reallocations
    
    Change-Id: I68ff7021c26dd2148f85506fd0c67e233753c63a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129558
    Tested-by: Mike Kaganski <mike.kagan...@collabora.com>
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 322b2e32d5a0..2e90271af4c0 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -481,11 +481,11 @@ private:
 
     // Check for String overflow of rResult+rAdd and set error and erase 
rResult
     // if so. Return true if ok, false if overflow
-    inline bool CheckStringResultLen( OUString& rResult, const OUString& rAdd 
);
+    inline bool CheckStringResultLen( OUString& rResult, sal_Int32 nIncrease );
 
     // Check for String overflow of rResult+rAdd and set error and erase 
rResult
     // if so. Return true if ok, false if overflow
-    inline bool CheckStringResultLen( OUStringBuffer& rResult, const OUString& 
rAdd );
+    inline bool CheckStringResultLen( OUStringBuffer& rResult, sal_Int32 
nIncrease );
 
     // Set error according to rVal, and set rVal to 0.0 if there was an error.
     inline void TreatDoubleError( double& rVal );
@@ -1113,9 +1113,9 @@ inline sal_Int32 
ScInterpreter::GetStringPositionArgument()
     return static_cast<sal_Int32>(fVal);
 }
 
-inline bool ScInterpreter::CheckStringResultLen( OUString& rResult, const 
OUString& rAdd )
+inline bool ScInterpreter::CheckStringResultLen( OUString& rResult, sal_Int32 
nIncrease )
 {
-    if (rAdd.getLength() > kScInterpreterMaxStrLen - rResult.getLength())
+    if (nIncrease > kScInterpreterMaxStrLen - rResult.getLength())
     {
         SetError( FormulaError::StringOverflow );
         rResult.clear();
@@ -1124,12 +1124,12 @@ inline bool ScInterpreter::CheckStringResultLen( 
OUString& rResult, const OUStri
     return true;
 }
 
-inline bool ScInterpreter::CheckStringResultLen( OUStringBuffer& rResult, 
const OUString& rAdd )
+inline bool ScInterpreter::CheckStringResultLen( OUStringBuffer& rResult, 
sal_Int32 nIncrease )
 {
-    if (rAdd.getLength() > kScInterpreterMaxStrLen - rResult.getLength())
+    if (nIncrease > kScInterpreterMaxStrLen - rResult.getLength())
     {
         SetError( FormulaError::StringOverflow );
-        rResult = OUStringBuffer();
+        rResult.setLength(0);
         return false;
     }
     return true;
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 450b70f264b9..983f2aca8020 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -8865,9 +8865,8 @@ void ScInterpreter::ScReplace()
             aOldStr.iterateCodePoints( &nIdx );
             ++nCnt;
         }
-        aOldStr = aOldStr.replaceAt( nStart, nIdx - nStart, u"" );
-        if ( CheckStringResultLen( aOldStr, aNewStr ) )
-            aOldStr = aOldStr.replaceAt( nStart, 0, aNewStr );
+        if ( CheckStringResultLen( aOldStr, aNewStr.getLength() - (nIdx - 
nStart) ) )
+            aOldStr = aOldStr.replaceAt( nStart, nIdx - nStart, aNewStr );
         PushString( aOldStr );
     }
 }
@@ -9704,7 +9703,7 @@ void ScInterpreter::ScSubstitute()
                 oResult.emplace(sStr.getLength() + sNewStr.getLength() - 
sOldStr.getLength());
 
             oResult->append(sStr.subView(nPos, nEnd - nPos)); // Copy leading 
unchanged text
-            if (!CheckStringResultLen(*oResult, sNewStr))
+            if (!CheckStringResultLen(*oResult, sNewStr.getLength()))
                 return PushError(GetError());
             oResult->append(sNewStr); // Copy  the replacement
             nPos = nEnd + sOldStr.getLength();
@@ -9750,7 +9749,7 @@ void ScInterpreter::ScConcat()
     while( nParamCount-- > 0)
     {
         OUString aStr = GetString().getString();
-        if (CheckStringResultLen( aRes, aStr))
+        if (CheckStringResultLen(aRes, aStr.getLength()))
             aRes = aStr + aRes;
         else
             break;
diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index 6525f2a6784b..fda54fcf898f 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -3033,10 +3033,8 @@ void ScInterpreter::ScRoman()
                 sal_Int32 nPad = nDigit % 5;
                 if (nPad)
                 {
-                    OUStringBuffer aBuf(aRoman);
-                    comphelper::string::padToLength(aBuf, aBuf.getLength() + 
nPad,
+                    comphelper::string::padToLength(aRoman, aRoman.getLength() 
+ nPad,
                         pChars[nIndex]);
-                    aRoman = aBuf.makeStringAndClear();
                 }
                 nVal %= pValues[ nIndex ];
             }
diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx
index f29fd1eaf941..fc192bfbdbd9 100644
--- a/sc/source/core/tool/interpr5.cxx
+++ b/sc/source/core/tool/interpr5.cxx
@@ -1489,7 +1489,7 @@ void ScInterpreter::ScAmpersand()
     }
     else
     {
-        if ( CheckStringResultLen( sStr1, sStr2 ) )
+        if ( CheckStringResultLen( sStr1, sStr2.getLength() ) )
             sStr1 += sStr2;
         PushString(sStr1);
     }
diff --git a/sc/source/core/tool/interpr8.cxx b/sc/source/core/tool/interpr8.cxx
index a24b2b949a50..124205e46aaa 100644
--- a/sc/source/core/tool/interpr8.cxx
+++ b/sc/source/core/tool/interpr8.cxx
@@ -1396,7 +1396,7 @@ void ScInterpreter::ScConcat_MS()
             case svDouble:
                 {
                     const OUString& rStr = GetString().getString();
-                    if (CheckStringResultLen( aResBuf, rStr))
+                    if (CheckStringResultLen(aResBuf, rStr.getLength()))
                         aResBuf.append( rStr);
                 }
                 break;
@@ -1412,7 +1412,7 @@ void ScInterpreter::ScConcat_MS()
                     svl::SharedString aSS;
                     GetCellString( aSS, aCell);
                     const OUString& rStr = aSS.getString();
-                    if (CheckStringResultLen( aResBuf, rStr))
+                    if (CheckStringResultLen(aResBuf, rStr.getLength()))
                         aResBuf.append( rStr);
                 }
             }
@@ -1452,7 +1452,7 @@ void ScInterpreter::ScConcat_MS()
                             svl::SharedString aSS;
                             GetCellString( aSS, aCell);
                             const OUString& rStr = aSS.getString();
-                            if (CheckStringResultLen( aResBuf, rStr))
+                            if (CheckStringResultLen(aResBuf, 
rStr.getLength()))
                                 aResBuf.append( rStr);
                         }
                     }
@@ -1479,7 +1479,7 @@ void ScInterpreter::ScConcat_MS()
                                 if ( pMat->IsStringOrEmpty( j, k ) )
                                 {
                                     const OUString& rStr = pMat->GetString( j, 
k ).getString();
-                                    if (CheckStringResultLen( aResBuf, rStr))
+                                    if (CheckStringResultLen(aResBuf, 
rStr.getLength()))
                                         aResBuf.append( rStr);
                                 }
                                 else
@@ -1487,7 +1487,7 @@ void ScInterpreter::ScConcat_MS()
                                     if ( pMat->IsValue( j, k ) )
                                     {
                                         const OUString& rStr = 
pMat->GetString( *pFormatter, j, k ).getString();
-                                        if (CheckStringResultLen( aResBuf, 
rStr))
+                                        if (CheckStringResultLen(aResBuf, 
rStr.getLength()))
                                             aResBuf.append( rStr);
                                     }
                                 }
@@ -1658,7 +1658,7 @@ void ScInterpreter::ScTextJoin_MS()
                     }
                     else
                         bFirst = false;
-                    if (CheckStringResultLen( aResBuf, aStr))
+                    if (CheckStringResultLen(aResBuf, aStr.getLength()))
                         aResBuf.append( aStr );
                 }
             }
@@ -1690,7 +1690,7 @@ void ScInterpreter::ScTextJoin_MS()
                     }
                     else
                         bFirst = false;
-                    if (CheckStringResultLen( aResBuf, aStr))
+                    if (CheckStringResultLen(aResBuf, aStr.getLength()))
                         aResBuf.append( aStr );
                 }
             }
@@ -1747,7 +1747,7 @@ void ScInterpreter::ScTextJoin_MS()
                             }
                             else
                                 bFirst = false;
-                            if (CheckStringResultLen( aResBuf, aStr))
+                            if (CheckStringResultLen(aResBuf, 
aStr.getLength()))
                                 aResBuf.append( aStr );
                         }
                     }
@@ -1796,7 +1796,7 @@ void ScInterpreter::ScTextJoin_MS()
                                     }
                                     else
                                         bFirst = false;
-                                    if (CheckStringResultLen( aResBuf, aStr))
+                                    if (CheckStringResultLen(aResBuf, 
aStr.getLength()))
                                         aResBuf.append( aStr );
                                 }
                             }

Reply via email to