summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-03-05 18:47:07 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-03-05 18:52:10 -0500
commit95637452609260c97d8e5aaa7500531bb458a8bc (patch)
tree14fc0e4a12b26eb3d6eacf108208576b1ec5981d
parent2b78f2cd7b9e4bab0f3b3b9119238f36a1bbc7b2 (diff)
Fix incorrect group calc state check.
And the code in the else block is pretty dangerous as it passes an empty token array to the group interpreter whose effect is entirely unpredictable. Also, declare the destructor of CompiledFormula class to be virtual as it serves as a base class for DynamicKernel. Change-Id: I4e191550a4437ad6ebac55fcdeee4f3654722ff1
-rw-r--r--sc/inc/formulagroup.hxx3
-rw-r--r--sc/source/core/data/formulacell.cxx44
-rw-r--r--sc/source/core/tool/formulagroup.cxx4
3 files changed, 23 insertions, 28 deletions
diff --git a/sc/inc/formulagroup.hxx b/sc/inc/formulagroup.hxx
index 602c4a4f6cd1..a3f1891417a4 100644
--- a/sc/inc/formulagroup.hxx
+++ b/sc/inc/formulagroup.hxx
@@ -81,6 +81,9 @@ struct FormulaGroupContext : boost::noncopyable
*/
class SC_DLLPUBLIC CompiledFormula
{
+public:
+ CompiledFormula();
+ virtual ~CompiledFormula();
};
/**
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 852882896009..3b20408568d6 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -3660,38 +3660,26 @@ bool ScFormulaCell::InterpretFormulaGroup()
if (mxGroup->mbInvariant && false)
return InterpretInvariantFormulaGroup();
- if (mxGroup->meCalcState == sc::GroupCalcEnabled)
- {
- ScTokenArray aCode;
- ScAddress aTopPos = aPos;
- aTopPos.SetRow(mxGroup->mpTopCell->aPos.Row());
- ScGroupTokenConverter aConverter(aCode, *pDocument, *this, mxGroup->mpTopCell->aPos);
- if (!aConverter.convert(*pCode))
- {
- SAL_INFO("sc.opencl", "conversion of group " << this << " failed, disabling");
- mxGroup->meCalcState = sc::GroupCalcDisabled;
- return false;
- }
- mxGroup->meCalcState = sc::GroupCalcRunning;
- if (!sc::FormulaGroupInterpreter::getStatic()->interpret(*pDocument, mxGroup->mpTopCell->aPos, mxGroup, aCode))
- {
- SAL_INFO("sc.opencl", "interpreting group " << mxGroup << " (state " << mxGroup->meCalcState << ") failed, disabling");
- mxGroup->meCalcState = sc::GroupCalcDisabled;
- return false;
- }
- mxGroup->meCalcState = sc::GroupCalcEnabled;
+ ScTokenArray aCode;
+ ScAddress aTopPos = aPos;
+ aTopPos.SetRow(mxGroup->mpTopCell->aPos.Row());
+ ScGroupTokenConverter aConverter(aCode, *pDocument, *this, mxGroup->mpTopCell->aPos);
+ if (!aConverter.convert(*pCode))
+ {
+ SAL_INFO("sc.opencl", "conversion of group " << this << " failed, disabling");
+ mxGroup->meCalcState = sc::GroupCalcDisabled;
+ return false;
}
- else
+
+ mxGroup->meCalcState = sc::GroupCalcRunning;
+ if (!sc::FormulaGroupInterpreter::getStatic()->interpret(*pDocument, mxGroup->mpTopCell->aPos, mxGroup, aCode))
{
- ScTokenArray aDummy;
- if (!sc::FormulaGroupInterpreter::getStatic()->interpret(*pDocument, mxGroup->mpTopCell->aPos, mxGroup, aDummy))
- {
- SAL_INFO("sc.opencl", "interpreting group " << mxGroup << " (state " << mxGroup->meCalcState << ") failed, disabling");
- mxGroup->meCalcState = sc::GroupCalcDisabled;
- return false;
- }
+ SAL_INFO("sc.opencl", "interpreting group " << mxGroup << " (state " << mxGroup->meCalcState << ") failed, disabling");
+ mxGroup->meCalcState = sc::GroupCalcDisabled;
+ return false;
}
+ mxGroup->meCalcState = sc::GroupCalcEnabled;
return true;
}
diff --git a/sc/source/core/tool/formulagroup.cxx b/sc/source/core/tool/formulagroup.cxx
index 8ddafd2093ad..806d2d1178da 100644
--- a/sc/source/core/tool/formulagroup.cxx
+++ b/sc/source/core/tool/formulagroup.cxx
@@ -279,6 +279,10 @@ void fillMatrix( ScMatrix& rMat, size_t nCol, const double* pNums, rtl_uString**
}
+CompiledFormula::CompiledFormula() {}
+
+CompiledFormula::~CompiledFormula() {}
+
FormulaGroupInterpreterSoftware::FormulaGroupInterpreterSoftware() : FormulaGroupInterpreter()
{
}