[Libreoffice-commits] core.git: Branch 'private/kohei/calc-shared-string' - sc/inc sc/source

Kohei Yoshida kohei.yoshida at collabora.com
Wed Oct 9 19:11:14 PDT 2013


 sc/inc/externalrefmgr.hxx                |   13 ++++--
 sc/source/core/data/column2.cxx          |   14 +++---
 sc/source/core/data/validat.cxx          |    2 
 sc/source/core/inc/interpre.hxx          |    7 +++
 sc/source/core/tool/ddelink.cxx          |    5 +-
 sc/source/core/tool/interpr1.cxx         |   36 ++++++++--------
 sc/source/core/tool/interpr2.cxx         |    7 +--
 sc/source/core/tool/interpr4.cxx         |    4 +
 sc/source/core/tool/interpr5.cxx         |   67 +++++++++++++++----------------
 sc/source/filter/excel/excform.cxx       |    5 +-
 sc/source/filter/excel/xihelper.cxx      |    6 +-
 sc/source/filter/excel/xilink.cxx        |   19 ++++++--
 sc/source/filter/inc/xihelper.hxx        |    8 +++
 sc/source/filter/inc/xilink.hxx          |   14 ++++--
 sc/source/ui/docshell/externalrefmgr.cxx |   22 +++++-----
 15 files changed, 135 insertions(+), 94 deletions(-)

New commits:
commit 77528d0735971abbb40e31e9d41371fe618ee9dd
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Wed Oct 9 22:12:12 2013 -0400

    Properly intern strings going into matrix objects.
    
    Change-Id: Ieb8befa4f19ebc31f4afa1370c924b469aa77382

diff --git a/sc/inc/externalrefmgr.hxx b/sc/inc/externalrefmgr.hxx
index 9852b60..df794bd 100644
--- a/sc/inc/externalrefmgr.hxx
+++ b/sc/inc/externalrefmgr.hxx
@@ -49,6 +49,12 @@ class ScFormulaCell;
 
 class ScExternalRefCache;
 
+namespace svl {
+
+class SharedStringPool;
+
+}
+
 class ScExternalRefLink : public ::sfx2::SvBaseLink
 {
 public:
@@ -195,7 +201,7 @@ public:
     typedef ::boost::unordered_map< OUString, size_t, OUStringHash>
         TableNameIndexMap;
 
-    ScExternalRefCache();
+    ScExternalRefCache(svl::SharedStringPool& rPool);
     ~ScExternalRefCache();
 
     const OUString* getRealTableName(sal_uInt16 nFileId, const OUString& rTabName) const;
@@ -334,6 +340,7 @@ private:
     DocItem* getDocItem(sal_uInt16 nFileId) const;
 
 private:
+    svl::SharedStringPool& mrStrPool;;
     mutable DocDataType maDocs;
 };
 
@@ -756,11 +763,11 @@ private:
 
 
 private:
+    ScDocument* mpDoc;
+
     /** cache of referenced ranges and names from source documents. */
     ScExternalRefCache maRefCache;
 
