diff options
author | Eike Rathke <erack@redhat.com> | 2014-06-13 10:50:27 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-06-17 14:12:06 +0000 |
commit | 35e31aac7224676b383d63ed4591bbc9c6ba4c08 (patch) | |
tree | 898faf06598016f6cfe0a381a65ef88357f0c9d2 | |
parent | 9650f663ade4696416b59b5f3976b45d1300554e (diff) |
resolved fdo#79957 propagate ForceArray through jump tokens
ForceArray parameters weren't propagated and enforced to array arguments
on svJump tokens (FormulaJumpToken), namely IF, CHOOSE, IFERROR and
IFNA.
(cherry picked from commit c9d037e5e8e5850e9c69372580e7a506b573fc2a)
Conflicts:
include/formula/token.hxx
Change-Id: Icf9074f11b826655a52858d778d9a0122d207aa4
Reviewed-on: https://gerrit.libreoffice.org/9767
Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Tested-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
-rw-r--r-- | formula/source/core/api/token.cxx | 7 | ||||
-rw-r--r-- | include/formula/FormulaCompiler.hxx | 6 | ||||
-rw-r--r-- | include/formula/token.hxx | 9 | ||||
-rw-r--r-- | sc/source/core/inc/interpre.hxx | 2 |
4 files changed, 17 insertions, 7 deletions
diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx index 3777d094ade2..e933a342d478 100644 --- a/formula/source/core/api/token.cxx +++ b/formula/source/core/api/token.cxx @@ -275,11 +275,16 @@ bool FormulaFAPToken::operator==( const FormulaToken& r ) const { return FormulaByteToken::operator==( r ) && pOrigToken == r.GetFAPOrigToken(); } + + short* FormulaJumpToken::GetJump() const { return pJump; } +bool FormulaJumpToken::HasForceArray() const { return bHasForceArray; } +void FormulaJumpToken::SetForceArray( bool b ) { bHasForceArray = b; } bool FormulaJumpToken::operator==( const FormulaToken& r ) const { return FormulaToken::operator==( r ) && pJump[0] == r.GetJump()[0] && - memcmp( pJump+1, r.GetJump()+1, pJump[0] * sizeof(short) ) == 0; + memcmp( pJump+1, r.GetJump()+1, pJump[0] * sizeof(short) ) == 0 && + bHasForceArray == r.HasForceArray(); } FormulaJumpToken::~FormulaJumpToken() { diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx index 591103a1deaf..e2d6edd1d439 100644 --- a/include/formula/FormulaCompiler.hxx +++ b/include/formula/FormulaCompiler.hxx @@ -356,9 +356,9 @@ private: static inline void ForceArrayOperator( FormulaTokenRef& rCurr, const FormulaTokenRef& rPrev ) { - if ( rPrev && rPrev->HasForceArray() && - rCurr->GetType() == svByte && rCurr->GetOpCode() != ocPush - && !rCurr->HasForceArray() ) + if ( rPrev && rPrev->HasForceArray() && rCurr->GetOpCode() != ocPush && + (rCurr->GetType() == svByte || rCurr->GetType() == svJump) && + !rCurr->HasForceArray() ) rCurr->SetForceArray( true); } diff --git a/include/formula/token.hxx b/include/formula/token.hxx index 002cefbb8a21..f09fbaee931f 100644 --- a/include/formula/token.hxx +++ b/include/formula/token.hxx @@ -356,15 +356,18 @@ class FORMULA_DLLPUBLIC FormulaJumpToken : public FormulaToken { private: short* pJump; + bool bHasForceArray; public: FormulaJumpToken( OpCode e, short* p ) : - FormulaToken( formula::svJump , e) + FormulaToken( formula::svJump , e), + bHasForceArray( false) { pJump = new short[ p[0] + 1 ]; memcpy( pJump, p, (p[0] + 1) * sizeof(short) ); } FormulaJumpToken( const FormulaJumpToken& r ) : - FormulaToken( r ) + FormulaToken( r ), + bHasForceArray( r.bHasForceArray) { pJump = new short[ r.pJump[0] + 1 ]; memcpy( pJump, r.pJump, (r.pJump[0] + 1) * sizeof(short) ); @@ -373,6 +376,8 @@ public: virtual short* GetJump() const; virtual bool operator==( const formula::FormulaToken& rToken ) const; virtual FormulaToken* Clone() const { return new FormulaJumpToken(*this); } + virtual bool HasForceArray() const; + virtual void SetForceArray( bool b ); }; diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index aa2dd73982c6..d082648b8758 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -867,7 +867,7 @@ public: inline void ScInterpreter::MatrixDoubleRefToMatrix() { - if ( bMatrixFormula && GetStackType() == formula::svDoubleRef ) + if ( (bMatrixFormula || pCur->HasForceArray()) && GetStackType() == formula::svDoubleRef ) { GetTokenMatrixMap(); // make sure it exists, create if not. PopDoubleRefPushMatrix(); |