From 479c738c832bbf8623c5ddf47aae8d9fc2562c75 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 31 Dec 2008 13:09:30 +0000 Subject: [PATCH] 2008-12-31 14:12 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbexprb.c + added optimizations for var := var => var = when is +, -, *, / %, ^ operator % cleanup up checking if message can be used as LValue --- harbour/ChangeLog | 6 +++ harbour/include/hbexprb.c | 103 +++++++++++++++++++++++--------------- 2 files changed, 68 insertions(+), 41 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index d763491a9f..c0ae617b29 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,12 @@ 2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2008-12-31 14:12 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbexprb.c + + added optimizations for var := var => var = + when is +, -, *, / %, ^ operator + % cleanup up checking if message can be used as LValue + 2008-12-30 18:10 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) * harbour/include/hbapi.h * harbour/source/vm/arrays.c diff --git a/harbour/include/hbexprb.c b/harbour/include/hbexprb.c index 94ef27e530..3bb173a870 100644 --- a/harbour/include/hbexprb.c +++ b/harbour/include/hbexprb.c @@ -2414,7 +2414,11 @@ static HB_EXPR_FUNC( hb_compExprUseSend ) case HB_EA_ARRAY_AT: case HB_EA_ARRAY_INDEX: + break; + case HB_EA_LVALUE: + if( pSelf->value.asMessage.pParms ) + hb_compErrorLValue( HB_COMP_PARAM, pSelf ); break; case HB_EA_PUSH_PCODE: @@ -2568,10 +2572,56 @@ static HB_EXPR_FUNC( hb_compExprUseAssign ) switch( iMessage ) { case HB_EA_REDUCE: + { + HB_EXPR_PTR pExpr; + pSelf->value.asOperator.pLeft = HB_EXPR_USE( pSelf->value.asOperator.pLeft, HB_EA_REDUCE ); pSelf->value.asOperator.pRight = HB_EXPR_USE( pSelf->value.asOperator.pRight, HB_EA_REDUCE ); HB_EXPR_USE( pSelf->value.asOperator.pLeft, HB_EA_LVALUE ); + + /* optimize: + * var := var + * to: + * var = + */ + pExpr = pSelf->value.asOperator.pRight; + if( HB_SUPPORT_HARBOUR && + pSelf->value.asOperator.pLeft->ExprType == HB_ET_VARIABLE && + ( pExpr->ExprType == HB_EO_PLUS || pExpr->ExprType == HB_EO_MINUS || + pExpr->ExprType == HB_EO_MULT || pExpr->ExprType == HB_EO_DIV || + pExpr->ExprType == HB_EO_MOD || pExpr->ExprType == HB_EO_POWER ) && + pExpr->value.asOperator.pLeft->ExprType == HB_ET_VARIABLE && + strcmp( pSelf->value.asOperator.pLeft->value.asSymbol, + pExpr->value.asOperator.pLeft->value.asSymbol ) == 0 ) + { + /* NOTE: direct type change */ + switch( pExpr->ExprType ) + { + case HB_EO_PLUS: + pExpr->ExprType = HB_EO_PLUSEQ; + break; + case HB_EO_MINUS: + pExpr->ExprType = HB_EO_MINUSEQ; + break; + case HB_EO_MULT: + pExpr->ExprType = HB_EO_MULTEQ; + break; + case HB_EO_DIV: + pExpr->ExprType = HB_EO_DIVEQ; + break; + case HB_EO_MOD: + pExpr->ExprType = HB_EO_MODEQ; + break; + case HB_EO_POWER: + pExpr->ExprType = HB_EO_EXPEQ; + break; + } + pSelf->value.asOperator.pRight = NULL; + HB_COMP_EXPR_FREE( pSelf ); + pSelf = pExpr; + } break; + } case HB_EA_ARRAY_AT: case HB_EA_ARRAY_INDEX: @@ -2584,10 +2634,6 @@ static HB_EXPR_FUNC( hb_compExprUseAssign ) if( pSelf->value.asOperator.pLeft->ExprType == HB_ET_SEND ) { HB_EXPR_PTR pObj = pSelf->value.asOperator.pLeft; - if( pObj->value.asMessage.pParms ) - { - hb_compErrorLValue( HB_COMP_PARAM, pObj ); - } pObj->value.asMessage.pParms = pSelf->value.asOperator.pRight; HB_EXPR_USE( pObj, HB_EA_POP_PCODE ); pObj->value.asMessage.pParms = NULL; /* to suppress duplicated releasing */ @@ -2614,10 +2660,6 @@ static HB_EXPR_FUNC( hb_compExprUseAssign ) if( pSelf->value.asOperator.pLeft->ExprType == HB_ET_SEND ) { HB_EXPR_PTR pObj = pSelf->value.asOperator.pLeft; - if( pObj->value.asMessage.pParms ) - { - hb_compErrorLValue( HB_COMP_PARAM, pObj ); - } pObj->value.asMessage.pParms = pSelf->value.asOperator.pRight; HB_EXPR_USE( pObj, HB_EA_POP_PCODE ); pObj->value.asMessage.pParms = NULL; /* to suppress duplicated releasing */ @@ -4209,7 +4251,7 @@ static void hb_compExprCodeblockPush( HB_EXPR_PTR pSelf, BOOL bLateEval, HB_COMP HB_EXPR_USE( pExpr, HB_EA_PUSH_POP ); else HB_EXPR_USE( pExpr, HB_EA_PUSH_PCODE ); -#endif +#endif pPrev = &pExpr->pNext; pExpr = pNext; } @@ -4220,7 +4262,7 @@ static void hb_compExprCodeblockPush( HB_EXPR_PTR pSelf, BOOL bLateEval, HB_COMP hb_compCodeBlockEnd( HB_COMP_PARAM ); else hb_compCodeBlockRewind( HB_COMP_PARAM ); -#endif +#endif } /* This generates a push pcode for early evaluation of a macro @@ -4472,13 +4514,8 @@ static void hb_compExprPushOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq, HB_COMP_DECL ) */ if( pSelf->value.asOperator.pLeft->ExprType == HB_ET_SEND ) { - - if( pSelf->value.asOperator.pLeft->value.asMessage.pParms ) - { - hb_compErrorLValue( HB_COMP_PARAM, pSelf->value.asOperator.pLeft ); - } #ifdef HB_USE_OBJMSG_REF - else if( bOpEq != bNewOp ) + if( bOpEq != bNewOp ) { hb_compExprPushSendPop( pSelf->value.asOperator.pLeft, HB_COMP_PARAM ); HB_GEN_FUNC1( PCode1, HB_P_PUSHOVARREF ); @@ -4486,8 +4523,8 @@ static void hb_compExprPushOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq, HB_COMP_DECL ) HB_EXPR_USE( pSelf->value.asOperator.pRight, HB_EA_PUSH_PCODE ); HB_GEN_FUNC1( PCode1, bNewOp ); } -#endif else +#endif { hb_compExprPushSendPopPush( pSelf->value.asOperator.pLeft, pSelf->value.asOperator.pRight, @@ -4626,12 +4663,8 @@ static void hb_compExprUseOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq, HB_COMP_DECL ) */ if( pSelf->value.asOperator.pLeft->ExprType == HB_ET_SEND ) { - if( pSelf->value.asOperator.pLeft->value.asMessage.pParms ) - { - hb_compErrorLValue( HB_COMP_PARAM, pSelf->value.asOperator.pLeft ); - } #ifdef HB_USE_OBJMSG_REF - else if( bOpEq != bNewOp ) + if( bOpEq != bNewOp ) { hb_compExprPushSendPop( pSelf->value.asOperator.pLeft, HB_COMP_PARAM ); HB_GEN_FUNC1( PCode1, HB_P_PUSHOVARREF ); @@ -4639,8 +4672,8 @@ static void hb_compExprUseOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq, HB_COMP_DECL ) HB_EXPR_USE( pSelf->value.asOperator.pRight, HB_EA_PUSH_PCODE ); HB_GEN_FUNC1( PCode1, bNewOp ); } -#endif else +#endif { hb_compExprPushSendPopPush( pSelf->value.asOperator.pLeft, pSelf->value.asOperator.pRight, @@ -4748,20 +4781,16 @@ static void hb_compExprPushPreOp( HB_EXPR_PTR pSelf, BYTE bOper, HB_COMP_DECL ) */ if( pSelf->value.asOperator.pLeft->ExprType == HB_ET_SEND ) { - if( pSelf->value.asOperator.pLeft->value.asMessage.pParms ) - { - hb_compErrorLValue( HB_COMP_PARAM, pSelf->value.asOperator.pLeft ); - } #ifdef HB_USE_OBJMSG_REF - else if( HB_SUPPORT_HARBOUR ) + if( HB_SUPPORT_HARBOUR ) { hb_compExprPushSendPop( pSelf->value.asOperator.pLeft, HB_COMP_PARAM ); HB_GEN_FUNC1( PCode1, HB_P_PUSHOVARREF ); /* increase/decrease operation, leave unreferenced value on stack */ HB_GEN_FUNC1( PCode1, ( bOper == HB_P_INC ) ? HB_P_INCEQ : HB_P_DECEQ ); } -#endif else +#endif { hb_compExprPushSendPopPush( pSelf->value.asOperator.pLeft, NULL, FALSE, bOper, HB_COMP_PARAM ); @@ -4853,12 +4882,8 @@ static void hb_compExprPushPostOp( HB_EXPR_PTR pSelf, BYTE bOper, HB_COMP_DECL ) */ if( pSelf->value.asOperator.pLeft->ExprType == HB_ET_SEND ) { - if( pSelf->value.asOperator.pLeft->value.asMessage.pParms ) - { - hb_compErrorLValue( HB_COMP_PARAM, pSelf->value.asOperator.pLeft ); - } #ifdef HB_USE_OBJMSG_REF - else if( HB_SUPPORT_HARBOUR ) + if( HB_SUPPORT_HARBOUR ) { /* push reference to current value */ hb_compExprPushSendPop( pSelf->value.asOperator.pLeft, HB_COMP_PARAM ); @@ -4870,8 +4895,8 @@ static void hb_compExprPushPostOp( HB_EXPR_PTR pSelf, BYTE bOper, HB_COMP_DECL ) /* increment/decrement the value */ HB_GEN_FUNC1( PCode1, ( bOper == HB_P_INC ) ? HB_P_INCEQPOP : HB_P_DECEQPOP ); } -#endif else +#endif { hb_compExprPushSendPopPush( pSelf->value.asOperator.pLeft, NULL, TRUE, bOper, HB_COMP_PARAM ); @@ -4967,12 +4992,8 @@ static void hb_compExprUsePreOp( HB_EXPR_PTR pSelf, BYTE bOper, HB_COMP_DECL ) */ if( pSelf->value.asOperator.pLeft->ExprType == HB_ET_SEND ) { - if( pSelf->value.asOperator.pLeft->value.asMessage.pParms ) - { - hb_compErrorLValue( HB_COMP_PARAM, pSelf->value.asOperator.pLeft ); - } #ifdef HB_USE_OBJMSG_REF - else if( HB_SUPPORT_HARBOUR ) + if( HB_SUPPORT_HARBOUR ) { /* push reference to current value */ hb_compExprPushSendPop( pSelf->value.asOperator.pLeft, HB_COMP_PARAM ); @@ -4980,8 +5001,8 @@ static void hb_compExprUsePreOp( HB_EXPR_PTR pSelf, BYTE bOper, HB_COMP_DECL ) /* increment/decrement the value */ HB_GEN_FUNC1( PCode1, ( bOper == HB_P_INC ) ? HB_P_INCEQPOP : HB_P_DECEQPOP ); } -#endif else +#endif { hb_compExprPushSendPopPush( pSelf->value.asOperator.pLeft, NULL, FALSE, bOper, HB_COMP_PARAM );