-    ScDocument* mpDoc;
-
     /**
      * Source document cache.  This stores the original source document shell
      * instances.  They get purged after a certain period of time.
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 3af1cf9..62cd538 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -1876,10 +1876,12 @@ class ToMatrixHandler
     ScMatrix& mrMat;
     SCCOL mnMatCol;
     SCROW mnTopRow;
-    const ScDocument* mpDoc;
+    ScDocument* mpDoc;
+    svl::SharedStringPool& mrStrPool;
 public:
-    ToMatrixHandler(ScMatrix& rMat, SCCOL nMatCol, SCROW nTopRow, const ScDocument* pDoc) :
-        mrMat(rMat), mnMatCol(nMatCol), mnTopRow(nTopRow), mpDoc(pDoc) {}
+    ToMatrixHandler(ScMatrix& rMat, SCCOL nMatCol, SCROW nTopRow, ScDocument* pDoc) :
+        mrMat(rMat), mnMatCol(nMatCol), mnTopRow(nTopRow),
+        mpDoc(pDoc), mrStrPool(pDoc->GetSharedStringPool()) {}
 
     void operator() (size_t nRow, double fVal)
     {
@@ -1893,17 +1895,17 @@ public:
         if (rCell.IsValue())
             mrMat.PutDouble(rCell.GetValue(), mnMatCol, nRow - mnTopRow);
         else
-            mrMat.PutString(rCell.GetString(), mnMatCol, nRow - mnTopRow);
+            mrMat.PutString(mrStrPool.intern(rCell.GetString()), mnMatCol, nRow - mnTopRow);
     }
 
     void operator() (size_t nRow, const svl::SharedString& rSS)
     {
-        mrMat.PutString(rSS.getString(), mnMatCol, nRow - mnTopRow);
+        mrMat.PutString(rSS, mnMatCol, nRow - mnTopRow);
     }
 
     void operator() (size_t nRow, const EditTextObject* pStr)
     {
-        mrMat.PutString(ScEditUtil::GetString(*pStr, mpDoc), mnMatCol, nRow - mnTopRow);
+        mrMat.PutString(mrStrPool.intern(ScEditUtil::GetString(*pStr, mpDoc)), mnMatCol, nRow - mnTopRow);
     }
 };
 
diff --git a/sc/source/core/data/validat.cxx b/sc/source/core/data/validat.cxx
index c27b25c..9c24d96 100644
--- a/sc/source/core/data/validat.cxx
+++ b/sc/source/core/data/validat.cxx
@@ -661,7 +661,7 @@ bool ScValidationData::GetSelectionFromFormula(
         else
         {
             OUString aStr = aValidationSrc.GetString();
-            xMatRef->PutString( aStr, 0);
+            xMatRef->PutString(pDocument->GetSharedStringPool().intern(aStr), 0);
         }
 
         pValues = xMatRef.get();
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 1935c3b..975ba25 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -57,6 +57,12 @@ struct RangeMatrix;
 
 }
 
+namespace svl {
+
+class SharedStringPool;
+
+}
+
 #define MAXSTACK      (4096 / sizeof(formula::FormulaToken*))
 
 class ScTokenStack
@@ -145,6 +151,7 @@ private:
     ScAddress   aPos;
     ScTokenArray& rArr;
     ScDocument* pDok;
+    svl::SharedStringPool& mrStrPool;
     formula::FormulaTokenRef  xResult;
     ScJumpMatrix*   pJumpMatrix;        // currently active array condition, if any
     ScTokenMatrixMap* pTokenMatrixMap;  // map ScToken* to formula::FormulaTokenRef if in array condition
diff --git a/sc/source/core/tool/ddelink.cxx b/sc/source/core/tool/ddelink.cxx
index 7437537..e8ecfbd 100644
--- a/sc/source/core/tool/ddelink.cxx
+++ b/sc/source/core/tool/ddelink.cxx
@@ -21,7 +21,7 @@
 #include <sfx2/linkmgr.hxx>
 #include <sfx2/bindings.hxx>
 #include <svl/zforlist.hxx>
-#include "svl/sharedstring.hxx"
+#include "svl/sharedstringpool.hxx"
 
 #include "ddelink.hxx"
 #include "brdcst.hxx"
@@ -158,6 +158,7 @@ sfx2::SvBaseLink::UpdateResult ScDdeLink::DataChanged(
         pResult = new ScMatrix(nCols, nRows, 0.0);
 
         SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
+        svl::SharedStringPool& rPool = pDoc->GetSharedStringPool();
 
         //  nMode bestimmt, wie der Text interpretiert wird (#44455#/#49783#):
         //  SC_DDE_DEFAULT - Zahlformat aus Zellvorlage "Standard"
@@ -188,7 +189,7 @@ sfx2::SvBaseLink::UpdateResult ScDdeLink::DataChanged(
                     // empty cell
                     pResult->PutEmpty(nC, nR);
                 else
-                    pResult->PutString(svl::SharedString(aEntry), nC, nR);
+                    pResult->PutString(rPool.intern(aEntry), nC, nR);
             }
         }
     }
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index 314c2ca..520ef1f 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -248,7 +248,8 @@ void ScInterpreter::ScIfJump()
 /** Store a matrix value in another matrix in the context of that other matrix
     is the result matrix of a jump matrix. All arguments must be valid and are
     not checked. */
-static void lcl_storeJumpMatResult( const ScMatrix* pMat, ScMatrix* pResMat, SCSIZE nC, SCSIZE nR )
+static void lcl_storeJumpMatResult(
+    svl::SharedStringPool& rPool, const ScMatrix* pMat, ScMatrix* pResMat, SCSIZE nC, SCSIZE nR )
 {
     if ( pMat->IsValue( nC, nR ) )
     {
@@ -262,7 +263,7 @@ static void lcl_storeJumpMatResult( const ScMatrix* pMat, ScMatrix* pResMat, SCS
     else
     {
         const OUString& rStr = pMat->GetString(nC, nR);
-        pResMat->PutString(svl::SharedString(rStr), nC, nR);
+        pResMat->PutString(rPool.intern(rStr), nC, nR);
     }
 }
 
@@ -379,7 +380,7 @@ void ScInterpreter::ScIfError( bool bNAonly )
                     {
                         for ( ; nR < nRows && (nC != nErrorCol || nR != nErrorRow); ++nR)
                         {
-                            lcl_storeJumpMatResult( pMatPtr, pResMatPtr, nC, nR);
+                            lcl_storeJumpMatResult(mrStrPool, pMatPtr, pResMatPtr, nC, nR);
                         }
                         if (nC != nErrorCol || nR != nErrorRow)
                             ++nC;
@@ -396,7 +397,7 @@ void ScInterpreter::ScIfError( bool bNAonly )
                             }
                             else
                             {   // FALSE, EMPTY path, store result instead
-                                lcl_storeJumpMatResult( pMatPtr, pResMatPtr, nC, nR);
+                                lcl_storeJumpMatResult(mrStrPool, pMatPtr, pResMatPtr, nC, nR);
                             }
                         }
                     }
@@ -600,7 +601,7 @@ bool ScInterpreter::JumpMatrix( short nStackLevel )
                         nGlobalError = 0;
                     }
                     else
-                        pResMat->PutString( rStr, nC, nR );
+                        pResMat->PutString(mrStrPool.intern(rStr), nC, nR);
                 }
                 break;
                 case svSingleRef:
@@ -641,7 +642,7 @@ bool ScInterpreter::JumpMatrix( short nStackLevel )
                                 nGlobalError = 0;
                             }
                             else
-                                pResMat->PutString( aStr, nC, nR);
+                                pResMat->PutString(mrStrPool.intern(aStr), nC, nR);
                         }
                     }
                 }
@@ -709,7 +710,7 @@ bool ScInterpreter::JumpMatrix( short nStackLevel )
                                     nGlobalError = 0;
                                 }
                                 else
-                                    pResMat->PutString( aStr, nC, nR );
+                                    pResMat->PutString(mrStrPool.intern(aStr), nC, nR);
                             }
                           }
                         SCSIZE nParmCols = aRange.aEnd.Col() - aRange.aStart.Col() + 1;
@@ -745,7 +746,7 @@ bool ScInterpreter::JumpMatrix( short nStackLevel )
                         }
                         else
                         {
-                            lcl_storeJumpMatResult( pMat.get(), pResMat.get(), nC, nR);
+                            lcl_storeJumpMatResult(mrStrPool, pMat.get(), pResMat.get(), nC, nR);
                         }
                         lcl_AdjustJumpMatrix( pJumpMatrix, pResMat, nCols, nRows );
                     }
@@ -1181,7 +1182,7 @@ sc::RangeMatrix ScInterpreter::CompareMat( ScCompareOptions* pOptions )
                         aRes.mpMat->PutDouble(CompareFunc(aComp, pOptions), j, k);
                     }
                     else
-                        aRes.mpMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), j, k);
+                        aRes.mpMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), j, k);
                 }
             }
         }
@@ -1721,7 +1722,7 @@ void ScInterpreter::ScNeg()
                                 pResMat->PutDouble( -pMat->GetDouble(i,j), i, j );
                             else
                                 pResMat->PutString(
-                                    ScGlobal::GetRscString( STR_NO_VALUE ), i, j );
+                                    mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i, j);
                         }
                     }
                     PushMatrix( pResMat );
@@ -1777,7 +1778,7 @@ void ScInterpreter::ScNot()
                                 pResMat->PutDouble( (pMat->GetDouble(i,j) == 0.0), i, j );
                             else
                                 pResMat->PutString(
-                                    ScGlobal::GetRscString( STR_NO_VALUE ), i, j );
+                                    mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i, j);
                         }
                     }
                     PushMatrix( pResMat );
@@ -4899,7 +4900,7 @@ double ScInterpreter::IterateParametersIf( ScIterFuncIf eFunc )
                     if (pToken->GetType() == svDouble)
                         pSumExtraMatrix->PutDouble(pToken->GetDouble(), 0, 0);
                     else
-                        pSumExtraMatrix->PutString(pToken->GetString(), 0, 0);
+                        pSumExtraMatrix->PutString(mrStrPool.intern(pToken->GetString()), 0, 0);
                 }
                 break;
             case svExternalDoubleRef:
@@ -6151,7 +6152,7 @@ void ScInterpreter::ScLookup()
                 if (pDataMat->IsValue(0, i))
                     pTempMat->PutDouble(pDataMat->GetDouble(0, i), 0, i);
                 else
-                    pTempMat->PutString(pDataMat->GetString(0, i), 0, i);
+                    pTempMat->PutString(mrStrPool.intern(pDataMat->GetString(0, i)), 0, i);
             pDataMat2 = pTempMat;
         }
         else
@@ -6161,7 +6162,7 @@ void ScInterpreter::ScLookup()
                 if (pDataMat->IsValue(i, 0))
                     pTempMat->PutDouble(pDataMat->GetDouble(i, 0), i, 0);
                 else
-                    pTempMat->PutString(pDataMat->GetString(i, 0), i, 0);
+                    pTempMat->PutString(mrStrPool.intern(pDataMat->GetString(i, 0)), i, 0);
             pDataMat2 = pTempMat;
         }
 
@@ -7630,8 +7631,8 @@ void ScInterpreter::ScIndex()
                                         pResMat->PutDouble(pMat->GetDouble(i,
                                                     nRowMinus1), i, 0);
                                     else
-                                        pResMat->PutString(pMat->GetString(i,
-                                                    nRowMinus1), i, 0);
+                                        pResMat->PutString(
+                                            mrStrPool.intern(pMat->GetString(i, nRowMinus1)), i, 0);
                                 PushMatrix(pResMat);
                             }
                             else
@@ -7648,8 +7649,7 @@ void ScInterpreter::ScIndex()
                                         pResMat->PutDouble(pMat->GetDouble(nColMinus1,
                                                     i), i);
                                     else
-                                        pResMat->PutString(pMat->GetString(nColMinus1,
-                                                    i), i);
+                                        pResMat->PutString(mrStrPool.intern(pMat->GetString(nColMinus1, i)), i);
                                 PushMatrix(pResMat);
                             }
                             else
diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx
index a915394..3797c42 100644
--- a/sc/source/core/tool/interpr2.cxx
+++ b/sc/source/core/tool/interpr2.cxx
@@ -25,6 +25,7 @@
 #include <sfx2/objsh.hxx>
 #include <svl/stritem.hxx>
 #include <svl/zforlist.hxx>
+#include "svl/sharedstringpool.hxx"
 #include <sal/macros.h>
 
 #include "attrib.hxx"
