sc/inc/dociter.hxx | 4 ++++ sc/source/core/data/dociter.cxx | 9 +++++---- sc/source/core/tool/interpr6.cxx | 1 + 3 files changed, 10 insertions(+), 4 deletions(-)
New commits: commit e7792c4bf270d5a98ec5b8d2be2e25c11a8ecf02 Author: Luboš Luňák <l.lu...@collabora.com> Date: Fri Jun 22 10:43:22 2018 +0200 use ScInterpreterContext in ScValueIterator Otherwise GetFormatTable() asserts with fdo#74507-1 (and mnOpenCLMinimumFormulaGroupSize disabled). Change-Id: Ic624076bd552a2f8370f942063e8b79ca703d9fc Reviewed-on: https://gerrit.libreoffice.org/56288 Reviewed-by: Luboš Luňák <l.lu...@collabora.com> Tested-by: Luboš Luňák <l.lu...@collabora.com> diff --git a/sc/inc/dociter.hxx b/sc/inc/dociter.hxx index a702c392d738..5ceacf4a9b26 100644 --- a/sc/inc/dociter.hxx +++ b/sc/inc/dociter.hxx @@ -37,6 +37,7 @@ class ScPatternAttr; class ScAttrArray; class ScAttrIterator; class ScFlatBoolRowSegments; +struct ScInterpreterContext; class ScMatrix; struct ScDBQueryParamBase; struct ScQueryParam; @@ -52,6 +53,7 @@ class ScValueIterator // walk through all values in an area typedef sc::CellStoreType::const_position_type PositionType; ScDocument* pDoc; + ScInterpreterContext* pContext; const ScAttrArray* pAttrArray; sal_uInt32 nNumFormat; // for CalcAsShown sal_uInt32 nNumFmtIndex; @@ -92,6 +94,8 @@ public: /// Does NOT reset rValue if no value found! bool GetNext( double& rValue, FormulaError& rErr ); + + void SetInterpreterContext( ScInterpreterContext* context ) { pContext = context; } }; class ScDBQueryDataIterator diff --git a/sc/source/core/data/dociter.cxx b/sc/source/core/data/dociter.cxx index 9b1598e17b80..a5d78bb20859 100644 --- a/sc/source/core/data/dociter.cxx +++ b/sc/source/core/data/dociter.cxx @@ -77,7 +77,7 @@ void decBlock(std::pair<Iter, size_t>& rPos) void ScAttrArray_IterGetNumberFormat( sal_uInt32& nFormat, const ScAttrArray*& rpArr, SCROW& nAttrEndRow, const ScAttrArray* pNewArr, SCROW nRow, - const ScDocument* pDoc ) + const ScDocument* pDoc, ScInterpreterContext* pContext = nullptr ) { if ( rpArr != pNewArr || nAttrEndRow < nRow ) { @@ -90,7 +90,7 @@ void ScAttrArray_IterGetNumberFormat( sal_uInt32& nFormat, const ScAttrArray*& r nRowEnd = MAXROW; } - nFormat = pPattern->GetNumberFormat( pDoc->GetFormatTable() ); + nFormat = pPattern->GetNumberFormat( pContext ? pContext->GetFormatTable() : pDoc->GetFormatTable() ); rpArr = pNewArr; nAttrEndRow = nRowEnd; } @@ -99,6 +99,7 @@ void ScAttrArray_IterGetNumberFormat( sal_uInt32& nFormat, const ScAttrArray*& r ScValueIterator::ScValueIterator( ScDocument* pDocument, const ScRange& rRange, SubtotalFlags nSubTotalFlags, bool bTextZero ) : pDoc(pDocument) + , pContext(nullptr) , pAttrArray(nullptr) , nNumFormat(0) // Initialized in GetNumberFormat , nNumFmtIndex(0) @@ -205,8 +206,8 @@ bool ScValueIterator::GetThis(double& rValue, FormulaError& rErr) if (bCalcAsShown) { ScAttrArray_IterGetNumberFormat(nNumFormat, pAttrArray, - nAttrEndRow, pCol->pAttrArray.get(), nCurRow, pDoc); - rValue = pDoc->RoundValueAsShown(rValue, nNumFormat); + nAttrEndRow, pCol->pAttrArray.get(), nCurRow, pDoc, pContext); + rValue = pDoc->RoundValueAsShown(rValue, nNumFormat, pContext); } return true; // Found it! } diff --git a/sc/source/core/tool/interpr6.cxx b/sc/source/core/tool/interpr6.cxx index c7554699bfa9..e1769e27b091 100644 --- a/sc/source/core/tool/interpr6.cxx +++ b/sc/source/core/tool/interpr6.cxx @@ -853,6 +853,7 @@ void ScInterpreter::IterateParameters( ScIterFunc eFunc, bool bTextAsZero ) else { ScValueIterator aValIter( pDok, aRange, mnSubTotalFlags, bTextAsZero ); + aValIter.SetInterpreterContext( &mrContext ); FormulaError nErr = FormulaError::NONE; if (aValIter.GetFirst(fVal, nErr)) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits