Related: tdf#137543 - fix LET function jump count number
Clean-up and fix wrong jump count.
Change-Id: Ie64ff95f63c17d2726b3a522af981bcaea2a9a32
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168590
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
Tested-by: Jenkins
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx
index 453c730..8f0dd62 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -1955,7 +1955,7 @@ void FormulaCompiler::Factor()
pFacToken->GetJump()[ 0 ] = FORMULA_MAXJUMPCOUNT + 1;
break;
case ocLet:
pFacToken->GetJump()[0] = SAL_MAX_UINT8 + 1;
pFacToken->GetJump()[ 0 ] = FORMULA_MAXPARAMS + 1;
break;
case ocIfError:
case ocIfNA:
@@ -1990,7 +1990,7 @@ void FormulaCompiler::Factor()
nJumpMax = FORMULA_MAXJUMPCOUNT;
break;
case ocLet:
nJumpMax = SAL_MAX_UINT8;
nJumpMax = FORMULA_MAXPARAMS;
break;
case ocIfError:
case ocIfNA:
@@ -2007,7 +2007,7 @@ void FormulaCompiler::Factor()
assert(!"FormulaCompiler::Factor: someone forgot to add a jump max case");
}
short nJumpCount = 0;
while ( (nJumpCount < (SAL_MAX_UINT8 - 1)) && (eOp == ocSep)
while ( (nJumpCount < (FORMULA_MAXPARAMS - 1)) && (eOp == ocSep)
&& (pArr->GetCodeError() == FormulaError::NONE || !mbStopOnError))
{
if ( ++nJumpCount <= nJumpMax )
@@ -2037,7 +2037,7 @@ void FormulaCompiler::Factor()
bLimitOk = (nJumpCount < FORMULA_MAXJUMPCOUNT);
break;
case ocLet:
bLimitOk = (nJumpCount < SAL_MAX_UINT8);
bLimitOk = (nJumpCount < FORMULA_MAXPARAMS);
break;
case ocIfError:
case ocIfNA:
diff --git a/formula/source/core/api/token.cxx b/formula/source/core/api/token.cxx
index d722d76..c812467 100644
--- a/formula/source/core/api/token.cxx
+++ b/formula/source/core/api/token.cxx
@@ -1584,13 +1584,13 @@ FormulaToken* FormulaTokenArray::AddOpCode( OpCode eOp )
case ocChoose:
case ocLet:
{
short nJump[SAL_MAX_UINT8 + 1];
short nJump[FORMULA_MAXPARAMS + 1];
if ( eOp == ocIf )
nJump[ 0 ] = 3;
else if ( eOp == ocChoose )
nJump[ 0 ] = FORMULA_MAXJUMPCOUNT + 1;
else if ( eOp == ocLet )
nJump[0] = SAL_MAX_UINT8 + 1;
nJump[ 0 ] = FORMULA_MAXPARAMS + 1;
else
nJump[ 0 ] = 2;
pRet = new FormulaJumpToken( eOp, nJump );
diff --git a/include/formula/tokenarray.hxx b/include/formula/tokenarray.hxx
index 4e59ca8..98e1f4d 100644
--- a/include/formula/tokenarray.hxx
+++ b/include/formula/tokenarray.hxx
@@ -579,7 +579,6 @@ public:
private:
SAL_DLLPRIVATE const FormulaToken* GetNonEndOfPathToken( short nIdx ) const;
SAL_DLLPRIVATE const FormulaToken* GetNonEndOfPathToken2( short nIdx ) const;
};
// For use in SAL_INFO, SAL_WARN etc
diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx
index ba53dbb..7041360 100644
--- a/sc/inc/compiler.hxx
+++ b/sc/inc/compiler.hxx
@@ -138,7 +138,7 @@ public:
} sharedstring;
ScMatrix* pMat;
FormulaError nError;
short nJump[ FORMULA_MAXJUMPCOUNT + 1 ]; // If/Chose token
short nJump[ FORMULA_MAXPARAMS + 1 ]; // If/Choose/Let token
};
OUString maExternalName; // depending on the opcode, this is either the external, or the external name, or the external table name
diff --git a/sc/source/core/tool/parclass.cxx b/sc/source/core/tool/parclass.cxx
index d920807..a38f0f7 100644
--- a/sc/source/core/tool/parclass.cxx
+++ b/sc/source/core/tool/parclass.cxx
@@ -571,12 +571,12 @@ void ScParameterClassification::GenerateDocumentation()
switch ( eOp )
{
case ocIf:
case ocLet:
aToken.SetByte(3);
break;
case ocIfError:
case ocIfNA:
case ocChoose:
case ocLet:
aToken.SetByte(2);
break;
case ocPercentSign:
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 2c63eb2..9881f33 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -223,7 +223,7 @@ void ScRawToken::SetOpCode( OpCode e )
break;
case ocLet:
eType = svJump;
nJump[0] = SAL_MAX_UINT8;
nJump[ 0 ] = FORMULA_MAXPARAMS + 1;
break;
case ocMissing:
eType = svMissing;