@@ -2515,13 +2516,13 @@ void ScInterpreter::ScHyperLink()
             if (ScMatrix::IsValueType( nResultType))
                 pResMat->PutDouble( fVal, 0);
             else if (ScMatrix::IsRealStringType( nResultType))
-                pResMat->PutString( aStr, 0);
+                pResMat->PutString(mrStrPool.intern(aStr), 0);
             else    // EmptyType, EmptyPathType, mimic xcl
                 pResMat->PutDouble( 0.0, 0 );
         }
         else
-            pResMat->PutString(svl::SharedString(aUrl), 0);
-        pResMat->PutString(svl::SharedString(aUrl), 1);
+            pResMat->PutString(mrStrPool.intern(aUrl), 0);
+        pResMat->PutString(mrStrPool.intern(aUrl), 1);
         bMatrixFormula = true;
         PushMatrix(pResMat);
     }
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 8a6652dd..7aadff1 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -31,6 +31,7 @@
 #include <basic/sbxobj.hxx>
 #include <basic/sbuno.hxx>
 #include <svl/zforlist.hxx>
+#include "svl/sharedstringpool.hxx"
 #include <stdlib.h>
 #include <string.h>
 #include <signal.h>
@@ -3377,7 +3378,7 @@ void ScInterpreter::ScMacro()
                             }
                             else
                             {
-                                pMat->PutString( pV->GetOUString(), i, j );
+                                pMat->PutString(mrStrPool.intern(pV->GetOUString()), i, j);
                             }
                         }
                     }
@@ -3688,6 +3689,7 @@ ScInterpreter::ScInterpreter( ScFormulaCell* pCell, ScDocument* pDoc,
     aPos( rPos ),
     rArr( r ),
     pDok( pDoc ),
+    mrStrPool(pDoc->GetSharedStringPool()),
     pTokenMatrixMap( NULL ),
     pMyFormulaCell( pCell ),
     pFormatter( pDoc->GetFormatTable() ),
diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx
index 95c386c..e9cd3b3 100644
--- a/sc/source/core/tool/interpr5.cxx
+++ b/sc/source/core/tool/interpr5.cxx
@@ -401,7 +401,7 @@ ScMatrixRef ScInterpreter::GetMatrix()
                 {
                     OUString aStr;
                     GetCellString(aStr, aCell);
-                    pMat->PutString(aStr, 0);
+                    pMat->PutString(mrStrPool.intern(aStr), 0);
                 }
             }
         }
@@ -450,7 +450,7 @@ ScMatrixRef ScInterpreter::GetMatrix()
                     nGlobalError = 0;
                 }
                 else
-                    pMat->PutString(svl::SharedString(aStr), 0);
+                    pMat->PutString(mrStrPool.intern(aStr), 0);
             }
         }
         break;
@@ -472,7 +472,7 @@ ScMatrixRef ScInterpreter::GetMatrix()
             else if (pToken->GetType() == svString)
             {
                 pMat = new ScMatrix(1, 1, 0.0);
-                pMat->PutString(pToken->GetString(), 0, 0);
+                pMat->PutString(mrStrPool.intern(pToken->GetString()), 0, 0);
             }
             else
             {
@@ -1029,7 +1029,8 @@ static inline SCSIZE lcl_GetMinExtent( SCSIZE n1, SCSIZE n2 )
 
 template<class _Function>
 static ScMatrixRef lcl_MatrixCalculation(
-   const ScMatrix& rMat1, const ScMatrix& rMat2, ScInterpreter* pInterpreter)
+    svl::SharedStringPool& rPool,
+    const ScMatrix& rMat1, const ScMatrix& rMat2, ScInterpreter* pInterpreter)
 {
     static _Function Op;
 
@@ -1053,7 +1054,7 @@ static ScMatrixRef lcl_MatrixCalculation(
                     xResMat->PutDouble( d, i, j);
                 }
                 else
-                    xResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i, j);
+                    xResMat->PutString(rPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i, j);
             }
         }
     }
@@ -1085,7 +1086,7 @@ ScMatrixRef ScInterpreter::MatConcat(const ScMatrixRef& pMat1, const ScMatrixRef
                 {
                     OUString aTmp = pMat1->GetString(*pFormatter, i, j);
                     aTmp += pMat2->GetString( *pFormatter, i, j);
-                    xResMat->PutString(svl::SharedString(aTmp), i, j);
+                    xResMat->PutString(mrStrPool.intern(aTmp), i, j);
                 }
             }
         }
@@ -1181,11 +1182,11 @@ void ScInterpreter::CalculateAddSub(bool _bSub)
         ScMatrixRef pResMat;
         if ( _bSub )
         {
-            pResMat = lcl_MatrixCalculation<MatrixSub>(*pMat1, *pMat2, this);
+            pResMat = lcl_MatrixCalculation<MatrixSub>(mrStrPool, *pMat1, *pMat2, this);
         }
         else
         {
-            pResMat = lcl_MatrixCalculation<MatrixAdd>(*pMat1, *pMat2, this);
+            pResMat = lcl_MatrixCalculation<MatrixAdd>(mrStrPool, *pMat1, *pMat2, this);
         }
 
         if (!pResMat)
