summaryrefslogtreecommitdiff
path: root/sc/source/core/data
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2015-09-16 12:38:06 +0200
committerCaolán McNamara <caolanm@redhat.com>2015-09-17 08:05:47 +0000
commitd1d44378374f63f7b187e5e359ab0ab7f7b4d7fb (patch)
tree9af0f8d2b8c109a7729f5bab5dc92f8ef2244dc2 /sc/source/core/data
parent3ac6f513458d495a6077068235966a5d627111c2 (diff)
Resolves: tdf#94249 do not remove broadcasters while iterators are in use
EndListeningContext holds BroadcasterStoreType iterators in its ColumnBlockPositionSet and collects broadcasters to purge them at the end. Removing broadcasters from ScColumn::maBroadcasters in between invalidates the iterators. Hence calling the "normal" EndListening() that removes a broadcaster when all listeners are gone while an EndListeningContext is in use is bad. Change-Id: Ibdd88469e91e6173ceff1f391c23ef7cb7c6f596 (cherry picked from commit e4a8ae0bf54476e9a0c9e1f5348c05f3cd838899) Reviewed-on: https://gerrit.libreoffice.org/18615 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sc/source/core/data')
-rw-r--r--sc/source/core/data/column.cxx8
-rw-r--r--sc/source/core/data/column3.cxx8
2 files changed, 8 insertions, 8 deletions
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index 9accde974966..910981af7b39 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -1908,15 +1908,15 @@ void ScColumn::MoveTo(SCROW nStartRow, SCROW nEndRow, ScColumn& rCol)
// Split the formula grouping at the top and bottom boundaries.
sc::CellStoreType::position_type aPos = maCells.position(nStartRow);
- sc::SharedFormulaUtil::splitFormulaCellGroup(aPos);
+ sc::SharedFormulaUtil::splitFormulaCellGroup(aPos, nullptr);
aPos = maCells.position(aPos.first, nEndRow+1);
- sc::SharedFormulaUtil::splitFormulaCellGroup(aPos);
+ sc::SharedFormulaUtil::splitFormulaCellGroup(aPos, nullptr);
// Do the same with the destination column.
aPos = rCol.maCells.position(nStartRow);
- sc::SharedFormulaUtil::splitFormulaCellGroup(aPos);
+ sc::SharedFormulaUtil::splitFormulaCellGroup(aPos, nullptr);
aPos = rCol.maCells.position(aPos.first, nEndRow+1);
- sc::SharedFormulaUtil::splitFormulaCellGroup(aPos);
+ sc::SharedFormulaUtil::splitFormulaCellGroup(aPos, nullptr);
// Move the broadcasters to the destination column.
maBroadcasters.transfer(nStartRow, nEndRow, rCol.maBroadcasters, nStartRow);
diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 757c3e3de10f..c0376eab2d96 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -327,13 +327,13 @@ void ScColumn::DetachFormulaCells(
const sc::CellStoreType::position_type& aPos, size_t nLength )
{
// Split formula grouping at the top and bottom boundaries.
- sc::SharedFormulaUtil::splitFormulaCellGroup(aPos);
+ sc::SharedFormulaUtil::splitFormulaCellGroup(aPos, nullptr);
size_t nRow = aPos.first->position + aPos.second;
size_t nNextTopRow = nRow + nLength; // start row of next formula group.
if (ValidRow(nNextTopRow))
{
sc::CellStoreType::position_type aPos2 = maCells.position(aPos.first, nNextTopRow);
- sc::SharedFormulaUtil::splitFormulaCellGroup(aPos2);
+ sc::SharedFormulaUtil::splitFormulaCellGroup(aPos2, nullptr);
}
if (pDocument->IsClipOrUndo())
@@ -368,11 +368,11 @@ void ScColumn::DetachFormulaCells( sc::EndListeningContext& rCxt, SCROW nRow1, S
sc::CellStoreType::iterator it = aPos.first;
// Split formula grouping at the top and bottom boundaries.
- sc::SharedFormulaUtil::splitFormulaCellGroup(aPos);
+ sc::SharedFormulaUtil::splitFormulaCellGroup(aPos, &rCxt);
if (ValidRow(nRow2+1))
{
aPos = maCells.position(it, nRow2+1);
- sc::SharedFormulaUtil::splitFormulaCellGroup(aPos);
+ sc::SharedFormulaUtil::splitFormulaCellGroup(aPos, &rCxt);
}
if (pDocument->IsClipOrUndo())