diff options
author | Eike Rathke <erack@redhat.com> | 2016-04-25 18:54:41 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2016-04-25 19:10:16 +0200 |
commit | 03124f5be5466c7f7cac012de05ef387b9718c4a (patch) | |
tree | f29f0c3890730caaf931dc70e4988e80f789d40b | |
parent | 79c4d547b4d0f9e2f2a77bd4472255d9229cea58 (diff) |
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
-rw-r--r-- | sc/source/core/tool/token.cxx | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 2c2f6fd96fc9..fd16ada1fa99 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 + } } } |