[Libreoffice-commits] core.git: sc/source

Eike Rathke erack at redhat.com
Mon Apr 25 17:10:43 UTC 2016


 sc/source/core/tool/token.cxx |   44 +++++++++++++++++++++++-------------------
 1 file changed, 25 insertions(+), 19 deletions(-)

New commits:
commit 03124f5be5466c7f7cac012de05ef387b9718c4a
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Apr 25 18:54:41 2016 +0200

    Resolves: tdf#99461 reverse logic of TokenPointers::skipToken()
    
    ... so that all code tokens are adjusted even if shared with another
    flat copied token array, but RPN not if shared. Was vice versa.
    
    ScConditionEntry has shared token arrays for pFormula1|pFCell1
    respectively pFormula2|pFCell2 hence the references weren't updated.
    
    Change-Id: I52256b5ea20da753a2a29ff437f09c921566e070

diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 2c2f6fd..fd16ada 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -139,27 +139,33 @@ namespace
 
         bool skipToken( size_t i, const FormulaToken* const * pp )
         {
-            // Handle all tokens in RPN, and code tokens only if they have a
-            // reference count of 1, which means they are not referenced in
-            // RPN.
-            if (i == 0)
-                return (*pp)->GetRef() > 1;
-
-            if (mbSkipRelName)
+            // Handle all code tokens, and tokens in RPN only if they have a
+            // reference count of 1, which means they are not referenced in the
+            // code array. Doing it the other way would skip code tokens that
+            // are held by flat copied token arrays and thus are shared. For
+            // flat copy arrays the caller has to know what it does and should
+            // discard all RPN, update only one array and regenerate all RPN.
+            if (i == 1)
             {
-                // Skip (do not adjust) relative references resulting from
-                // named expressions.
-                switch ((*pp)->GetType())
+                if ((*pp)->GetRef() > 1)
+                    return true;
+
+                if (mbSkipRelName)
                 {
-                    case svSingleRef:
-                        return (*pp)->GetSingleRef()->IsRelName();
-                    case svDoubleRef:
-                        {
-                            const ScComplexRefData& rRef = *(*pp)->GetDoubleRef();
-                            return rRef.Ref1.IsRelName() || rRef.Ref2.IsRelName();
-                        }
-                    default:
-                        ;   // nothing
+                    // Skip (do not adjust) relative references resulting from
+                    // named expressions. Resolved expressions are only in RPN.
+                    switch ((*pp)->GetType())
+                    {
+                        case svSingleRef:
+                            return (*pp)->GetSingleRef()->IsRelName();
+                        case svDoubleRef:
+                            {
+                                const ScComplexRefData& rRef = *(*pp)->GetDoubleRef();
+                                return rRef.Ref1.IsRelName() || rRef.Ref2.IsRelName();
+                            }
+                        default:
+                            ;   // nothing
+                    }
                 }
             }
 


More information about the Libreoffice-commits mailing list