From e2b11f4fd79dce4116badb0ecf6477546ca5d0d4 Mon Sep 17 00:00:00 2001 From: Kohei Yoshida Date: Mon, 30 Jan 2012 16:10:48 -0500 Subject: Prevent excessive references to single token instance during fill. Because if not, we may run out of the 16-bit integer space to store reference count. --- sc/inc/cell.hxx | 2 ++ sc/inc/formularesult.hxx | 12 ++++++++++++ sc/source/core/data/cell.cxx | 5 +++++ sc/source/core/data/table4.cxx | 1 + 4 files changed, 20 insertions(+) diff --git a/sc/inc/cell.hxx b/sc/inc/cell.hxx index 52244f6dca93..3bc7aee92b1f 100644 --- a/sc/inc/cell.hxx +++ b/sc/inc/cell.hxx @@ -535,6 +535,8 @@ public: bool IsMultilineResult(); void MaybeInterpret(); + + void ResetFormulaResult(); }; // Iterator for references in a formula cell diff --git a/sc/inc/formularesult.hxx b/sc/inc/formularesult.hxx index c1cb90609275..94c62f83bbea 100644 --- a/sc/inc/formularesult.hxx +++ b/sc/inc/formularesult.hxx @@ -117,6 +117,8 @@ public: mpToken->DecRef(); } + inline void Reset(); + /** Well, guess what ... */ inline ScFormulaResult & operator=( const ScFormulaResult & r ); @@ -216,6 +218,16 @@ public: inline ScMatrixFormulaCellToken* GetMatrixFormulaCellTokenNonConst(); }; +inline void ScFormulaResult::Reset() +{ + ResetToDefaults(); + + if (mbToken && mpToken) + mpToken->DecRef(); + + mbToken = true; + mpToken = NULL; +} inline void ScFormulaResult::ResetToDefaults() { diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx index 2f3df26edcbf..1f89aeda6a54 100644 --- a/sc/source/core/data/cell.cxx +++ b/sc/source/core/data/cell.cxx @@ -2041,6 +2041,11 @@ void ScFormulaCell::MaybeInterpret() Interpret(); } +void ScFormulaCell::ResetFormulaResult() +{ + aResult.Reset(); +} + EditTextObject* ScFormulaCell::CreateURLObject() { String aCellText; diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx index dac41110b777..6a21a07b7f9a 100644 --- a/sc/source/core/data/table4.cxx +++ b/sc/source/core/data/table4.cxx @@ -429,6 +429,7 @@ void ScTable::FillFormula(sal_uLong& /* nFormulaCounter */, bool /* bFirst */, S pDocument->SetNoListening( true ); // noch falsche Referenzen ScAddress aAddr( nDestCol, nDestRow, nTab ); ScFormulaCell* pDestCell = new ScFormulaCell( *pSrcCell, *pDocument, aAddr ); + pDestCell->ResetFormulaResult(); // formula cell is interpreted later during fill. aCol[nDestCol].Insert(nDestRow, pDestCell); if ( bLast && pDestCell->GetMatrixFlag() ) -- cgit v1.2.3