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

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Fri Aug 31 08:52:58 UTC 2018


 sc/qa/unit/data/xls/pass/ooo956-3.xls |binary
 sc/source/core/data/formulacell.cxx   |   18 ++++++++++++++++--
 2 files changed, 16 insertions(+), 2 deletions(-)

New commits:
commit 8eafa504e99bdf946e006527092d1974f18b66cc
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Thu Aug 23 12:27:24 2018 +0200
Commit:     Eike Rathke <erack at redhat.com>
CommitDate: Fri Aug 31 10:52:31 2018 +0200

    properly reset nSeenInIteration when iterating cell cycles
    
    ooo#956-3 has a somewhat complex cell cycle structure. Calc detects
    cycle G40, H40, H47, H37, D40 -> G40, marks these cells as bIsIterCell,
    adds them to the list of cells in RecursionHelper and starts iterating.
    However, there are more cells involved, e.g. there's another cycle
    D41, G41, H41, H47, H37 -> D41, which Calc doesn't detect (probably
    because it partially overlaps with the detected cycle).
    
    This means that InterpretTail() was setting nSeenInIteration for every
    involved cell, but it wasn't unset, because some of the cells weren't
    know to be part of the iteration. And so on the next recalc, these
    cells weren't interpreted, because Interpret() aborted early because
    of the stale nSeenInIteration value. And in threaded calculation, this
    eventually led to hitting an assert in MaybeInterpret().
    
    And obvious fix for this is to set nSeenInIteration only for cells
    that Calc treats as being part of the iteration. Which is what this
    commit does.
    
    That's however not a complete fix. Doing a recalc with ooo#956-3 now
    at least gives somewhat sensible values, but it needs repeated hard
    recalcs to actually reach the correct values that converge, or the delta
    change in the iteration settings need to be (needlessly) small, 1E-6,
    while Excel manages with just 1E-2. So what also should be done is probably
    detecting all cells involved in the cycle and treating them as such.
    
    Change-Id: I05fd149b453363c335f1f5d5d3748354ae624613
    Reviewed-on: https://gerrit.libreoffice.org/59495
    Tested-by: Jenkins
    Reviewed-by: Eike Rathke <erack at redhat.com>

diff --git a/sc/qa/unit/data/xls/pass/ooo956-3.xls b/sc/qa/unit/data/xls/pass/ooo956-3.xls
new file mode 100644
index 000000000000..dc8f353b2bc9
Binary files /dev/null and b/sc/qa/unit/data/xls/pass/ooo956-3.xls differ
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 660ea65f0a1a..9ad6d4b9cb86 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1457,8 +1457,15 @@ class RecursionCounter
 {
     ScRecursionHelper&  rRec;
     bool                bStackedInIteration;
+#ifdef DBG_UTIL
+    const ScFormulaCell* cell;
+#endif
 public:
-    RecursionCounter( ScRecursionHelper& r, ScFormulaCell* p ) : rRec(r)
+    RecursionCounter( ScRecursionHelper& r, ScFormulaCell* p )
+        : rRec(r)
+#ifdef DBG_UTIL
+        , cell(p)
+#endif
     {
         bStackedInIteration = rRec.IsDoingIteration();
         if (bStackedInIteration)
@@ -1469,7 +1476,12 @@ public:
     {
         rRec.DecRecursionCount();
         if (bStackedInIteration)
+        {
+#ifdef DBG_UTIL
+            assert(rRec.GetRecursionInIterationStack().top() == cell);
+#endif
             rRec.GetRecursionInIterationStack().pop();
+        }
     }
 };
 }
@@ -1806,7 +1818,9 @@ void ScFormulaCell::Interpret()
 void ScFormulaCell::InterpretTail( ScInterpreterContext& rContext, ScInterpretTailParameter eTailParam )
 {
     RecursionCounter aRecursionCounter( pDocument->GetRecursionHelper(), this);
-    nSeenInIteration = pDocument->GetRecursionHelper().GetIteration();
+    // TODO If this cell is not an iteration cell, add it to the list of iteration cells?
+    if(bIsIterCell)
+        nSeenInIteration = pDocument->GetRecursionHelper().GetIteration();
     if( !pCode->GetCodeLen() && pCode->GetCodeError() == FormulaError::NONE )
     {
         // #i11719# no RPN and no error and no token code but result string present


More information about the Libreoffice-commits mailing list