diff options
Diffstat (limited to 'sc/inc')
-rw-r--r-- | sc/inc/column.hxx | 2 | ||||
-rw-r--r-- | sc/inc/document.hxx | 2 | ||||
-rw-r--r-- | sc/inc/formulacell.hxx | 10 | ||||
-rw-r--r-- | sc/inc/recursionhelper.hxx | 13 | ||||
-rw-r--r-- | sc/inc/table.hxx | 2 |
5 files changed, 24 insertions, 5 deletions
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index bff5e621160e..5da349006538 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -576,7 +576,7 @@ public: bool ResolveStaticReference( ScMatrix& rMat, SCCOL nMatCol, SCROW nRow1, SCROW nRow2 ); void FillMatrix( ScMatrix& rMat, size_t nMatCol, SCROW nRow1, SCROW nRow2, svl::SharedStringPool* pPool ) const; formula::VectorRefArray FetchVectorRefArray( SCROW nRow1, SCROW nRow2 ); - bool HandleRefArrayForParallelism( SCROW nRow1, SCROW nRow2 ); + bool HandleRefArrayForParallelism( SCROW nRow1, SCROW nRow2, const ScFormulaCellGroupRef& mxGroup ); void SetFormulaResults( SCROW nRow, const double* pResults, size_t nLen ); void SetFormulaResults( SCROW nRow, const formula::FormulaConstTokenRef* pResults, size_t nLen ); diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index ad371bd73cd8..86079dd4c7b1 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -2384,7 +2384,7 @@ public: formula::FormulaTokenRef ResolveStaticReference( const ScRange& rRange ); formula::VectorRefArray FetchVectorRefArray( const ScAddress& rPos, SCROW nLength ); - bool HandleRefArrayForParallelism( const ScAddress& rPos, SCROW nLength ); + bool HandleRefArrayForParallelism( const ScAddress& rPos, SCROW nLength, const ScFormulaCellGroupRef& mxGroup ); /** * Call this before any operations that might trigger one or more formula diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx index 78eb1f6265b8..a9df1a3be625 100644 --- a/sc/inc/formulacell.hxx +++ b/sc/inc/formulacell.hxx @@ -68,6 +68,7 @@ public: bool mbInvariant:1; bool mbSubTotal:1; bool mbSeenInPath:1; // For detecting cycle of formula groups + bool mbPartOfCycle:1; // To flag FG's part of a cycle sal_uInt8 meCalcState; @@ -142,8 +143,13 @@ private: ScFormulaCell( const ScFormulaCell& ) = delete; - bool InterpretFormulaGroupThreading(sc::FormulaLogger::GroupScope& aScope); - bool InterpretFormulaGroupOpenCL(sc::FormulaLogger::GroupScope& aScope); + bool CheckComputeDependencies(sc::FormulaLogger::GroupScope& rScope); + bool InterpretFormulaGroupThreading(sc::FormulaLogger::GroupScope& aScope, + bool& bDependencyComputed, + bool& bDependencyCheckFailed); + bool InterpretFormulaGroupOpenCL(sc::FormulaLogger::GroupScope& aScope, + bool& bDependencyComputed, + bool& bDependencyCheckFailed); bool InterpretInvariantFormulaGroup(); public: diff --git a/sc/inc/recursionhelper.hxx b/sc/inc/recursionhelper.hxx index b8ca1d087509..030e52c04b7c 100644 --- a/sc/inc/recursionhelper.hxx +++ b/sc/inc/recursionhelper.hxx @@ -104,6 +104,19 @@ public: void PopFormulaGroup(); }; +/** A class to wrap ScRecursionHelper::PushFormulaGroup(), + ScRecursionHelper::PopFormulaGroup() and make these calls + exception safe. */ +class ScFormulaGroupCycleCheckGuard +{ + ScRecursionHelper& mrRecHelper; + bool mbShouldPop; +public: + ScFormulaGroupCycleCheckGuard() = delete; + ScFormulaGroupCycleCheckGuard(ScRecursionHelper& rRecursionHelper, ScFormulaCellGroup* pGrp); + ~ScFormulaGroupCycleCheckGuard(); +}; + #endif // INCLUDED_SC_INC_RECURSIONHELPER_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index e7886b15c6ee..a0978122ca88 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -987,7 +987,7 @@ public: formula::FormulaTokenRef ResolveStaticReference( SCCOL nCol, SCROW nRow ); formula::FormulaTokenRef ResolveStaticReference( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ); formula::VectorRefArray FetchVectorRefArray( SCCOL nCol, SCROW nRow1, SCROW nRow2 ); - bool HandleRefArrayForParallelism( SCCOL nCol, SCROW nRow1, SCROW nRow2 ); + bool HandleRefArrayForParallelism( SCCOL nCol, SCROW nRow1, SCROW nRow2, const ScFormulaCellGroupRef& mxGroup ); void SplitFormulaGroups( SCCOL nCol, std::vector<SCROW>& rRows ); void UnshareFormulaCells( SCCOL nCol, std::vector<SCROW>& rRows ); |