diff options
author | Arnaud Versini <arnaud.versini@gmail.com> | 2016-02-07 11:22:41 +0100 |
---|---|---|
committer | Noel Grandin <noelgrandin@gmail.com> | 2016-02-08 06:06:40 +0000 |
commit | c474e610e453d0f38f7cc6cb9559ad7e7b5d69ca (patch) | |
tree | cac76efc5ef84e5544370187fab8e40245bf5a3f /basic | |
parent | 5381db92dea6c2e11af49a48fa0b72af666f3f32 (diff) |
BASIC : Use vector in SbiExprList to avoid any dependencies
Change-Id: I1ae88ae9c4276452a00aadaaadebf582e639b15a
Reviewed-on: https://gerrit.libreoffice.org/22174
Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
Tested-by: Noel Grandin <noelgrandin@gmail.com>
Diffstat (limited to 'basic')
-rw-r--r-- | basic/source/comp/exprgen.cxx | 5 | ||||
-rw-r--r-- | basic/source/comp/exprtree.cxx | 84 | ||||
-rw-r--r-- | basic/source/inc/expr.hxx | 6 |
3 files changed, 19 insertions, 76 deletions
diff --git a/basic/source/comp/exprgen.cxx b/basic/source/comp/exprgen.cxx index 96efddb361bf..3d913b75653a 100644 --- a/basic/source/comp/exprgen.cxx +++ b/basic/source/comp/exprgen.cxx @@ -205,13 +205,13 @@ void SbiExprNode::GenElement( SbiCodeGen& rGen, SbiOpcode eOp ) void SbiExprList::Gen(SbiCodeGen& rGen) { - if( pFirst ) + if( !aData.empty() ) { rGen.Gen( _ARGC ); // Type adjustment at DECLARE sal_uInt16 nCount = 1; - for( SbiExpression* pExpr = pFirst; pExpr; pExpr = pExpr->pNext,nCount++ ) + for( auto& pExpr: aData ) { pExpr->Gen(); if( !pExpr->GetName().isEmpty() ) @@ -249,6 +249,7 @@ void SbiExprList::Gen(SbiCodeGen& rGen) { rGen.Gen( _ARGV ); } + nCount++; } } } diff --git a/basic/source/comp/exprtree.cxx b/basic/source/comp/exprtree.cxx index 5a153b332045..5eb665b653ff 100644 --- a/basic/source/comp/exprtree.cxx +++ b/basic/source/comp/exprtree.cxx @@ -36,7 +36,6 @@ SbiExpression::SbiExpression( SbiParser* p, SbiExprType t, nParenLevel = 0; eCurExpr = t; m_eMode = eMode; - pNext = nullptr; pExpr = (t != SbSTDEXPR ) ? Term( pKeywordSymbolInfo ) : Boolean(); if( t != SbSYMBOL ) { @@ -59,7 +58,6 @@ SbiExpression::SbiExpression( SbiParser* p, double n, SbxDataType t ) nParenLevel = 0; eCurExpr = SbOPERAND; m_eMode = EXPRMODE_STANDARD; - pNext = nullptr; pExpr = new SbiExprNode( n, t ); pExpr->Optimize(pParser); } @@ -71,7 +69,6 @@ SbiExpression::SbiExpression( SbiParser* p, const SbiSymDef& r, SbiExprList* pPa nParenLevel = 0; eCurExpr = SbOPERAND; m_eMode = EXPRMODE_STANDARD; - pNext = nullptr; pExpr = new SbiExprNode( r, SbxVARIANT, pPar ); } @@ -922,8 +919,6 @@ short SbiConstExpression::GetShortValue() SbiExprList::SbiExprList( ) { - pFirst = nullptr; - nExpr = nDim = 0; bError = false; bBracket = false; @@ -931,43 +926,22 @@ SbiExprList::SbiExprList( ) SbiExprList::~SbiExprList() { - SbiExpression* p = pFirst; - while( p ) + for (auto pExpr: aData) { - SbiExpression* q = p->pNext; - delete p; - p = q; + delete pExpr; } } - SbiExpression* SbiExprList::Get( short n ) { - SbiExpression* p = pFirst; - while( n-- && p ) - { - p = p->pNext; - } - return p; + return aData[n]; } void SbiExprList::addExpression( SbiExpression* pExpr ) { - if( !pFirst ) - { - pFirst = pExpr; - return; - } - - SbiExpression* p = pFirst; - while( p->pNext ) - { - p = p->pNext; - } - p->pNext = pExpr; + aData.push_back(pExpr); } - // the parameter list is completely parsed // "procedurename()" is OK // it's a function without parameters then @@ -984,7 +958,6 @@ SbiExprList* SbiExprList::ParseParameters( SbiParser* pParser, bool bStandaloneE return pExprList; } - SbiExpression *pExpr; SbiToken eTok = pParser->Peek(); bool bAssumeExprLParenMode = false; @@ -1013,11 +986,9 @@ SbiExprList* SbiExprList::ParseParameters( SbiParser* pParser, bool bStandaloneE return pExprList; } // read in parameter table and lay down in correct order! - SbiExpression* pLast = nullptr; - OUString aName; while( !pExprList->bError ) { - aName.clear(); + SbiExpression *pExpr; // missing argument if( eTok == COMMA ) { @@ -1070,6 +1041,7 @@ SbiExprList* SbiExprList::ParseParameters( SbiParser* pParser, bool bStandaloneE } if( !bAssumeArrayMode ) { + OUString aName; if( pParser->Peek() == ASSIGN ) { // VBA mode: name:= @@ -1082,16 +1054,7 @@ SbiExprList* SbiExprList::ParseParameters( SbiParser* pParser, bool bStandaloneE pExpr->GetName() = aName; } } - pExpr->pNext = nullptr; - if( !pLast ) - { - pExprList->pFirst = pLast = pExpr; - } - else - { - pLast->pNext = pExpr, pLast = pExpr; - } - pExprList->nExpr++; + pExprList->addExpression(pExpr); pExprList->bError = pExprList->bError || !pExpr->IsValid(); if( bAssumeArrayMode ) @@ -1130,7 +1093,7 @@ SbiExprList* SbiExprList::ParseParameters( SbiParser* pParser, bool bStandaloneE pExprList->bError = true; } } - pExprList->nDim = pExprList->nExpr; + pExprList->nDim = pExprList->GetSize(); return pExprList; } @@ -1148,45 +1111,26 @@ SbiExprList* SbiExprList::ParseDimList( SbiParser* pParser ) if( pParser->Peek() != RPAREN ) { - SbiExpression *pExpr1, *pExpr2, *pLast = nullptr; SbiToken eTok; for( ;; ) { - pExpr1 = new SbiExpression( pParser ); + SbiExpression* pExpr1 = new SbiExpression( pParser ); eTok = pParser->Next(); if( eTok == TO ) { - pExpr2 = new SbiExpression( pParser ); - eTok = pParser->Next(); + SbiExpression* pExpr2 = new SbiExpression( pParser ); pExpr1->ConvertToIntConstIfPossible(), pExpr2->ConvertToIntConstIfPossible(); + eTok = pParser->Next(); pExprList->bError = pExprList->bError || !pExpr1->IsValid() || !pExpr2->IsValid(); - pExpr1->pNext = pExpr2; - if( !pLast ) - { - pExprList->pFirst = pExpr1; - } - else - { - pLast->pNext = pExpr1; - } - pLast = pExpr2; - pExprList->nExpr += 2; + pExprList->addExpression(pExpr1); + pExprList->addExpression(pExpr2); } else { pExpr1->SetBased(); - pExpr1->pNext = nullptr; pExpr1->ConvertToIntConstIfPossible(); pExprList->bError = pExprList->bError || !pExpr1->IsValid(); - if( !pLast ) - { - pExprList->pFirst = pLast = pExpr1; - } - else - { - pLast->pNext = pExpr1, pLast = pExpr1; - } - pExprList->nExpr++; + pExprList->addExpression(pExpr1); } pExprList->nDim++; if( eTok == RPAREN ) break; diff --git a/basic/source/inc/expr.hxx b/basic/source/inc/expr.hxx index eac1c8a75966..09fed34fdad6 100644 --- a/basic/source/inc/expr.hxx +++ b/basic/source/inc/expr.hxx @@ -160,7 +160,6 @@ class SbiExpression { protected: OUString aArgName; SbiParser* pParser; - SbiExpression* pNext; // link at parameter lists SbiExprNode* pExpr; // expression tree SbiExprType eCurExpr; // type of expression SbiExprMode m_eMode; // expression context @@ -218,8 +217,7 @@ public: // numeric constant }; class SbiExprList final { // class for parameters and dims - SbiExpression* pFirst; - short nExpr; + std::vector<SbiExpression*> aData; short nDim; bool bError; bool bBracket; @@ -230,7 +228,7 @@ public: static SbiExprList* ParseDimList( SbiParser* ); bool IsBracket() { return bBracket; } bool IsValid() { return !bError; } - short GetSize() { return nExpr; } + short GetSize() { return aData.size(); } short GetDims() { return nDim; } SbiExpression* Get( short ); void Gen( SbiCodeGen& rGen); // code generation |