summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2017-05-12 17:48:53 +0200
committerEike Rathke <erack@redhat.com>2017-05-12 17:54:36 +0200
commit534746c99e88270ec766aeb12970a282a0a16520 (patch)
tree3ceec49c4763a5ffb8b3195a3c35d826cf3dc2d3
parentc882c60f54cc90740a674eed8c47bde0e9959652 (diff)
Introduce and check FormulaTokenArray::mbFinalized to not add further tokens
Obviously after FormulaTokenArray::Assign() or the copy-ctor for that matter, new tokens can not be added anymore to the shrunk code array. We don't do it, but ensure that it isn't done in future.. Change-Id: Ibc0115f9f38e9745028a7459c61408c188783d03
-rw-r--r--formula/source/core/api/token.cxx14
-rw-r--r--include/formula/tokenarray.hxx7
2 files changed, 17 insertions, 4 deletions
diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx
index cc5a93573fe5..63afd00cfc36 100644
--- a/formula/source/core/api/token.cxx
+++ b/formula/source/core/api/token.cxx
@@ -728,7 +728,8 @@ FormulaTokenArray::FormulaTokenArray() :
nMode(ScRecalcMode::NORMAL),
bHyperLink(false),
mbFromRangeName(false),
- mbShareable(true)
+ mbShareable(true),
+ mbFinalized(false)
{
}
@@ -752,6 +753,7 @@ void FormulaTokenArray::Assign( const FormulaTokenArray& r )
bHyperLink = r.bHyperLink;
mbFromRangeName = r.mbFromRangeName;
mbShareable = r.mbShareable;
+ mbFinalized = r.mbFinalized;
pCode = nullptr;
pRPN = nullptr;
FormulaToken** pp;
@@ -761,6 +763,7 @@ void FormulaTokenArray::Assign( const FormulaTokenArray& r )
memcpy( pp, r.pCode, nLen * sizeof( FormulaToken* ) );
for( sal_uInt16 i = 0; i < nLen; i++ )
(*pp++)->IncRef();
+ mbFinalized = true;
}
if( nRPN )
{
@@ -779,6 +782,7 @@ void FormulaTokenArray::Assign( sal_uInt16 nCode, FormulaToken **pTokens )
nLen = nCode;
pCode = new FormulaToken*[ nLen ];
+ mbFinalized = true;
for( sal_uInt16 i = 0; i < nLen; i++ )
{
@@ -814,6 +818,7 @@ void FormulaTokenArray::Clear()
bHyperLink = false;
mbFromRangeName = false;
mbShareable = true;
+ mbFinalized = false;
ClearRecalcMode();
}
@@ -923,6 +928,13 @@ sal_uInt16 FormulaTokenArray::RemoveToken( sal_uInt16 nOffset, sal_uInt16 nCount
FormulaToken* FormulaTokenArray::Add( FormulaToken* t )
{
+ assert(!mbFinalized);
+ if (mbFinalized)
+ {
+ t->DeleteIfZeroRef();
+ return nullptr;
+ }
+
if( !pCode )
pCode = new FormulaToken*[ FORMULA_MAXTOKENS ];
if( nLen < FORMULA_MAXTOKENS - 1 )
diff --git a/include/formula/tokenarray.hxx b/include/formula/tokenarray.hxx
index 39e326b63ade..f7a8228a0d0e 100644
--- a/include/formula/tokenarray.hxx
+++ b/include/formula/tokenarray.hxx
@@ -125,9 +125,10 @@ protected:
sal_uInt16 nIndex; // Current step index
FormulaError nError; // Error code
ScRecalcMode nMode; // Flags to indicate when to recalc this code
- bool bHyperLink; // If HYPERLINK() occurs in the formula.
- bool mbFromRangeName; // If this array originates from a named expression
- bool mbShareable; // Whether or not it can be shared with adjacent cells.
+ bool bHyperLink :1; // If HYPERLINK() occurs in the formula.
+ bool mbFromRangeName :1; // If this array originates from a named expression
+ bool mbShareable :1; // Whether or not it can be shared with adjacent cells.
+ bool mbFinalized :1; // Whether code arrays have their final used size and no more tokens can be added.
protected:
void Assign( const FormulaTokenArray& );