[Libreoffice-commits] core.git: sc/source
Caolán McNamara
caolanm at redhat.com
Thu Apr 2 05:20:59 PDT 2015
sc/source/core/data/formulacell.cxx | 3 ++-
sc/source/core/data/grouptokenconverter.cxx | 13 +++++++++++--
sc/source/core/inc/grouptokenconverter.hxx | 2 +-
3 files changed, 14 insertions(+), 4 deletions(-)
New commits:
commit ea441294e15b23f703f139055e9a18287745ca23
Author: Caolán McNamara <caolanm at redhat.com>
Date: Thu Apr 2 13:19:32 2015 +0100
avoid endless recursion in fdo84763-2.ods
Change-Id: I7052ad735ee7f804fe2817ea44527a4b95a2dd04
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index bf97845..3ba5fc2 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3798,7 +3798,8 @@ bool ScFormulaCell::InterpretFormulaGroup()
ScAddress aTopPos = aPos;
aTopPos.SetRow(mxGroup->mpTopCell->aPos.Row());
ScGroupTokenConverter aConverter(aCode, *pDocument, *this, mxGroup->mpTopCell->aPos);
- if (!aConverter.convert(*pCode))
+ std::vector<ScTokenArray*> aLoopControl;
+ if (!aConverter.convert(*pCode, aLoopControl))
{
SAL_INFO("sc.opencl", "conversion of group " << this << " failed, disabling");
mxGroup->meCalcState = sc::GroupCalcDisabled;
diff --git a/sc/source/core/data/grouptokenconverter.cxx b/sc/source/core/data/grouptokenconverter.cxx
index da3964c..de3fbf2 100644
--- a/sc/source/core/data/grouptokenconverter.cxx
+++ b/sc/source/core/data/grouptokenconverter.cxx
@@ -89,7 +89,7 @@ ScGroupTokenConverter::ScGroupTokenConverter(ScTokenArray& rGroupTokens, ScDocum
{
}
-bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
+bool ScGroupTokenConverter::convert(ScTokenArray& rCode, std::vector<ScTokenArray*>& rConversionStack)
{
#if 0
{ // debug to start with:
@@ -232,7 +232,16 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode)
mrGroupTokens.AddOpCode(ocOpen);
- if (!convert(*pNamedTokens))
+ if (std::find(rConversionStack.begin(), rConversionStack.end(), pNamedTokens) != rConversionStack.end())
+ {
+ SAL_WARN("sc", "loop in recursive ScGroupTokenConverter::convert");
+ return false;
+ }
+
+ rConversionStack.push_back(pNamedTokens);
+ bool bOk = convert(*pNamedTokens, rConversionStack);
+ rConversionStack.pop_back();
+ if (!bOk)
return false;
mrGroupTokens.AddOpCode(ocClose);
diff --git a/sc/source/core/inc/grouptokenconverter.hxx b/sc/source/core/inc/grouptokenconverter.hxx
index 9685681..b221363 100644
--- a/sc/source/core/inc/grouptokenconverter.hxx
+++ b/sc/source/core/inc/grouptokenconverter.hxx
@@ -30,7 +30,7 @@ class SC_DLLPUBLIC ScGroupTokenConverter
public:
ScGroupTokenConverter(ScTokenArray& rGroupTokens, ScDocument& rDoc, ScFormulaCell& rCell, const ScAddress& rPos);
- bool convert(ScTokenArray& rCode);
+ bool convert(ScTokenArray& rCode, std::vector<ScTokenArray*>& rConversionStack);
};
#endif // INCLUDED_SC_SOURCE_CORE_INC_GROUPTOKENCONVERTER_HXX
More information about the Libreoffice-commits
mailing list