summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2014-06-13 10:50:27 +0200
committerAndras Timar <andras.timar@collabora.com>2014-06-18 14:33:57 +0200
commit5c99b24143d094cbde671b9f593ee7945b074cfd (patch)
tree14195ee07679fe3146a27abfcf3ee0b26a12eb56 /include
parentb7b7741627dfe0ec4374a47a59a478e64a93f10d (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>
Diffstat (limited to 'include')
-rw-r--r--include/formula/FormulaCompiler.hxx6
-rw-r--r--include/formula/token.hxx9
2 files changed, 10 insertions, 5 deletions
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 );
};