[Libreoffice-commits] core.git: sc/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Wed Nov 14 15:10:29 UTC 2018
sc/source/core/data/column2.cxx | 9 +++++++++
sc/source/core/data/formulacell.cxx | 15 +++++++++++++++
2 files changed, 24 insertions(+)
New commits:
commit 12f00988c2360713885ecf7eb4b643dd118cd051
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Wed Nov 7 15:35:26 2018 +0100
Commit: Luboš Luňák <l.lunak at collabora.com>
CommitDate: Wed Nov 14 16:10:02 2018 +0100
make sure ScConditionEntry::Interpret() doesn't confuse calc threading
ScConditionEntry::Interpret() creates a temporary cell and interprets it
without it actually being in the document at the specified position,
which threading relies upon.
Change-Id: I06fcc11dfbe14e715de4c173e061064ac90da990
Reviewed-on: https://gerrit.libreoffice.org/63182
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak at collabora.com>
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 93bcf9bd6531..a4078e75427d 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -2902,8 +2902,11 @@ void ScColumn::SetFormulaResults( SCROW nRow, const double* pResults, size_t nLe
sc::CellStoreType::position_type aPos = maCells.position(nRow);
sc::CellStoreType::iterator it = aPos.first;
if (it->type != sc::element_type_formula)
+ {
// This is not a formula block.
+ assert( false );
return;
+ }
size_t nBlockLen = it->size - aPos.second;
if (nBlockLen < nLen)
@@ -2934,8 +2937,11 @@ void ScColumn::CalculateInThread( ScInterpreterContext& rContext, SCROW nRow, si
sc::CellStoreType::position_type aPos = maCells.position(nRow);
sc::CellStoreType::iterator it = aPos.first;
if (it->type != sc::element_type_formula)
+ {
// This is not a formula block.
+ assert( false );
return;
+ }
size_t nBlockLen = it->size - aPos.second;
if (nBlockLen < nLen)
@@ -2962,8 +2968,11 @@ void ScColumn::HandleStuffAfterParallelCalculation( SCROW nRow, size_t nLen )
sc::CellStoreType::position_type aPos = maCells.position(nRow);
sc::CellStoreType::iterator it = aPos.first;
if (it->type != sc::element_type_formula)
+ {
// This is not a formula block.
+ assert( false );
return;
+ }
size_t nBlockLen = it->size - aPos.second;
if (nBlockLen < nLen)
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 8d16fdf0d352..6d284ff43dbf 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -4523,6 +4523,21 @@ bool ScFormulaCell::InterpretFormulaGroup()
return false;
}
+ if( forceType != ForceCalculationNone )
+ {
+ // ScConditionEntry::Interpret() creates a temporary cell and interprets it
+ // without it actually being in the document at the specified position.
+ // That would confuse opencl/threading code, as they refer to the cell group
+ // also using the position. This is normally not triggered (single cells
+ // are normally not in a cell group), but if forced, check for this explicitly.
+ if( pDocument->GetFormulaCell( aPos ) != this )
+ {
+ mxGroup->meCalcState = sc::GroupCalcDisabled;
+ aScope.addMessage("cell not in document");
+ return false;
+ }
+ }
+
// Guard against endless recursion of Interpret() calls, for this to work
// ScFormulaCell::InterpretFormulaGroup() must never be called through
// anything else than ScFormulaCell::Interpret(), same as
More information about the Libreoffice-commits
mailing list