diff options
author | Eike Rathke <erack@redhat.com> | 2015-11-16 12:23:15 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-11-16 13:25:49 +0100 |
commit | 49257e1da7e371fdea0fac080116b0511789cac7 (patch) | |
tree | c959639884536a2bb035ee0fda819c7dada565c7 /formula | |
parent | c994ce8a1d292b02e4c53f7b4061f3bbb840f874 (diff) |
Resolves: tdf#95670 propagate ForceArray per parameter
Regression of b5cd11b4b02a85a83db77ba9d8d1763f0cd88cb1
It was always wrong to propagate ForceArray already if a function had a
ForceArray parameter *somewhere*, we need to do this per parameter
instead.
Change-Id: If188d45366279d9a7bf641edc7e4dd7095d6d035
Diffstat (limited to 'formula')
-rw-r--r-- | formula/source/core/api/FormulaCompiler.cxx | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index e32a6f9abe82..00988f6509f5 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -532,6 +532,7 @@ void FormulaCompiler::OpCodeMap::putOpCode( const OUString & rStr, const OpCode FormulaCompiler::FormulaCompiler( FormulaTokenArray& rArr ) : + nCurrentFactorParam(0), pArr( &rArr ), pCode( nullptr ), pStack( nullptr ), @@ -550,6 +551,7 @@ FormulaCompiler::FormulaCompiler( FormulaTokenArray& rArr ) FormulaCompiler::FormulaCompiler() : + nCurrentFactorParam(0), pArr( nullptr ), pCode( nullptr ), pStack( nullptr ), @@ -1169,6 +1171,7 @@ void FormulaCompiler::Factor() { // range list (A1;A2) converted to (A1~A2) pFacToken = mpToken; NextToken(); + CheckSetForceArrayParameter( mpToken, 0); eOp = Expression(); // Do not ignore error here, regardless of bIgnoreErrors, otherwise // errors like =(1;) would also result in display of =(1~) @@ -1260,7 +1263,10 @@ void FormulaCompiler::Factor() if (eOp == ocClose) bNoParam = true; else + { + CheckSetForceArrayParameter( mpToken, 0); eOp = Expression(); + } } else SetError( errPairExpected); @@ -1270,8 +1276,9 @@ void FormulaCompiler::Factor() nSepCount++; while ((eOp == ocSep) && (!pArr->GetCodeError() || !mbStopOnError)) { - nSepCount++; NextToken(); + CheckSetForceArrayParameter( mpToken, nSepCount); + nSepCount++; eOp = Expression(); } } @@ -1296,6 +1303,7 @@ void FormulaCompiler::Factor() if (eOp == ocOpen) { NextToken(); + CheckSetForceArrayParameter( mpToken, 0); eOp = Expression(); } else @@ -1328,7 +1336,10 @@ void FormulaCompiler::Factor() if (eOp == ocClose) bNoParam = true; else + { + CheckSetForceArrayParameter( mpToken, 0); eOp = Expression(); + } } else if (eMyLastOp == ocBad) { @@ -1345,8 +1356,9 @@ void FormulaCompiler::Factor() nSepCount++; while ((eOp == ocSep) && (!pArr->GetCodeError() || !mbStopOnError)) { - nSepCount++; NextToken(); + CheckSetForceArrayParameter( mpToken, nSepCount); + nSepCount++; eOp = Expression(); } } @@ -1386,6 +1398,7 @@ void FormulaCompiler::Factor() if (eOp == ocOpen) { NextToken(); + CheckSetForceArrayParameter( mpToken, 0); eOp = Expression(); } else @@ -1420,6 +1433,7 @@ void FormulaCompiler::Factor() if ( ++nJumpCount <= nJumpMax ) pFacToken->GetJump()[nJumpCount] = pc-1; NextToken(); + CheckSetForceArrayParameter( mpToken, nJumpCount - 1); eOp = Expression(); // ocSep or ocClose terminate the subexpression PutCode( mpToken ); @@ -2179,7 +2193,7 @@ void FormulaCompiler::PutCode( FormulaTokenRef& p ) } if (pArr->GetCodeError() && mbJumpCommandReorder) return; - ForceArrayOperator( p, pCurrentFactorToken); + ForceArrayOperator( p); p->IncRef(); *pCode++ = p.get(); pc++; @@ -2235,6 +2249,40 @@ void FormulaCompiler::LocalizeString( OUString& /*rName*/ ) const { } +bool FormulaCompiler::IsForceArrayParameter( const FormulaToken* /*pToken*/, sal_uInt16 /*nParam*/ ) const +{ + return false; +} + +void FormulaCompiler::ForceArrayOperator( FormulaTokenRef& rCurr ) +{ + if (!pCurrentFactorToken) + return; + + if (!(rCurr->GetOpCode() != ocPush && (rCurr->GetType() == svByte || rCurr->GetType() == svJump))) + return; + + if (pCurrentFactorToken->HasForceArray()) + { + rCurr->SetForceArray( true); + return; + } + + if (nCurrentFactorParam && IsForceArrayParameter( pCurrentFactorToken.get(), + static_cast<sal_uInt8>(nCurrentFactorParam - 1))) + rCurr->SetForceArray( true); +} + +void FormulaCompiler::CheckSetForceArrayParameter( FormulaTokenRef& rCurr, sal_uInt8 nParam ) +{ + if (!pCurrentFactorToken) + return; + + nCurrentFactorParam = nParam + 1; + + ForceArrayOperator( rCurr); +} + void FormulaCompiler::PushTokenArray( FormulaTokenArray* pa, bool bTemp ) { if ( bAutoCorrect && !pStack ) |