@@ -1222,7 +1223,7 @@ void ScInterpreter::CalculateAddSub(bool _bSub)
                     if (pMat->IsValue(i))
                         pResMat->PutDouble( _bSub ? ::rtl::math::approxSub( fVal, pMat->GetDouble(i)) : ::rtl::math::approxAdd( pMat->GetDouble(i), fVal), i);
                     else
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i);
                 } // for ( SCSIZE i = 0; i < nCount; i++ )
             } // if (bFlag || !_bSub )
             else
@@ -1231,7 +1232,7 @@ void ScInterpreter::CalculateAddSub(bool _bSub)
                 {   if (pMat->IsValue(i))
                         pResMat->PutDouble( ::rtl::math::approxSub( pMat->GetDouble(i), fVal), i);
                     else
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i);
                 } // for ( SCSIZE i = 0; i < nCount; i++ )
             }
             PushMatrix(pResMat);
@@ -1316,7 +1317,7 @@ void ScInterpreter::ScAmpersand()
                         {
                             OUString aTmp = sStr;
                             aTmp += pMat->GetString( *pFormatter, i, j);
-                            pResMat->PutString(svl::SharedString(aTmp), i, j);
+                            pResMat->PutString(mrStrPool.intern(aTmp), i, j);
                         }
                     }
             }
@@ -1332,7 +1333,7 @@ void ScInterpreter::ScAmpersand()
                         {
                             OUString aTmp = pMat->GetString(*pFormatter, i, j);
                             aTmp += sStr;
-                            pResMat->PutString(svl::SharedString(aTmp), i, j);
+                            pResMat->PutString(mrStrPool.intern(aTmp), i, j);
                         }
                     }
             }
@@ -1389,7 +1390,7 @@ void ScInterpreter::ScMul()
     }
     if (pMat1 && pMat2)
     {
-        ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixMul>(*pMat1, *pMat2, this);
+        ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixMul>(mrStrPool, *pMat1, *pMat2, this);
         if (!pResMat)
             PushNoValue();
         else
@@ -1416,7 +1417,7 @@ void ScInterpreter::ScMul()
                 if (pMat->IsValue(i))
                     pResMat->PutDouble(pMat->GetDouble(i)*fVal, i);
                 else
-                    pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i);
+                    pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i);
             PushMatrix(pResMat);
         }
         else
@@ -1462,7 +1463,7 @@ void ScInterpreter::ScDiv()
     }
     if (pMat1 && pMat2)
     {
-        ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixDiv>(*pMat1, *pMat2, this);
+        ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixDiv>(mrStrPool, *pMat1, *pMat2, this);
         if (!pResMat)
             PushNoValue();
         else
@@ -1495,14 +1496,14 @@ void ScInterpreter::ScDiv()
                     if (pMat->IsValue(i))
                         pResMat->PutDouble( div( fVal, pMat->GetDouble(i)), i);
                     else
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i);
             }
             else
             {   for ( SCSIZE i = 0; i < nCount; i++ )
                     if (pMat->IsValue(i))
                         pResMat->PutDouble( div( pMat->GetDouble(i), fVal), i);
                     else
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i);
             }
             PushMatrix(pResMat);
         }
@@ -1541,7 +1542,7 @@ void ScInterpreter::ScPow()
         fVal1 = GetDouble();
     if (pMat1 && pMat2)
     {
-        ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixPow>(*pMat1, *pMat2, this);
+        ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixPow>(mrStrPool, *pMat1, *pMat2, this);
         if (!pResMat)
             PushNoValue();
         else
@@ -1574,14 +1575,14 @@ void ScInterpreter::ScPow()
                     if (pMat->IsValue(i))
                         pResMat->PutDouble(pow(fVal,pMat->GetDouble(i)), i);
                     else
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i);
             }
             else
             {   for ( SCSIZE i = 0; i < nCount; i++ )
                     if (pMat->IsValue(i))
                         pResMat->PutDouble(pow(pMat->GetDouble(i),fVal), i);
                     else
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NO_VALUE), i);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NO_VALUE)), i);
             }
             PushMatrix(pResMat);
         }
@@ -1726,7 +1727,7 @@ void ScInterpreter::ScSumXMY2()
         PushNoValue();
         return;
     } // if (nC1 != nC2 || nR1 != nR2)
-    ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixSub>(*pMat1, *pMat2, this);
+    ScMatrixRef pResMat = lcl_MatrixCalculation<MatrixSub>(mrStrPool, *pMat1, *pMat2, this);
     if (!pResMat)
     {
         PushNoValue();
@@ -2370,9 +2371,9 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP)
     {
         for (SCSIZE i=2; i<K+1; i++)
         {
-            pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), i, 2 );
-            pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), i, 3 );
-            pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), i, 4 );
+            pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), i, 2);
+            pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), i, 3);
+            pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), i, 4);
         }
     }
 
@@ -2439,13 +2440,13 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP)
             {   // exact fit; test SSreg too, because SSresid might be
                 // unequal zero due to round of errors
                 pResMat->PutDouble(0.0, 1, 4); // SSresid
-                pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 0, 3); // F
+                pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 0, 3); // F
                 pResMat->PutDouble(0.0, 1, 2); // RMSE
                 pResMat->PutDouble(0.0, 0, 1); // SigmaSlope
                 if (bConstant)
                     pResMat->PutDouble(0.0, 1, 1); //SigmaIntercept
                 else
-                    pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 1, 1);
+                    pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 1, 1);
                 pResMat->PutDouble(1.0, 0, 2); // R^2
             }
             else
@@ -2469,7 +2470,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP)
                 }
                 else
                 {
-                    pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 1, 1);
+                    pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 1, 1);
                 }
 
                 double fR2 = fSSreg / (fSSreg + fSSresid);
@@ -2567,7 +2568,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP)
                 {   // exact fit; incl. observed values Y are identical
                     pResMat->PutDouble(0.0, 1, 4); // SSresid
                     // F = (SSreg/K) / (SSresid/df) = #DIV/0!
-                    pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 0, 3); // F
+                    pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 0, 3); // F
                     // RMSE = sqrt(SSresid / df) = sqrt(0 / df) = 0
                     pResMat->PutDouble(0.0, 1, 2); // RMSE
                     // SigmaSlope[i] = RMSE * sqrt(matrix[i,i]) = 0 * sqrt(...) = 0
@@ -2578,7 +2579,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP)
                     if (bConstant)
                         pResMat->PutDouble(0.0, K, 1); //SigmaIntercept
                     else
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), K, 1);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), K, 1);
 
                     //  R^2 = SSreg / (SSreg + SSresid) = 1.0
                     pResMat->PutDouble(1.0, 0, 2); // R^2
@@ -2629,7 +2630,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP)
                     }
                     else
                     {
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), K, 1);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), K, 1);
                     }
 
                     double fR2 = fSSreg / (fSSreg + fSSresid);
@@ -2725,7 +2726,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP)
                 {   // exact fit; incl. case observed values Y are identical
                     pResMat->PutDouble(0.0, 1, 4); // SSresid
                     // F = (SSreg/K) / (SSresid/df) = #DIV/0!
-                    pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), 0, 3); // F
+                    pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), 0, 3); // F
                     // RMSE = sqrt(SSresid / df) = sqrt(0 / df) = 0
                     pResMat->PutDouble(0.0, 1, 2); // RMSE
                     // SigmaSlope[i] = RMSE * sqrt(matrix[i,i]) = 0 * sqrt(...) = 0
@@ -2736,7 +2737,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP)
                     if (bConstant)
                         pResMat->PutDouble(0.0, K, 1); //SigmaIntercept
                     else
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), K, 1);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), K, 1);
 
                     //  R^2 = SSreg / (SSreg + SSresid) = 1.0
                     pResMat->PutDouble(1.0, 0, 2); // R^2
@@ -2787,7 +2788,7 @@ void ScInterpreter::CalulateRGPRKP(bool _bRKP)
                     }
                     else
                     {
-                        pResMat->PutString(ScGlobal::GetRscString(STR_NV_STR), K, 1);
+                        pResMat->PutString(mrStrPool.intern(ScGlobal::GetRscString(STR_NV_STR)), K, 1);
                     }
 
                     double fR2 = fSSreg / (fSSreg + fSSresid);
diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx
index 74bb546..74b0ea0 100644
--- a/sc/source/filter/excel/excform.cxx
+++ b/sc/source/filter/excel/excform.cxx
@@ -27,7 +27,7 @@
 #include "scmatrix.hxx"
 
 #include "formula/errorcodes.hxx"
-#include "svl/sharedstring.hxx"
+#include "svl/sharedstringpool.hxx"
 
 #include "imp_op.hxx"
 #include "root.hxx"
@@ -1815,6 +1815,7 @@ void ExcelToSc::ReadExtensionArray( unsigned int n, XclImpStream& aIn )
         OSL_FAIL( "ExcelToSc::ReadExtensionArray - missing matrix" );
     }
 
+    svl::SharedStringPool& rPool = GetDoc().GetSharedStringPool();
     for( nR = 0 ; nR < nRows; nR++ )
     {
         for( nC = 0 ; nC < nCols; nC++ )
@@ -1851,7 +1852,7 @@ void ExcelToSc::ReadExtensionArray( unsigned int n, XclImpStream& aIn )
                     }
                     if( NULL != pMatrix )
                     {
-                        pMatrix->PutString(svl::SharedString(aString), nC, nR);
+                        pMatrix->PutString(rPool.intern(aString), nC, nR);
                     }
                     break;
 
diff --git a/sc/source/filter/excel/xihelper.cxx b/sc/source/filter/excel/xihelper.cxx
index 6a0eb82..5e01dd4 100644
--- a/sc/source/filter/excel/xihelper.cxx
+++ b/sc/source/filter/excel/xihelper.cxx
@@ -19,7 +19,7 @@
 
 #include "xihelper.hxx"
 #include <svl/itemset.hxx>
-#include "svl/sharedstring.hxx"
+#include "svl/sharedstringpool.hxx"
 #include <editeng/editobj.hxx>
 #include <tools/urlobj.hxx>
 #include "scitems.hxx"
@@ -856,7 +856,7 @@ XclImpCachedMatrix::~XclImpCachedMatrix()
 {
 }
 
