formula/source/core/api/FormulaCompiler.cxx | 43 ++++++++++++++++------------ formula/source/ui/dlg/formula.cxx | 4 +- include/formula/FormulaCompiler.hxx | 11 +++---- sc/inc/compiler.hxx | 8 ++--- sc/source/core/data/formulacell.cxx | 2 + sc/source/core/data/grouptokenconverter.cxx | 4 -- sc/source/core/opencl/formulagroupcl.cxx | 14 ++++----- sc/source/core/tool/compiler.cxx | 13 ++++++-- sc/source/core/tool/token.cxx | 9 ++++- sc/source/ui/miscdlgs/anyrefdg.cxx | 3 + sc/source/ui/unoobj/tokenuno.cxx | 4 +- 11 files changed, 68 insertions(+), 47 deletions(-)
New commits: commit d459c3648c28981250809ae3e3cf02dde7157f51 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed May 14 13:12:21 2014 -0400 Enable vectorization for the "jump" function opcodes. Change-Id: I24333db598943a0984fb1abb603e90b79d37d845 diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx index 0bc46f9..4f4cbf6 100644 --- a/sc/source/core/tool/token.cxx +++ b/sc/source/core/tool/token.cxx @@ -1328,10 +1328,15 @@ void ScTokenArray::CheckToken( const FormulaToken& r ) if (SC_OPCODE_START_FUNCTION <= eOp && eOp < SC_OPCODE_STOP_FUNCTION) { - // This is a function opcode. For now, we only support vectorization - // for min, max, sum and average. + // We support vectorization for the following opcodes. switch (eOp) { + case ocIf: + case ocIfError: + case ocIfNA: + case ocChose: + // Jump commands are now supported. + break; case ocAverage: case ocMin: case ocMinA: commit 17774c46a470dbcd35c9efd2c730acb396dc6539 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed May 14 13:01:17 2014 -0400 Disable jump command reordering of RPN tokens for OpenCL interpreter. Change-Id: I03e1e8a8cda1ff88b1d65876ffc27605090f1f4d diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index 0c2755b..78c847e 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -3678,6 +3678,8 @@ bool ScFormulaCell::InterpretFormulaGroup() return false; } + // The converted code does not have RPN tokens yet. The interpreter will + // generate them. mxGroup->meCalcState = sc::GroupCalcRunning; if (!sc::FormulaGroupInterpreter::getStatic()->interpret(*pDocument, mxGroup->mpTopCell->aPos, mxGroup, aCode)) { diff --git a/sc/source/core/data/grouptokenconverter.cxx b/sc/source/core/data/grouptokenconverter.cxx index 47585fd..a43efb0 100644 --- a/sc/source/core/data/grouptokenconverter.cxx +++ b/sc/source/core/data/grouptokenconverter.cxx @@ -226,10 +226,6 @@ bool ScGroupTokenConverter::convert(ScTokenArray& rCode) } } - ScCompiler aComp(&mrDoc, mrPos, mrGroupTokens); - aComp.SetGrammar(mrDoc.GetGrammar()); - aComp.CompileTokenArray(); // Regenerate RPN tokens. - return true; } diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index d4873b6..7066c4f 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -3433,20 +3433,20 @@ CompiledFormula* FormulaGroupInterpreterOpenCL::createCompiledFormula(ScDocument ScFormulaCellGroup& rGroup, ScTokenArray& rCode) { - ScTokenArray aConvertedCode; - ScGroupTokenConverter aConverter(aConvertedCode, rDoc, *rGroup.mpTopCell, rTopPos); - if (!aConverter.convert(rCode) || aConvertedCode.GetLen() == 0) - return NULL; - SymbolTable::nR = rGroup.mnLength; - - return DynamicKernel::create(rDoc, rTopPos, aConvertedCode); + return DynamicKernel::create(rDoc, rTopPos, rCode); } bool FormulaGroupInterpreterOpenCL::interpret( ScDocument& rDoc, const ScAddress& rTopPos, ScFormulaCellGroupRef& xGroup, ScTokenArray& rCode ) { + ScCompiler aComp(&rDoc, rTopPos, rCode); + aComp.SetGrammar(rDoc.GetGrammar()); + // Disable special ordering for jump commands for the OpenCL interpreter. + aComp.EnableJumpCommandReorder(false); + aComp.CompileTokenArray(); // Regenerate RPN tokens. + DynamicKernel *pKernel = NULL; boost::scoped_ptr<DynamicKernel> pLocalKernel; commit ffa18f56511a91294a3f45bdee9767595e8c03f5 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed May 14 11:45:30 2014 -0400 Update the method comment and add assertion per what the comment says. Change-Id: I751e33a8bba732e3b7935fc41385ea5e1f8c8704 diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 811028c..527ad76 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -392,8 +392,9 @@ public: bool IsEnglishSymbol( const OUString& rName ); bool IsErrorConstant( const OUString& ) const; - //! _either_ CompileForFAP _or_ AutoCorrection, _not_ both - // #i101512# SetCompileForFAP is in formula::FormulaCompiler + /** + * When auto correction is set, the jump command reorder must be enabled. + */ void SetAutoCorrection( bool bVal ); void SetCloseBrackets( bool bVal ) { mbCloseBrackets = bVal; } void SetRefConvention( const Convention *pConvP ); diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index be8780e..751b98b 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -3201,6 +3201,7 @@ bool ScCompiler::IsErrorConstant( const OUString& rName ) const void ScCompiler::SetAutoCorrection( bool bVal ) { + assert(mbJumpCommandReorder); bAutoCorrect = bVal; mbStopOnError = !bVal; } commit a921d38ad4ee087355945b9a544d1957987f308f Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed May 14 11:31:33 2014 -0400 No more SetCompileForFAP(). Use respective flag setting methods instead. Change-Id: Ib2256ebac8a7e63e7e24fb35d13d47b811bd8e19 diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 59839b4..2e066af 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -980,12 +980,15 @@ sal_uInt16 FormulaCompiler::GetErrorConstant( const OUString& rName ) const return nError; } -void FormulaCompiler::SetCompileForFAP( bool bVal ) +void FormulaCompiler::EnableJumpCommandReorder( bool bEnable ) { - mbJumpCommandReorder = !bVal; - mbStopOnError = !bVal; + mbJumpCommandReorder = bEnable; } +void FormulaCompiler::EnableStopOnError( bool bEnable ) +{ + mbStopOnError = bEnable; +} void FormulaCompiler::AppendErrorConstant( OUStringBuffer& rBuffer, sal_uInt16 nError ) const { diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx index 11d36cc..3247f2a 100644 --- a/formula/source/ui/dlg/formula.cxx +++ b/formula/source/ui/dlg/formula.cxx @@ -740,7 +740,9 @@ void FormulaDlg_Impl::UpdateTokenArray( const OUString& rStrExp) } // if ( pTokens && nLen == m_aTokenList.getLength() ) FormulaCompiler aCompiler(*m_pTokenArray.get()); - aCompiler.SetCompileForFAP(true); // #i101512# special handling is needed + // #i101512# Disable special handling of jump commands. + aCompiler.EnableJumpCommandReorder(false); + aCompiler.EnableStopOnError(false); aCompiler.CompileTokenArray(); } diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx index ec1aba3..81277c9 100644 --- a/include/formula/FormulaCompiler.hxx +++ b/include/formula/FormulaCompiler.hxx @@ -227,7 +227,8 @@ public: sal_uInt16 GetErrorConstant( const OUString& rName ) const; - void SetCompileForFAP( bool bVal ); + void EnableJumpCommandReorder( bool bEnable ); + void EnableStopOnError( bool bEnable ); static bool IsOpCodeVolatile( OpCode eOp ); static bool IsOpCodeJumpCommand( OpCode eOp ); diff --git a/sc/source/ui/miscdlgs/anyrefdg.cxx b/sc/source/ui/miscdlgs/anyrefdg.cxx index 5b435f0..7e22636 100644 --- a/sc/source/ui/miscdlgs/anyrefdg.cxx +++ b/sc/source/ui/miscdlgs/anyrefdg.cxx @@ -323,7 +323,8 @@ void ScFormulaReferenceHelper::Init() pRefComp.reset( new ScCompiler( pDoc, aCursorPos) ); pRefComp->SetGrammar( pDoc->GetGrammar() ); - pRefComp->SetCompileForFAP(true); + pRefComp->EnableJumpCommandReorder(false); + pRefComp->EnableStopOnError(false); nRefTab = nTab; } diff --git a/sc/source/ui/unoobj/tokenuno.cxx b/sc/source/ui/unoobj/tokenuno.cxx index 1bde192..5cd4944 100644 --- a/sc/source/ui/unoobj/tokenuno.cxx +++ b/sc/source/ui/unoobj/tokenuno.cxx @@ -114,8 +114,8 @@ void ScFormulaParserObj::SetCompilerFlags( ScCompiler& rCompiler ) const eConv = aConvMap[mnConv]; rCompiler.SetRefConvention( eConv ); - - rCompiler.SetCompileForFAP(mbCompileFAP); + rCompiler.EnableJumpCommandReorder(!mbCompileFAP); + rCompiler.EnableStopOnError(!mbCompileFAP); rCompiler.SetExternalLinks( maExternalLinks); } commit 69a7e7440cdafbaeddd344f61cc5dfe54750d509 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed May 14 11:17:13 2014 -0400 Use "stop on error" concept rather than "ignore error if true". Just to keep the pattern of "true" -> "action", "false" -> "no action". Change-Id: I6303bc779cd7048eef2fdc3c2abba8be8f15da6d diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 02c7a5e..59839b4 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -537,9 +537,9 @@ FormulaCompiler::FormulaCompiler( FormulaTokenArray& rArr ) meGrammar( formula::FormulaGrammar::GRAM_UNSPECIFIED ), bAutoCorrect( false ), bCorrected( false ), - bIgnoreErrors( false ), glSubTotal( false ), - mbJumpCommandReorder(true) + mbJumpCommandReorder(true), + mbStopOnError(true) { } @@ -555,9 +555,9 @@ FormulaCompiler::FormulaCompiler() meGrammar( formula::FormulaGrammar::GRAM_UNSPECIFIED ), bAutoCorrect( false ), bCorrected( false ), - bIgnoreErrors( false ), glSubTotal( false ), - mbJumpCommandReorder(true) + mbJumpCommandReorder(true), + mbStopOnError(true) { } @@ -983,7 +983,7 @@ sal_uInt16 FormulaCompiler::GetErrorConstant( const OUString& rName ) const void FormulaCompiler::SetCompileForFAP( bool bVal ) { mbJumpCommandReorder = !bVal; - bIgnoreErrors = bVal; + mbStopOnError = !bVal; } @@ -1041,7 +1041,7 @@ bool FormulaCompiler::GetToken() aCorrectedSymbol = ""; } bool bStop = false; - if( pArr->GetCodeError() && !bIgnoreErrors ) + if (pArr->GetCodeError() && mbStopOnError) bStop = true; else { @@ -1119,7 +1119,7 @@ bool FormulaCompiler::GetToken() // RPN creation by recursion void FormulaCompiler::Factor() { - if ( pArr->GetCodeError() && !bIgnoreErrors ) + if (pArr->GetCodeError() && mbStopOnError) return; CurrentFactor pFacToken( this ); @@ -1157,7 +1157,7 @@ void FormulaCompiler::Factor() { NextToken(); eOp = Expression(); - while ((eOp == ocSep) && (!pArr->GetCodeError() || bIgnoreErrors)) + while ((eOp == ocSep) && (!pArr->GetCodeError() || !mbStopOnError)) { // range list (A1;A2) converted to (A1~A2) pFacToken = mpToken; NextToken(); @@ -1292,7 +1292,7 @@ void FormulaCompiler::Factor() if( !bNoParam ) { nSepCount++; - while ( (eOp == ocSep) && (!pArr->GetCodeError() || bIgnoreErrors) ) + while ((eOp == ocSep) && (!pArr->GetCodeError() || !mbStopOnError)) { nSepCount++; NextToken(); @@ -1364,7 +1364,7 @@ void FormulaCompiler::Factor() } short nJumpCount = 0; while ( (nJumpCount < (FORMULA_MAXJUMPCOUNT - 1)) && (eOp == ocSep) - && (!pArr->GetCodeError() || bIgnoreErrors) ) + && (!pArr->GetCodeError() || !mbStopOnError)) { if ( ++nJumpCount <= nJumpMax ) pFacToken->GetJump()[nJumpCount] = pc-1; @@ -1641,7 +1641,7 @@ bool FormulaCompiler::CompileTokenArray() { glSubTotal = false; bCorrected = false; - if( !pArr->GetCodeError() || bIgnoreErrors ) + if (!pArr->GetCodeError() || !mbStopOnError) { if ( bAutoCorrect ) { @@ -1684,7 +1684,7 @@ bool FormulaCompiler::CompileTokenArray() if( !pArr->GetCodeError() && nErrorBeforePop ) pArr->SetCodeError( nErrorBeforePop); - if( pArr->GetCodeError() && !bIgnoreErrors ) + if (pArr->GetCodeError() && mbStopOnError) { pArr->DelRPN(); pArr->SetHyperLink( false); diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx index 8d4627e..ec1aba3 100644 --- a/include/formula/FormulaCompiler.hxx +++ b/include/formula/FormulaCompiler.hxx @@ -337,11 +337,10 @@ protected: bool bAutoCorrect; // whether to apply AutoCorrection bool bCorrected; // AutoCorrection was applied - bool bIgnoreErrors; // on AutoCorrect and CompileForFAP - // ignore errors and create RPN nevertheless bool glSubTotal; // if code contains one or more subtotal functions bool mbJumpCommandReorder; /// Whether or not to reorder RPN for jump commands. + bool mbStopOnError; /// Whether to stop compilation on first encountered error. private: void InitSymbolsNative() const; /// only SymbolsNative, on first document creation diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 8ea5c77..811028c 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -394,8 +394,7 @@ public: //! _either_ CompileForFAP _or_ AutoCorrection, _not_ both // #i101512# SetCompileForFAP is in formula::FormulaCompiler - void SetAutoCorrection( bool bVal ) - { bAutoCorrect = bVal; bIgnoreErrors = bVal; } + void SetAutoCorrection( bool bVal ); void SetCloseBrackets( bool bVal ) { mbCloseBrackets = bVal; } void SetRefConvention( const Convention *pConvP ); void SetRefConvention( const formula::FormulaGrammar::AddressConvention eConv ); diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 9f5c51b..be8780e 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -3199,6 +3199,12 @@ bool ScCompiler::IsErrorConstant( const OUString& rName ) const return false; } +void ScCompiler::SetAutoCorrection( bool bVal ) +{ + bAutoCorrect = bVal; + mbStopOnError = !bVal; +} + void ScCompiler::AutoCorrectParsedSymbol() { sal_Int32 nPos = aCorrectedSymbol.getLength(); commit 5db9391c0640450f3e30dfa9d2c9b8ff9c79b958 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed May 14 11:02:27 2014 -0400 Introduce a new boolean flag and use it in lieu of bCompileForFAP. To make it sound more general than "compile for FAP". Change-Id: Ia6916b6f3579a290be7d5074f809666be2bd2473 diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 7064e0f..02c7a5e 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -537,9 +537,9 @@ FormulaCompiler::FormulaCompiler( FormulaTokenArray& rArr ) meGrammar( formula::FormulaGrammar::GRAM_UNSPECIFIED ), bAutoCorrect( false ), bCorrected( false ), - bCompileForFAP( false ), bIgnoreErrors( false ), - glSubTotal( false ) + glSubTotal( false ), + mbJumpCommandReorder(true) { } @@ -555,9 +555,9 @@ FormulaCompiler::FormulaCompiler() meGrammar( formula::FormulaGrammar::GRAM_UNSPECIFIED ), bAutoCorrect( false ), bCorrected( false ), - bCompileForFAP( false ), bIgnoreErrors( false ), - glSubTotal( false ) + glSubTotal( false ), + mbJumpCommandReorder(true) { } @@ -980,6 +980,12 @@ sal_uInt16 FormulaCompiler::GetErrorConstant( const OUString& rName ) const return nError; } +void FormulaCompiler::SetCompileForFAP( bool bVal ) +{ + mbJumpCommandReorder = !bVal; + bIgnoreErrors = bVal; +} + void FormulaCompiler::AppendErrorConstant( OUStringBuffer& rBuffer, sal_uInt16 nError ) const { @@ -1121,7 +1127,7 @@ void FormulaCompiler::Factor() OpCode eOp = mpToken->GetOpCode(); if( eOp == ocPush || eOp == ocColRowNameAuto || eOp == ocMatRef || eOp == ocDBArea - || (bCompileForFAP && ((eOp == ocName) || (eOp == ocDBArea) + || (!mbJumpCommandReorder && ((eOp == ocName) || (eOp == ocDBArea) || (eOp == ocColRowName) || (eOp == ocBad))) ) { @@ -1258,7 +1264,7 @@ void FormulaCompiler::Factor() || eOp == ocOr || eOp == ocBad || ( eOp >= ocInternalBegin && eOp <= ocInternalEnd ) - || (bCompileForFAP && IsOpCodeJumpCommand(eOp))) + || (!mbJumpCommandReorder && IsOpCodeJumpCommand(eOp))) { pFacToken = mpToken; OpCode eMyLastOp = eOp; @@ -1300,7 +1306,7 @@ void FormulaCompiler::Factor() else eOp = NextToken(); // Jumps are just normal functions for the FunctionAutoPilot tree view - if ( bCompileForFAP && pFacToken->GetType() == svJump ) + if (!mbJumpCommandReorder && pFacToken->GetType() == svJump) pFacToken = new FormulaFAPToken( pFacToken->GetOpCode(), nSepCount, pFacToken ); else pFacToken->SetByte( nSepCount ); @@ -2061,7 +2067,7 @@ void FormulaCompiler::PutCode( FormulaTokenRef& p ) SetError( errCodeOverflow); return; } - if( pArr->GetCodeError() && !bCompileForFAP ) + if (pArr->GetCodeError() && mbJumpCommandReorder) return; ForceArrayOperator( p, pCurrentFactorToken); p->IncRef(); diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx index 9df22ec..8d4627e 100644 --- a/include/formula/FormulaCompiler.hxx +++ b/include/formula/FormulaCompiler.hxx @@ -227,8 +227,7 @@ public: sal_uInt16 GetErrorConstant( const OUString& rName ) const; - void SetCompileForFAP( bool bVal ) - { bCompileForFAP = bVal; bIgnoreErrors = bVal; } + void SetCompileForFAP( bool bVal ); static bool IsOpCodeVolatile( OpCode eOp ); static bool IsOpCodeJumpCommand( OpCode eOp ); @@ -338,12 +337,12 @@ protected: bool bAutoCorrect; // whether to apply AutoCorrection bool bCorrected; // AutoCorrection was applied - bool bCompileForFAP; //! not real RPN but names, for FunctionAutoPilot - // will not be resolved bool bIgnoreErrors; // on AutoCorrect and CompileForFAP // ignore errors and create RPN nevertheless bool glSubTotal; // if code contains one or more subtotal functions + bool mbJumpCommandReorder; /// Whether or not to reorder RPN for jump commands. + private: void InitSymbolsNative() const; /// only SymbolsNative, on first document creation void InitSymbolsEnglish() const; /// only SymbolsEnglish, maybe later diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 888f774..9f5c51b 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -3918,7 +3918,7 @@ bool ScCompiler::HandleRange() sal_uInt16 nErr = pRangeData->GetErrCode(); if( nErr ) SetError( errNoName ); - else if ( !bCompileForFAP ) + else if (mbJumpCommandReorder) { ScTokenArray* pNew; // put named formula into parentheses. @@ -4469,7 +4469,7 @@ bool ScCompiler::HandleSingleRef() } if ( !bFound ) SetError(errNoRef); - else if ( !bCompileForFAP ) + else if (mbJumpCommandReorder) { ScTokenArray* pNew = new ScTokenArray(); if ( bSingle ) @@ -4520,7 +4520,7 @@ bool ScCompiler::HandleDbData() ScDBData* pDBData = pDoc->GetDBCollection()->getNamedDBs().findByIndex(mpToken->GetIndex()); if ( !pDBData ) SetError(errNoName); - else if ( !bCompileForFAP ) + else if (mbJumpCommandReorder) { ScComplexRefData aRefData; aRefData.InitFlags(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits