Kaydet (Commit) fabe3294 authored tarafından Arnaud Versini's avatar Arnaud Versini Kaydeden (comit) David Tardon

BASIC : Remove SbCodeGen attribute from SbiExprNode and user std::unique_ptr.

Change-Id: I9f44f6a4b61987de960b77f54bac8cf2c981bd2a
Reviewed-on: https://gerrit.libreoffice.org/16551Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarDavid Tardon <dtardon@redhat.com>
üst fb288951
...@@ -56,7 +56,7 @@ static const OpTable aOpTable [] = { ...@@ -56,7 +56,7 @@ static const OpTable aOpTable [] = {
{ NIL, _NOP }}; { NIL, _NOP }};
// Output of an element // Output of an element
void SbiExprNode::Gen( RecursiveMode eRecMode ) void SbiExprNode::Gen( SbiCodeGen& rGen, RecursiveMode eRecMode )
{ {
sal_uInt16 nStringId; sal_uInt16 nStringId;
...@@ -65,18 +65,18 @@ void SbiExprNode::Gen( RecursiveMode eRecMode ) ...@@ -65,18 +65,18 @@ void SbiExprNode::Gen( RecursiveMode eRecMode )
switch( GetType() ) switch( GetType() )
{ {
case SbxEMPTY: case SbxEMPTY:
pGen->Gen( _EMPTY ); rGen.Gen( _EMPTY );
break; break;
case SbxINTEGER: case SbxINTEGER:
pGen->Gen( _CONST, (short) nVal ); rGen.Gen( _CONST, (short) nVal );
break; break;
case SbxSTRING: case SbxSTRING:
nStringId = pGen->GetParser()->aGblStrings.Add( aStrVal, true ); nStringId = rGen.GetParser()->aGblStrings.Add( aStrVal, true );
pGen->Gen( _SCONST, nStringId ); rGen.Gen( _SCONST, nStringId );
break; break;
default: default:
nStringId = pGen->GetParser()->aGblStrings.Add( nVal, eType ); nStringId = rGen.GetParser()->aGblStrings.Add( nVal, eType );
pGen->Gen( _NUMBER, nStringId ); rGen.Gen( _NUMBER, nStringId );
break; break;
} }
} }
...@@ -122,7 +122,7 @@ void SbiExprNode::Gen( RecursiveMode eRecMode ) ...@@ -122,7 +122,7 @@ void SbiExprNode::Gen( RecursiveMode eRecMode )
{ {
SbiProcDef* pProc = aVar.pDef->GetProcDef(); SbiProcDef* pProc = aVar.pDef->GetProcDef();
if ( pGen->GetParser()->bClassModule ) if ( rGen.GetParser()->bClassModule )
{ {
eOp = _FIND_CM; eOp = _FIND_CM;
} }
...@@ -135,33 +135,33 @@ void SbiExprNode::Gen( RecursiveMode eRecMode ) ...@@ -135,33 +135,33 @@ void SbiExprNode::Gen( RecursiveMode eRecMode )
{ {
if( p == this && pWithParent_ != NULL ) if( p == this && pWithParent_ != NULL )
{ {
pWithParent_->Gen(); pWithParent_->Gen(rGen);
} }
p->GenElement( eOp ); p->GenElement( rGen, eOp );
eOp = _ELEM; eOp = _ELEM;
} }
} }
else if( IsTypeOf() ) else if( IsTypeOf() )
{ {
pLeft->Gen(); pLeft->Gen(rGen);
pGen->Gen( _TESTCLASS, nTypeStrId ); rGen.Gen( _TESTCLASS, nTypeStrId );
} }
else if( IsNew() ) else if( IsNew() )
{ {
pGen->Gen( _CREATE, 0, nTypeStrId ); rGen.Gen( _CREATE, 0, nTypeStrId );
} }
else else
{ {
pLeft->Gen(); pLeft->Gen(rGen);
if( pRight ) if( pRight )
{ {
pRight->Gen(); pRight->Gen(rGen);
} }
for( const OpTable* p = aOpTable; p->eTok != NIL; p++ ) for( const OpTable* p = aOpTable; p->eTok != NIL; p++ )
{ {
if( p->eTok == eTok ) if( p->eTok == eTok )
{ {
pGen->Gen( p->eOp ); break; rGen.Gen( p->eOp ); break;
} }
} }
} }
...@@ -169,7 +169,7 @@ void SbiExprNode::Gen( RecursiveMode eRecMode ) ...@@ -169,7 +169,7 @@ void SbiExprNode::Gen( RecursiveMode eRecMode )
// Output of an operand element // Output of an operand element
void SbiExprNode::GenElement( SbiOpcode eOp ) void SbiExprNode::GenElement( SbiCodeGen& rGen, SbiOpcode eOp )
{ {
#ifdef DBG_UTIL #ifdef DBG_UTIL
if ((eOp < _RTL || eOp > _CALLC) && eOp != _FIND_G && eOp != _FIND_CM && eOp != _FIND_STATIC) if ((eOp < _RTL || eOp > _CALLC) && eOp != _FIND_G && eOp != _FIND_CM && eOp != _FIND_STATIC)
...@@ -187,7 +187,7 @@ void SbiExprNode::GenElement( SbiOpcode eOp ) ...@@ -187,7 +187,7 @@ void SbiExprNode::GenElement( SbiOpcode eOp )
aVar.pPar->Gen(); aVar.pPar->Gen();
} }
pGen->Gen( eOp, nId, sal::static_int_cast< sal_uInt16 >( GetType() ) ); rGen.Gen( eOp, nId, sal::static_int_cast< sal_uInt16 >( GetType() ) );
if( aVar.pvMorePar ) if( aVar.pvMorePar )
{ {
...@@ -197,7 +197,7 @@ void SbiExprNode::GenElement( SbiOpcode eOp ) ...@@ -197,7 +197,7 @@ void SbiExprNode::GenElement( SbiOpcode eOp )
{ {
SbiExprList* pExprList = *it; SbiExprList* pExprList = *it;
pExprList->Gen(); pExprList->Gen();
pGen->Gen( _ARRAYACCESS ); rGen.Gen( _ARRAYACCESS );
} }
} }
} }
...@@ -260,7 +260,7 @@ void SbiExpression::Gen( RecursiveMode eRecMode ) ...@@ -260,7 +260,7 @@ void SbiExpression::Gen( RecursiveMode eRecMode )
{ {
// special treatment for WITH // special treatment for WITH
// If pExpr == .-term in With, approximately Gen for Basis-Object // If pExpr == .-term in With, approximately Gen for Basis-Object
pExpr->Gen( eRecMode ); pExpr->Gen( pParser->aGen, eRecMode );
if( bByVal ) if( bByVal )
{ {
pParser->aGen.Gen( _BYVAL ); pParser->aGen.Gen( _BYVAL );
......
...@@ -26,54 +26,44 @@ ...@@ -26,54 +26,44 @@
#include "expr.hxx" #include "expr.hxx"
SbiExprNode::SbiExprNode() SbiExprNode::SbiExprNode( SbiExprNode* l, SbiToken t, SbiExprNode* r ) :
pLeft(l),
pRight(r),
pWithParent(NULL),
eNodeType(SbxNODE),
eType(SbxVARIANT), // Nodes are always Variant
eTok(t),
bError(false)
{ {
pLeft = NULL;
pRight = NULL;
pWithParent = NULL;
pGen = NULL;
eNodeType = SbxDUMMY;
eType = SbxVARIANT;
eTok = NIL;
bError = false;
} }
SbiExprNode::SbiExprNode( SbiParser* p, SbiExprNode* l, SbiToken t, SbiExprNode* r ) SbiExprNode::SbiExprNode( double n, SbxDataType t ):
nVal(n),
pWithParent(NULL),
eNodeType(SbxNUMVAL),
eType(t),
eTok(NIL),
bError(false)
{ {
BaseInit( p );
pLeft = l;
pRight = r;
eTok = t;
nVal = 0;
eType = SbxVARIANT; // Nodes are always Variant
eNodeType = SbxNODE;
} }
SbiExprNode::SbiExprNode( SbiParser* p, double n, SbxDataType t ) SbiExprNode::SbiExprNode( const OUString& rVal ):
aStrVal(rVal),
pWithParent(NULL),
eNodeType(SbxSTRVAL),
eType(SbxSTRING),
eTok(NIL),
bError(false)
{ {
BaseInit( p );
eType = t;
eNodeType = SbxNUMVAL;
nVal = n;
}
SbiExprNode::SbiExprNode( SbiParser* p, const OUString& rVal )
{
BaseInit( p );
eType = SbxSTRING;
eNodeType = SbxSTRVAL;
aStrVal = rVal;
} }
SbiExprNode::SbiExprNode( SbiParser* p, const SbiSymDef& r, SbxDataType t, SbiExprList* l ) SbiExprNode::SbiExprNode( const SbiSymDef& r, SbxDataType t, SbiExprList* l ) :
pWithParent(NULL),
eNodeType(SbxVARVAL),
eTok(NIL),
bError(false)
{ {
BaseInit( p );
eType = ( t == SbxVARIANT ) ? r.GetType() : t; eType = ( t == SbxVARIANT ) ? r.GetType() : t;
eNodeType = SbxVARVAL;
aVar.pDef = const_cast<SbiSymDef*>(&r); aVar.pDef = const_cast<SbiSymDef*>(&r);
aVar.pPar = l; aVar.pPar = l;
aVar.pvMorePar = NULL; aVar.pvMorePar = NULL;
...@@ -81,41 +71,39 @@ SbiExprNode::SbiExprNode( SbiParser* p, const SbiSymDef& r, SbxDataType t, SbiEx ...@@ -81,41 +71,39 @@ SbiExprNode::SbiExprNode( SbiParser* p, const SbiSymDef& r, SbxDataType t, SbiEx
} }
// #120061 TypeOf // #120061 TypeOf
SbiExprNode::SbiExprNode( SbiParser* p, SbiExprNode* l, sal_uInt16 nId ) SbiExprNode::SbiExprNode( SbiExprNode* l, sal_uInt16 nId ) :
nTypeStrId(nId),
pLeft(l),
pWithParent(NULL),
eNodeType(SbxTYPEOF),
eType(SbxBOOL),
eTok(NIL),
bError(false)
{ {
BaseInit( p );
pLeft = l;
eType = SbxBOOL;
eNodeType = SbxTYPEOF;
nTypeStrId = nId;
} }
// new <type> // new <type>
SbiExprNode::SbiExprNode( SbiParser* p, sal_uInt16 nId ) SbiExprNode::SbiExprNode( sal_uInt16 nId ) :
nTypeStrId(nId),
pWithParent(NULL),
eNodeType(SbxNEW),
eType(SbxOBJECT),
eTok(NIL),
bError(false)
{ {
BaseInit( p );
eType = SbxOBJECT;
eNodeType = SbxNEW;
nTypeStrId = nId;
} }
// From 1995-12-17, auxiliary function for Ctor for the uniform initialisation SbiExprNode::SbiExprNode() :
void SbiExprNode::BaseInit( SbiParser* p ) pWithParent(NULL),
eNodeType(SbxDUMMY),
eType(SbxVARIANT),
eTok(NIL),
bError(false)
{ {
pGen = &p->aGen;
eTok = NIL;
pLeft = NULL;
pRight = NULL;
pWithParent = NULL;
bError = false;
} }
SbiExprNode::~SbiExprNode() SbiExprNode::~SbiExprNode()
{ {
delete pLeft;
delete pRight;
if( IsVariable() ) if( IsVariable() )
{ {
delete aVar.pPar; delete aVar.pPar;
...@@ -217,9 +205,9 @@ short SbiExprNode::GetDepth() ...@@ -217,9 +205,9 @@ short SbiExprNode::GetDepth()
// 3. Conversion of the operans into Strings // 3. Conversion of the operans into Strings
// 4. Lifting of the composite- and error-bits // 4. Lifting of the composite- and error-bits
void SbiExprNode::Optimize() void SbiExprNode::Optimize(SbiParser* pParser)
{ {
FoldConstants(); FoldConstants(pParser);
CollectBits(); CollectBits();
} }
...@@ -241,14 +229,14 @@ void SbiExprNode::CollectBits() ...@@ -241,14 +229,14 @@ void SbiExprNode::CollectBits()
// If a twig can be converted, True will be returned. In this case // If a twig can be converted, True will be returned. In this case
// the result is in the left twig. // the result is in the left twig.
void SbiExprNode::FoldConstants() void SbiExprNode::FoldConstants(SbiParser* pParser)
{ {
if( IsOperand() || eTok == LIKE ) return; if( IsOperand() || eTok == LIKE ) return;
if( pLeft ) if( pLeft )
pLeft->FoldConstants(); pLeft->FoldConstants(pParser);
if (pLeft && pRight) if (pLeft && pRight)
{ {
pRight->FoldConstants(); pRight->FoldConstants(pParser);
if( pLeft->IsConstant() && pRight->IsConstant() if( pLeft->IsConstant() && pRight->IsConstant()
&& pLeft->eNodeType == pRight->eNodeType ) && pLeft->eNodeType == pRight->eNodeType )
{ {
...@@ -263,8 +251,8 @@ void SbiExprNode::FoldConstants() ...@@ -263,8 +251,8 @@ void SbiExprNode::FoldConstants()
{ {
OUString rl( pLeft->GetString() ); OUString rl( pLeft->GetString() );
OUString rr( pRight->GetString() ); OUString rr( pRight->GetString() );
delete pLeft; pLeft = NULL; pLeft.reset();
delete pRight; pRight = NULL; pRight.reset();
if( eTok == PLUS || eTok == CAT ) if( eTok == PLUS || eTok == CAT )
{ {
eTok = CAT; eTok = CAT;
...@@ -300,7 +288,7 @@ void SbiExprNode::FoldConstants() ...@@ -300,7 +288,7 @@ void SbiExprNode::FoldConstants()
nVal = ( eRes >= 0 ) ? SbxTRUE : SbxFALSE; nVal = ( eRes >= 0 ) ? SbxTRUE : SbxFALSE;
break; break;
default: default:
pGen->GetParser()->Error( SbERR_CONVERSION ); pParser->Error( SbERR_CONVERSION );
bError = true; bError = true;
break; break;
} }
...@@ -326,14 +314,14 @@ void SbiExprNode::FoldConstants() ...@@ -326,14 +314,14 @@ void SbiExprNode::FoldConstants()
lrMod = static_cast<long>(nr); lrMod = static_cast<long>(nr);
if( err ) if( err )
{ {
pGen->GetParser()->Error( SbERR_MATH_OVERFLOW ); pParser->Error( SbERR_MATH_OVERFLOW );
bError = true; bError = true;
} }
} }
bool bBothInt = ( pLeft->eType < SbxSINGLE bool bBothInt = ( pLeft->eType < SbxSINGLE
&& pRight->eType < SbxSINGLE ); && pRight->eType < SbxSINGLE );
delete pLeft; pLeft = NULL; pLeft.reset();
delete pRight; pRight = NULL; pRight.reset();
nVal = 0; nVal = 0;
eType = SbxDOUBLE; eType = SbxDOUBLE;
eNodeType = SbxNUMVAL; eNodeType = SbxNUMVAL;
...@@ -348,7 +336,7 @@ void SbiExprNode::FoldConstants() ...@@ -348,7 +336,7 @@ void SbiExprNode::FoldConstants()
case DIV: case DIV:
if( !nr ) if( !nr )
{ {
pGen->GetParser()->Error( SbERR_ZERODIV ); nVal = HUGE_VAL; pParser->Error( SbERR_ZERODIV ); nVal = HUGE_VAL;
bError = true; bError = true;
} else nVal = nl / nr; } else nVal = nl / nr;
break; break;
...@@ -379,14 +367,14 @@ void SbiExprNode::FoldConstants() ...@@ -379,14 +367,14 @@ void SbiExprNode::FoldConstants()
case IDIV: case IDIV:
if( !lr ) if( !lr )
{ {
pGen->GetParser()->Error( SbERR_ZERODIV ); nVal = HUGE_VAL; pParser->Error( SbERR_ZERODIV ); nVal = HUGE_VAL;
bError = true; bError = true;
} else nVal = ll / lr; } else nVal = ll / lr;
eType = SbxLONG; break; eType = SbxLONG; break;
case MOD: case MOD:
if( !lr ) if( !lr )
{ {
pGen->GetParser()->Error( SbERR_ZERODIV ); nVal = HUGE_VAL; pParser->Error( SbERR_ZERODIV ); nVal = HUGE_VAL;
bError = true; bError = true;
} else nVal = llMod - lrMod * (llMod/lrMod); } else nVal = llMod - lrMod * (llMod/lrMod);
eType = SbxLONG; break; eType = SbxLONG; break;
...@@ -404,7 +392,7 @@ void SbiExprNode::FoldConstants() ...@@ -404,7 +392,7 @@ void SbiExprNode::FoldConstants()
} }
if( !::rtl::math::isFinite( nVal ) ) if( !::rtl::math::isFinite( nVal ) )
pGen->GetParser()->Error( SbERR_MATH_OVERFLOW ); pParser->Error( SbERR_MATH_OVERFLOW );
// Recover the data type to kill rounding error // Recover the data type to kill rounding error
if( bCheckType && bBothInt if( bCheckType && bBothInt
...@@ -422,8 +410,7 @@ void SbiExprNode::FoldConstants() ...@@ -422,8 +410,7 @@ void SbiExprNode::FoldConstants()
else if (pLeft && pLeft->IsNumber()) else if (pLeft && pLeft->IsNumber())
{ {
nVal = pLeft->nVal; nVal = pLeft->nVal;
delete pLeft; pLeft.reset();
pLeft = NULL;
eType = SbxDOUBLE; eType = SbxDOUBLE;
eNodeType = SbxNUMVAL; eNodeType = SbxNUMVAL;
switch( eTok ) switch( eTok )
...@@ -437,7 +424,7 @@ void SbiExprNode::FoldConstants() ...@@ -437,7 +424,7 @@ void SbiExprNode::FoldConstants()
else if( nVal < SbxMINLNG ) err = true, nVal = SbxMINLNG; else if( nVal < SbxMINLNG ) err = true, nVal = SbxMINLNG;
if( err ) if( err )
{ {
pGen->GetParser()->Error( SbERR_MATH_OVERFLOW ); pParser->Error( SbERR_MATH_OVERFLOW );
bError = true; bError = true;
} }
nVal = (double) ~((long) nVal); nVal = (double) ~((long) nVal);
......
...@@ -40,7 +40,7 @@ SbiExpression::SbiExpression( SbiParser* p, SbiExprType t, ...@@ -40,7 +40,7 @@ SbiExpression::SbiExpression( SbiParser* p, SbiExprType t,
pExpr = (t != SbSTDEXPR ) ? Term( pKeywordSymbolInfo ) : Boolean(); pExpr = (t != SbSTDEXPR ) ? Term( pKeywordSymbolInfo ) : Boolean();
if( t != SbSYMBOL ) if( t != SbSYMBOL )
{ {
pExpr->Optimize(); pExpr->Optimize(pParser);
} }
if( t == SbLVALUE && !pExpr->IsLvalue() ) if( t == SbLVALUE && !pExpr->IsLvalue() )
{ {
...@@ -60,8 +60,8 @@ SbiExpression::SbiExpression( SbiParser* p, double n, SbxDataType t ) ...@@ -60,8 +60,8 @@ SbiExpression::SbiExpression( SbiParser* p, double n, SbxDataType t )
eCurExpr = SbOPERAND; eCurExpr = SbOPERAND;
m_eMode = EXPRMODE_STANDARD; m_eMode = EXPRMODE_STANDARD;
pNext = NULL; pNext = NULL;
pExpr = new SbiExprNode( pParser, n, t ); pExpr = new SbiExprNode( n, t );
pExpr->Optimize(); pExpr->Optimize(pParser);
} }
SbiExpression::SbiExpression( SbiParser* p, const SbiSymDef& r, SbiExprList* pPar ) SbiExpression::SbiExpression( SbiParser* p, const SbiSymDef& r, SbiExprList* pPar )
...@@ -72,7 +72,7 @@ SbiExpression::SbiExpression( SbiParser* p, const SbiSymDef& r, SbiExprList* pPa ...@@ -72,7 +72,7 @@ SbiExpression::SbiExpression( SbiParser* p, const SbiSymDef& r, SbiExprList* pPa
eCurExpr = SbOPERAND; eCurExpr = SbOPERAND;
m_eMode = EXPRMODE_STANDARD; m_eMode = EXPRMODE_STANDARD;
pNext = NULL; pNext = NULL;
pExpr = new SbiExprNode( pParser, r, SbxVARIANT, pPar ); pExpr = new SbiExprNode( r, SbxVARIANT, pPar );
} }
SbiExpression::~SbiExpression() SbiExpression::~SbiExpression()
...@@ -192,7 +192,7 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo ) ...@@ -192,7 +192,7 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
if( !pNd ) if( !pNd )
{ {
pParser->Error( SbERR_UNEXPECTED, DOT ); pParser->Error( SbERR_UNEXPECTED, DOT );
pNd = new SbiExprNode( pParser, 1.0, SbxDOUBLE ); pNd = new SbiExprNode( 1.0, SbxDOUBLE );
} }
return pNd; return pNd;
} }
...@@ -212,7 +212,7 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo ) ...@@ -212,7 +212,7 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
if( eNextTok == ASSIGN ) if( eNextTok == ASSIGN )
{ {
pParser->UnlockColumn(); pParser->UnlockColumn();
return new SbiExprNode( pParser, aSym ); return new SbiExprNode( aSym );
} }
// no keywords allowed from here on! // no keywords allowed from here on!
if( SbiTokenizer::IsKwd( eTok ) ) if( SbiTokenizer::IsKwd( eTok ) )
...@@ -311,11 +311,11 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo ) ...@@ -311,11 +311,11 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
delete pvMoreParLcl; delete pvMoreParLcl;
if( pConst->GetType() == SbxSTRING ) if( pConst->GetType() == SbxSTRING )
{ {
return new SbiExprNode( pParser, pConst->GetString() ); return new SbiExprNode( pConst->GetString() );
} }
else else
{ {
return new SbiExprNode( pParser, pConst->GetValue(), pConst->GetType() ); return new SbiExprNode( pConst->GetValue(), pConst->GetType() );
} }
} }
...@@ -366,7 +366,7 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo ) ...@@ -366,7 +366,7 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo )
} }
} }
} }
SbiExprNode* pNd = new SbiExprNode( pParser, *pDef, eType ); SbiExprNode* pNd = new SbiExprNode( *pDef, eType );
if( !pPar ) if( !pPar )
{ {
pPar = new SbiParameters( pParser,false,false ); pPar = new SbiParameters( pParser,false,false );
...@@ -473,7 +473,7 @@ SbiExprNode* SbiExpression::ObjTerm( SbiSymDef& rObj ) ...@@ -473,7 +473,7 @@ SbiExprNode* SbiExpression::ObjTerm( SbiSymDef& rObj )
pDef->SetType( eType ); pDef->SetType( eType );
} }
SbiExprNode* pNd = new SbiExprNode( pParser, *pDef, eType ); SbiExprNode* pNd = new SbiExprNode( *pDef, eType );
pNd->aVar.pPar = pPar; pNd->aVar.pPar = pPar;
pNd->aVar.pvMorePar = pvMoreParLcl; pNd->aVar.pvMorePar = pvMoreParLcl;
if( bObj ) if( bObj )
...@@ -518,18 +518,18 @@ SbiExprNode* SbiExpression::Operand( bool bUsedForTypeOf ) ...@@ -518,18 +518,18 @@ SbiExprNode* SbiExpression::Operand( bool bUsedForTypeOf )
if( !bUsedForTypeOf && pParser->IsVBASupportOn() && pParser->Peek() == IS ) if( !bUsedForTypeOf && pParser->IsVBASupportOn() && pParser->Peek() == IS )
{ {
eTok = pParser->Next(); eTok = pParser->Next();
pRes = new SbiExprNode( pParser, pRes, eTok, Like() ); pRes = new SbiExprNode( pRes, eTok, Like() );
} }
break; break;
case DOT: // .with case DOT: // .with
pRes = Term(); break; pRes = Term(); break;
case NUMBER: case NUMBER:
pParser->Next(); pParser->Next();
pRes = new SbiExprNode( pParser, pParser->GetDbl(), pParser->GetType() ); pRes = new SbiExprNode( pParser->GetDbl(), pParser->GetType() );
break; break;
case FIXSTRING: case FIXSTRING:
pParser->Next(); pParser->Next();
pRes = new SbiExprNode( pParser, pParser->GetSym() ); break; pRes = new SbiExprNode( pParser->GetSym() ); break;
case LPAREN: case LPAREN:
pParser->Next(); pParser->Next();
if( nParenLevel == 0 && m_eMode == EXPRMODE_LPAREN_PENDING && pParser->Peek() == RPAREN ) if( nParenLevel == 0 && m_eMode == EXPRMODE_LPAREN_PENDING && pParser->Peek() == RPAREN )
...@@ -580,7 +580,7 @@ SbiExprNode* SbiExpression::Operand( bool bUsedForTypeOf ) ...@@ -580,7 +580,7 @@ SbiExprNode* SbiExpression::Operand( bool bUsedForTypeOf )
else else
{ {
pParser->Next(); pParser->Next();
pRes = new SbiExprNode( pParser, 1.0, SbxDOUBLE ); pRes = new SbiExprNode( 1.0, SbxDOUBLE );
pParser->Error( SbERR_UNEXPECTED, eTok ); pParser->Error( SbERR_UNEXPECTED, eTok );
} }
break; break;
...@@ -597,7 +597,7 @@ SbiExprNode* SbiExpression::Unary() ...@@ -597,7 +597,7 @@ SbiExprNode* SbiExpression::Unary()
case MINUS: case MINUS:
eTok = NEG; eTok = NEG;
pParser->Next(); pParser->Next();
pNd = new SbiExprNode( pParser, Unary(), eTok, NULL ); pNd = new SbiExprNode( Unary(), eTok, NULL );
break; break;
case NOT: case NOT:
if( pParser->IsVBASupportOn() ) if( pParser->IsVBASupportOn() )
...@@ -607,7 +607,7 @@ SbiExprNode* SbiExpression::Unary() ...@@ -607,7 +607,7 @@ SbiExprNode* SbiExpression::Unary()
else else
{ {
pParser->Next(); pParser->Next();
pNd = new SbiExprNode( pParser, Unary(), eTok, NULL ); pNd = new SbiExprNode( Unary(), eTok, NULL );
} }
break; break;
case PLUS: case PLUS:
...@@ -623,7 +623,7 @@ SbiExprNode* SbiExpression::Unary() ...@@ -623,7 +623,7 @@ SbiExprNode* SbiExpression::Unary()
OUString aDummy; OUString aDummy;
SbiSymDef* pTypeDef = new SbiSymDef( aDummy ); SbiSymDef* pTypeDef = new SbiSymDef( aDummy );
pParser->TypeDecl( *pTypeDef, true ); pParser->TypeDecl( *pTypeDef, true );
pNd = new SbiExprNode( pParser, pObjNode, pTypeDef->GetTypeId() ); pNd = new SbiExprNode( pObjNode, pTypeDef->GetTypeId() );
break; break;
} }
case NEW: case NEW:
...@@ -632,7 +632,7 @@ SbiExprNode* SbiExpression::Unary() ...@@ -632,7 +632,7 @@ SbiExprNode* SbiExpression::Unary()
OUString aStr; OUString aStr;
SbiSymDef* pTypeDef = new SbiSymDef( aStr ); SbiSymDef* pTypeDef = new SbiSymDef( aStr );
pParser->TypeDecl( *pTypeDef, true ); pParser->TypeDecl( *pTypeDef, true );
pNd = new SbiExprNode( pParser, pTypeDef->GetTypeId() ); pNd = new SbiExprNode( pTypeDef->GetTypeId() );
break; break;
} }
default: default:
...@@ -649,7 +649,7 @@ SbiExprNode* SbiExpression::Exp() ...@@ -649,7 +649,7 @@ SbiExprNode* SbiExpression::Exp()
while( pParser->Peek() == EXPON ) while( pParser->Peek() == EXPON )
{ {
SbiToken eTok = pParser->Next(); SbiToken eTok = pParser->Next();
pNd = new SbiExprNode( pParser, pNd, eTok, Unary() ); pNd = new SbiExprNode( pNd, eTok, Unary() );
} }
} }
return pNd; return pNd;
...@@ -668,7 +668,7 @@ SbiExprNode* SbiExpression::MulDiv() ...@@ -668,7 +668,7 @@ SbiExprNode* SbiExpression::MulDiv()
break; break;
} }
eTok = pParser->Next(); eTok = pParser->Next();
pNd = new SbiExprNode( pParser, pNd, eTok, Exp() ); pNd = new SbiExprNode( pNd, eTok, Exp() );
} }
} }
return pNd; return pNd;
...@@ -682,7 +682,7 @@ SbiExprNode* SbiExpression::IntDiv() ...@@ -682,7 +682,7 @@ SbiExprNode* SbiExpression::IntDiv()
while( pParser->Peek() == IDIV ) while( pParser->Peek() == IDIV )
{ {
SbiToken eTok = pParser->Next(); SbiToken eTok = pParser->Next();
pNd = new SbiExprNode( pParser, pNd, eTok, MulDiv() ); pNd = new SbiExprNode( pNd, eTok, MulDiv() );
} }
} }
return pNd; return pNd;
...@@ -696,7 +696,7 @@ SbiExprNode* SbiExpression::Mod() ...@@ -696,7 +696,7 @@ SbiExprNode* SbiExpression::Mod()
while( pParser->Peek() == MOD ) while( pParser->Peek() == MOD )
{ {
SbiToken eTok = pParser->Next(); SbiToken eTok = pParser->Next();
pNd = new SbiExprNode( pParser, pNd, eTok, IntDiv() ); pNd = new SbiExprNode( pNd, eTok, IntDiv() );
} }
} }
return pNd; return pNd;
...@@ -715,7 +715,7 @@ SbiExprNode* SbiExpression::AddSub() ...@@ -715,7 +715,7 @@ SbiExprNode* SbiExpression::AddSub()
break; break;
} }
eTok = pParser->Next(); eTok = pParser->Next();
pNd = new SbiExprNode( pParser, pNd, eTok, Mod() ); pNd = new SbiExprNode( pNd, eTok, Mod() );
} }
} }
return pNd; return pNd;
...@@ -734,7 +734,7 @@ SbiExprNode* SbiExpression::Cat() ...@@ -734,7 +734,7 @@ SbiExprNode* SbiExpression::Cat()
break; break;
} }
eTok = pParser->Next(); eTok = pParser->Next();
pNd = new SbiExprNode( pParser, pNd, eTok, AddSub() ); pNd = new SbiExprNode( pNd, eTok, AddSub() );
} }
} }
return pNd; return pNd;
...@@ -759,7 +759,7 @@ SbiExprNode* SbiExpression::Comp() ...@@ -759,7 +759,7 @@ SbiExprNode* SbiExpression::Comp()
break; break;
} }
eTok = pParser->Next(); eTok = pParser->Next();
pNd = new SbiExprNode( pParser, pNd, eTok, Cat() ); pNd = new SbiExprNode( pNd, eTok, Cat() );
nCount++; nCount++;
} }
} }
...@@ -775,7 +775,7 @@ SbiExprNode* SbiExpression::VBA_Not() ...@@ -775,7 +775,7 @@ SbiExprNode* SbiExpression::VBA_Not()
if( eTok == NOT ) if( eTok == NOT )
{ {
pParser->Next(); pParser->Next();
pNd = new SbiExprNode( pParser, VBA_Not(), eTok, NULL ); pNd = new SbiExprNode( VBA_Not(), eTok, NULL );
} }
else else
{ {
...@@ -793,7 +793,7 @@ SbiExprNode* SbiExpression::Like() ...@@ -793,7 +793,7 @@ SbiExprNode* SbiExpression::Like()
while( pParser->Peek() == LIKE ) while( pParser->Peek() == LIKE )
{ {
SbiToken eTok = pParser->Next(); SbiToken eTok = pParser->Next();
pNd = new SbiExprNode( pParser, pNd, eTok, Comp() ), nCount++; pNd = new SbiExprNode( pNd, eTok, Comp() ), nCount++;
} }
// multiple operands in a row does not work // multiple operands in a row does not work
if( nCount > 1 && !pParser->IsVBASupportOn() ) if( nCount > 1 && !pParser->IsVBASupportOn() )
...@@ -820,7 +820,7 @@ SbiExprNode* SbiExpression::Boolean() ...@@ -820,7 +820,7 @@ SbiExprNode* SbiExpression::Boolean()
break; break;
} }
eTok = pParser->Next(); eTok = pParser->Next();
pNd = new SbiExprNode( pParser, pNd, eTok, Like() ); pNd = new SbiExprNode( pNd, eTok, Like() );
} }
} }
return pNd; return pNd;
...@@ -871,7 +871,7 @@ SbiConstExpression::SbiConstExpression( SbiParser* p ) : SbiExpression( p ) ...@@ -871,7 +871,7 @@ SbiConstExpression::SbiConstExpression( SbiParser* p ) : SbiExpression( p )
if( bIsBool ) if( bIsBool )
{ {
delete pExpr; delete pExpr;
pExpr = new SbiExprNode( pParser, (bBoolVal ? SbxTRUE : SbxFALSE), SbxINTEGER ); pExpr = new SbiExprNode( (bBoolVal ? SbxTRUE : SbxFALSE), SbxINTEGER );
eType = pExpr->GetType(); eType = pExpr->GetType();
nVal = pExpr->nVal; nVal = pExpr->nVal;
} }
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#ifndef INCLUDED_BASIC_SOURCE_INC_EXPR_HXX #ifndef INCLUDED_BASIC_SOURCE_INC_EXPR_HXX
#define INCLUDED_BASIC_SOURCE_INC_EXPR_HXX #define INCLUDED_BASIC_SOURCE_INC_EXPR_HXX
#include <memory>
#include "opcodes.hxx" #include "opcodes.hxx"
#include "token.hxx" #include "token.hxx"
...@@ -95,15 +97,14 @@ class SbiExprNode { // operators (and operands) ...@@ -95,15 +97,14 @@ class SbiExprNode { // operators (and operands)
SbVar aVar; // or variable SbVar aVar; // or variable
}; };
OUString aStrVal; // #i59791/#i45570 Store string directly OUString aStrVal; // #i59791/#i45570 Store string directly
SbiExprNode* pLeft; // right branch std::unique_ptr<SbiExprNode> pLeft; // left branch
SbiExprNode* pRight; // right branch (NULL for unary ops) std::unique_ptr<SbiExprNode> pRight; // right branch (NULL for unary ops)
SbiExprNode* pWithParent; // node, whose member is "this per with" SbiExprNode* pWithParent; // node, whose member is "this per with"
SbiCodeGen* pGen; // code-generator
SbiNodeType eNodeType; SbiNodeType eNodeType;
SbxDataType eType; SbxDataType eType;
SbiToken eTok; SbiToken eTok;
bool bError; // true: error bool bError; // true: error
void FoldConstants(); void FoldConstants(SbiParser*);
void CollectBits(); // converting numbers to strings void CollectBits(); // converting numbers to strings
bool IsOperand() bool IsOperand()
{ return eNodeType != SbxNODE && eNodeType != SbxTYPEOF && eNodeType != SbxNEW; } { return eNodeType != SbxNODE && eNodeType != SbxTYPEOF && eNodeType != SbxNEW; }
...@@ -113,16 +114,16 @@ class SbiExprNode { // operators (and operands) ...@@ -113,16 +114,16 @@ class SbiExprNode { // operators (and operands)
{ return eNodeType == SbxNEW; } { return eNodeType == SbxNEW; }
bool IsNumber(); bool IsNumber();
bool IsLvalue(); // true, if usable as Lvalue bool IsLvalue(); // true, if usable as Lvalue
void GenElement( SbiOpcode ); void GenElement( SbiCodeGen&, SbiOpcode );
void BaseInit( SbiParser* p ); // help function for Ctor, from 17.12.95
public: public:
SbiExprNode(); SbiExprNode();
SbiExprNode( SbiParser*, double, SbxDataType ); SbiExprNode( double, SbxDataType );
SbiExprNode( SbiParser*, const OUString& ); SbiExprNode( const OUString& );
SbiExprNode( SbiParser*, const SbiSymDef&, SbxDataType, SbiExprList* = NULL ); SbiExprNode( const SbiSymDef&, SbxDataType, SbiExprList* = NULL );
SbiExprNode( SbiParser*, SbiExprNode*, SbiToken, SbiExprNode* ); SbiExprNode( SbiExprNode*, SbiToken, SbiExprNode* );
SbiExprNode( SbiParser*, SbiExprNode*, sal_uInt16 ); // #120061 TypeOf SbiExprNode( SbiExprNode*, sal_uInt16 ); // #120061 TypeOf
SbiExprNode( SbiParser*, sal_uInt16 ); // new <type> SbiExprNode( sal_uInt16 ); // new <type>
virtual ~SbiExprNode(); virtual ~SbiExprNode();
bool IsValid() { return !bError; } bool IsValid() { return !bError; }
...@@ -146,9 +147,9 @@ public: ...@@ -146,9 +147,9 @@ public:
SbiExprList* GetParameters() { return aVar.pPar; } SbiExprList* GetParameters() { return aVar.pPar; }
SbiExprListVector* GetMoreParameters() { return aVar.pvMorePar; } SbiExprListVector* GetMoreParameters() { return aVar.pvMorePar; }
void Optimize(); // tree matching void Optimize(SbiParser*); // tree matching
void Gen( RecursiveMode eRecMode = UNDEFINED ); // giving out a node void Gen( SbiCodeGen& rGen, RecursiveMode eRecMode = UNDEFINED ); // giving out a node
}; };
class SbiExpression { class SbiExpression {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment