summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Versini <arnaud.versini@gmail.com>2016-02-07 11:22:41 +0100
committerNoel Grandin <noelgrandin@gmail.com>2016-02-08 06:06:40 +0000
commitc474e610e453d0f38f7cc6cb9559ad7e7b5d69ca (patch)
treecac76efc5ef84e5544370187fab8e40245bf5a3f
parent5381db92dea6c2e11af49a48fa0b72af666f3f32 (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>
-rw-r--r--basic/source/comp/exprgen.cxx5
-rw-r--r--basic/source/comp/exprtree.cxx84
-rw-r--r--basic/source/inc/expr.hxx6
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