[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - sc/inc sc/source

László Németh laszlo.nemeth at collabora.com
Fri Feb 13 05:13:54 PST 2015


 sc/inc/tokenarray.hxx              |    1 +
 sc/source/core/tool/token.cxx      |   34 ++++++++++++++++++++++++++++++++++
 sc/source/filter/excel/excform.cxx |   10 ++++++++--
 3 files changed, 43 insertions(+), 2 deletions(-)

New commits:
commit 76610b00b67cf9c4600caed0f4d75d04e825f9d2
Author: László Németh <laszlo.nemeth at collabora.com>
Date:   Fri Feb 13 00:06:32 2015 +0100

    tdf#89281 fix performance regression of XLS import
    
    The fix for Bug 76611 caused ~20% performance loss in XLS import.
    With optional cloning of ScTokenArray of the shared XLS formulas
    depending on the need of address wrapping, it is possible to gain
    back near the original performance.
    
    Note: The original patch for Bug 76611 has already got an unit test,
    too (see wrapped-refs.xls), and that unit test works with this
    improved patch, too.
    
    Cherry picked from master:
    ba686b9bd2596811141e4028947334f10799c356 cleanup
    b18b5b7edf3d14ef5f0efe53e367f88a423088c4 first commit
    
    Change-Id: Ibfb59d1543ef9c4b8a075d5c4e37f77ab451aaa0
    Reviewed-on: https://gerrit.libreoffice.org/14393
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sc/inc/tokenarray.hxx b/sc/inc/tokenarray.hxx
index ad61ef3..412ecfe 100644
--- a/sc/inc/tokenarray.hxx
+++ b/sc/inc/tokenarray.hxx
@@ -239,6 +239,7 @@ public:
     OUString CreateString( sc::TokenStringContext& rCxt, const ScAddress& rPos ) const;
 
     void WrapReference( const ScAddress& rPos, SCCOL nMaxCol, SCROW nMaxRow );
+    bool NeedsWrapReference( const ScAddress& rPos, SCCOL nMaxCol, SCROW nMaxRow ) const;
 
 #if DEBUG_FORMULA_COMPILER
     void Dump() const;
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index ee55b07..43e1963 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -4035,6 +4035,40 @@ void ScTokenArray::WrapReference( const ScAddress& rPos, SCCOL nMaxCol, SCROW nM
     }
 }
 
+bool ScTokenArray::NeedsWrapReference( const ScAddress& rPos, SCCOL nMaxCol, SCROW nMaxRow ) const
+{
+    FormulaToken** p = pCode;
+    FormulaToken** pEnd = p + static_cast<size_t>(nLen);
+    for (; p != pEnd; ++p)
+    {
+        switch ((*p)->GetType())
+        {
+            case svSingleRef:
+            {
+                formula::FormulaToken* pToken = *p;
+                ScSingleRefData& rRef = *pToken->GetSingleRef();
+                ScAddress aAbs = rRef.toAbs(rPos);
+                if (aAbs.Col() > nMaxCol || aAbs.Row() > nMaxRow)
+                   return true;
+            }
+            break;
+            case svDoubleRef:
+            {
+                formula::FormulaToken* pToken = *p;
+                ScComplexRefData& rRef = *pToken->GetDoubleRef();
+                ScRange aAbs = rRef.toAbs(rPos);
+                if (aAbs.aStart.Col() > nMaxCol || aAbs.aStart.Row() > nMaxRow ||
+                    aAbs.aEnd.Col() > nMaxCol || aAbs.aEnd.Row() > nMaxRow)
+                    return true;
+            }
+            break;
+            default:
+                ;
+        }
+    }
+    return false;
+}
+
 #if DEBUG_FORMULA_COMPILER
 
 void ScTokenArray::Dump() const
diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx
index 630997a..1df8fd9 100644
--- a/sc/source/filter/excel/excform.cxx
+++ b/sc/source/filter/excel/excform.cxx
@@ -124,8 +124,14 @@ void ImportExcel::Formula(
             const ScTokenArray* pSharedCode = pFormConv->GetSharedFormula(aRefPos);
             if (pSharedCode)
             {
-                ScFormulaCell* pCell = new ScFormulaCell(pD, aScPos, pSharedCode->Clone());
-                pCell->GetCode()->WrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8);
+                ScFormulaCell* pCell;
+                if (pSharedCode->NeedsWrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8))
+                {
+                    pCell = new ScFormulaCell(pD, aScPos, pSharedCode->Clone());
+                    pCell->GetCode()->WrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8);
+                }
+                else
+                    pCell = new ScFormulaCell(pD, aScPos, *pSharedCode);
                 rDoc.getDoc().EnsureTable(aScPos.Tab());
                 rDoc.setFormulaCell(aScPos, pCell);
                 pCell->SetNeedNumberFormat(false);


More information about the Libreoffice-commits mailing list