-ScMatrixRef XclImpCachedMatrix::CreateScMatrix() const
+ScMatrixRef XclImpCachedMatrix::CreateScMatrix( svl::SharedStringPool& rPool ) const
 {
     ScMatrixRef xScMatrix;
     OSL_ENSURE( mnScCols * mnScRows == maValueList.size(), "XclImpCachedMatrix::CreateScMatrix - element count mismatch" );
@@ -878,7 +878,7 @@ ScMatrixRef XclImpCachedMatrix::CreateScMatrix() const
                         xScMatrix->PutDouble( itValue->GetValue(), nScCol, nScRow );
                     break;
                     case EXC_CACHEDVAL_STRING:
-                        xScMatrix->PutString(svl::SharedString(itValue->GetString()), nScCol, nScRow);
+                        xScMatrix->PutString(rPool.intern(itValue->GetString()), nScCol, nScRow);
                     break;
                     case EXC_CACHEDVAL_BOOL:
                         xScMatrix->PutBoolean( itValue->GetBool(), nScCol, nScRow );
diff --git a/sc/source/filter/excel/xilink.cxx b/sc/source/filter/excel/xilink.cxx
index 20dc8df..3a687eb 100644
--- a/sc/source/filter/excel/xilink.cxx
+++ b/sc/source/filter/excel/xilink.cxx
@@ -29,7 +29,7 @@
 #include "tokenarray.hxx"
 #include "externalrefmgr.hxx"
 #include "scmatrix.hxx"
-#include "svl/sharedstring.hxx"
+#include "svl/sharedstringpool.hxx"
 
 #include <vector>
 #include <boost/ptr_container/ptr_vector.hpp>
@@ -124,6 +124,8 @@ public:
 
     void                LoadCachedValues();
 
+    svl::SharedStringPool& GetSharedStringPool();
+
 private:
     typedef boost::ptr_vector< XclImpSupbookTab >  XclImpSupbookTabList;
     typedef boost::ptr_vector< XclImpExtName >     XclImpExtNameList;
@@ -274,7 +276,7 @@ sal_uInt16 XclImpTabInfo::GetCurrentIndex( sal_uInt16 nCreatedId, sal_uInt16 nMa
 
 // External names =============================================================
 
-XclImpExtName::MOper::MOper(XclImpStream& rStrm) :
+XclImpExtName::MOper::MOper(svl::SharedStringPool& rPool, XclImpStream& rStrm) :
     mxCached(new ScMatrix(0,0))
 {
     SCSIZE nLastCol = rStrm.ReaduInt8();
@@ -297,7 +299,7 @@ XclImpExtName::MOper::MOper(XclImpStream& rStrm) :
                 case 0x02:
                 {
                     OUString aStr = rStrm.ReadUniString();
-                    mxCached->PutString(svl::SharedString(aStr), nCol, nRow);
+                    mxCached->PutString(rPool.intern(aStr), nCol, nRow);
                 }
                 break;
                 case 0x04:
@@ -327,7 +329,7 @@ const ScMatrix& XclImpExtName::MOper::GetCache() const
     return *mxCached;
 }
 
-XclImpExtName::XclImpExtName( const XclImpSupbook& rSupbook, XclImpStream& rStrm, XclSupbookType eSubType, ExcelToSc* pFormulaConv ) :
+XclImpExtName::XclImpExtName( XclImpSupbook& rSupbook, XclImpStream& rStrm, XclSupbookType eSubType, ExcelToSc* pFormulaConv ) :
     mpMOper(NULL)
 {
     sal_uInt16 nFlags;
@@ -385,7 +387,7 @@ XclImpExtName::XclImpExtName( const XclImpSupbook& rSupbook, XclImpStream& rStrm
             }
         break;
         case xlExtOLE:
-            mpMOper = new MOper(rStrm);
+            mpMOper = new MOper(rSupbook.GetSharedStringPool(), rStrm);
         break;
         default:
             ;
@@ -401,7 +403,7 @@ void XclImpExtName::CreateDdeData( ScDocument& rDoc, const OUString& rApplic, co
 {
     ScMatrixRef xResults;
     if( mxDdeMatrix.get() )
-        xResults = mxDdeMatrix->CreateScMatrix();
+        xResults = mxDdeMatrix->CreateScMatrix(rDoc.GetSharedStringPool());
     rDoc.CreateDdeLink( rApplic, rTopic, maName, SC_DDE_DEFAULT, xResults );
 }
 
@@ -734,6 +736,11 @@ void XclImpSupbook::LoadCachedValues()
     }
 }
 
+svl::SharedStringPool& XclImpSupbook::GetSharedStringPool()
+{
+    return GetDoc().GetSharedStringPool();
+}
+
 // Import link manager ========================================================
 
 XclImpLinkManagerImpl::XclImpLinkManagerImpl( const XclImpRoot& rRoot ) :
diff --git a/sc/source/filter/inc/xihelper.hxx b/sc/source/filter/inc/xihelper.hxx
index fa8aac7..2474a93 100644
--- a/sc/source/filter/inc/xihelper.hxx
+++ b/sc/source/filter/inc/xihelper.hxx
@@ -31,6 +31,12 @@
 
 class ScRangeList;
 
+namespace svl {
+
+class SharedStringPool;
+
+}
+
 // Excel->Calc cell address/range conversion ==================================
 
 /** Provides functions to convert Excel cell addresses to Calc cell addresses. */
@@ -326,7 +332,7 @@ public:
                         ~XclImpCachedMatrix();
 
     /** Creates a new ScMatrix object and fills it with the contained values. */
-    ScMatrixRef         CreateScMatrix() const;
+    ScMatrixRef CreateScMatrix( svl::SharedStringPool& rPool ) const;
 
 private:
     typedef boost::ptr_vector< XclImpCachedValue > XclImpValueList;
diff --git a/sc/source/filter/inc/xilink.hxx b/sc/source/filter/inc/xilink.hxx
index 56770ec..e6b8678 100644
--- a/sc/source/filter/inc/xilink.hxx
+++ b/sc/source/filter/inc/xilink.hxx
@@ -25,6 +25,12 @@
 #include "xiroot.hxx"
 #include "types.hxx"
 
+namespace svl {
+
+class SharedStringPool;
+
+}
+
 /* ============================================================================
 Classes for import of different kinds of internal/external references.
 - 3D cell and cell range links
@@ -112,7 +118,7 @@ class XclImpExtName
     class MOper
     {
     public:
-        MOper(XclImpStream& rStrm);
+        MOper(svl::SharedStringPool& rPool, XclImpStream& rStrm);
         const ScMatrix& GetCache() const;
     private:
         ScMatrixRef mxCached;
@@ -120,9 +126,9 @@ class XclImpExtName
 
 public:
     /** Reads the external name from the stream. */
-    explicit            XclImpExtName( const XclImpSupbook& rSupbook, XclImpStream& rStrm,
-                                        XclSupbookType eSubType, ExcelToSc* pFormulaConv );
-                        ~XclImpExtName();
+    explicit XclImpExtName( XclImpSupbook& rSupbook, XclImpStream& rStrm,
+                            XclSupbookType eSubType, ExcelToSc* pFormulaConv );
+    ~XclImpExtName();
 
     /** Create and apply the cached list of this DDE Link to the document. */
     void                CreateDdeData( ScDocument& rDoc,
diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx
index 5db7552..00b28b7 100644
--- a/sc/source/ui/docshell/externalrefmgr.cxx
+++ b/sc/source/ui/docshell/externalrefmgr.cxx
@@ -45,7 +45,7 @@
 #include "svl/stritem.hxx"
 #include "svl/urihelper.hxx"
 #include "svl/zformat.hxx"
-#include "svl/sharedstring.hxx"
+#include "svl/sharedstringpool.hxx"
 #include "sfx2/linkmgr.hxx"
 #include "tools/urlobj.hxx"
 #include "unotools/ucbhelper.hxx"
@@ -488,12 +488,10 @@ ScExternalRefCache::CellFormat::CellFormat() :
 
 // ----------------------------------------------------------------------------
 
-ScExternalRefCache::ScExternalRefCache()
-{
-}
-ScExternalRefCache::~ScExternalRefCache()
-{
-}
+ScExternalRefCache::ScExternalRefCache(svl::SharedStringPool& rPool) :
+    mrStrPool(rPool) {}
+
+ScExternalRefCache::~ScExternalRefCache() {}
 
 const OUString* ScExternalRefCache::getRealTableName(sal_uInt16 nFileId, const OUString& rTabName) const
 {
@@ -645,7 +643,7 @@ ScExternalRefCache::TokenArrayRef ScExternalRefCache::getCellRangeData(
                         xMat->PutDouble(pToken->GetDouble(), nC, nR);
                     break;
                     case svString:
-                        xMat->PutString(svl::SharedString(pToken->GetString()), nC, nR);
+                        xMat->PutString(mrStrPool.intern(pToken->GetString()), nC, nR);
                     break;
                     default:
                         ;
@@ -1374,7 +1372,8 @@ inline void ColumnBatch<T>::putValues(ScMatrixRef& xMat, const SCCOL nCol) const
 }
 
 static ScTokenArray* convertToTokenArray(
-    ScDocument* pSrcDoc, ScRange& rRange, vector<ScExternalRefCache::SingleRangeData>& rCacheData )
+    ScDocument* pSrcDoc, svl::SharedStringPool& rStrPool, ScRange& rRange,
+    vector<ScExternalRefCache::SingleRangeData>& rCacheData )
 {
     ScAddress& s = rRange.aStart;
     ScAddress& e = rRange.aEnd;
@@ -1455,7 +1454,7 @@ static ScTokenArray* convertToTokenArray(
                         else
                         {
                             OUString aStr = pFCell->GetString();
-                            xMat->PutString(aStr, nC, nR);
+                            xMat->PutString(rStrPool.intern(aStr), nC, nR);
                         }
                     }
                     break;
@@ -1505,6 +1504,7 @@ static ScTokenArray* lcl_fillEmptyMatrix(const ScRange& rRange)
 
 ScExternalRefManager::ScExternalRefManager(ScDocument* pDoc) :
     mpDoc(pDoc),
+    maRefCache(pDoc->GetSharedStringPool()),
     mbInReferenceMarking(false),
     mbUserInteractionEnabled(true)
 {
@@ -2024,7 +2024,7 @@ ScExternalRefCache::TokenArrayRef ScExternalRefManager::getDoubleRefTokensFromSr
     aRange.aStart.SetTab(nTab1);
     aRange.aEnd.SetTab(nTab1 + nTabSpan);
 
-    pArray.reset(convertToTokenArray(pSrcDoc, aRange, aCacheData));
+    pArray.reset(convertToTokenArray(pSrcDoc, mpDoc->GetSharedStringPool(), aRange, aCacheData));
     rRange = aRange;
     rCacheData.swap(aCacheData);
     return pArray;


More information about the Libreoffice-commits mailing list