From 0c1c2ab698692923719abef6e6c78c0bac10d7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20Czerpak?= Date: Sun, 8 Feb 2015 23:32:45 +0100 Subject: [PATCH] 2015-02-08 23:32 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * include/harbour.hbx * src/vm/hvm.c + added new PRG function: __BreakBlock() -> {|e| Break( e ) } * include/hbexprb.c % replace {|e| Break( e ) } with __BreakBlock() function call. __BreakBlock() returns exactly the same codeblock on each call so using it save memory and improve a little bit speed because it's not necessary to allocate new GC memory block and register it in GC block list. Additionally in MT mode it eliminates mutex lock necessary to register new GC block. --- ChangeLog.txt | 14 ++++++++++++++ include/harbour.hbx | 1 + include/hbexprb.c | 26 ++++++++++++++++++++++++-- src/vm/hvm.c | 5 +++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index 7cc6e2e4dd..32b62c4bab 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,20 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2015-02-08 23:32 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * include/harbour.hbx + * src/vm/hvm.c + + added new PRG function: + __BreakBlock() -> {|e| Break( e ) } + + * include/hbexprb.c + % replace {|e| Break( e ) } with __BreakBlock() function call. + __BreakBlock() returns exactly the same codeblock on each call + so using it save memory and improve a little bit speed because + it's not necessary to allocate new GC memory block and register + it in GC block list. Additionally in MT mode it eliminates mutex + lock necessary to register new GC block. + 2015-02-08 13:19 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/rdd/workarea.c + added support for field flags in dbCreate()/dbStruct(). diff --git a/include/harbour.hbx b/include/harbour.hbx index 4d21b278da..fd39a16250 100644 --- a/include/harbour.hbx +++ b/include/harbour.hbx @@ -1300,6 +1300,7 @@ DYNAMIC __AtPrompt DYNAMIC __Box DYNAMIC __BoxD DYNAMIC __BoxS +DYNAMIC __BreakBlock DYNAMIC __CapLength DYNAMIC __CapMetrics DYNAMIC __Caption diff --git a/include/hbexprb.c b/include/hbexprb.c index e71b76fa19..c7b5a67c45 100644 --- a/include/hbexprb.c +++ b/include/hbexprb.c @@ -430,8 +430,30 @@ static HB_EXPR_FUNC( hb_compExprUseCodeblock ) switch( iMessage ) { case HB_EA_REDUCE: + { + PHB_EXPR pExpr = pSelf->value.asCodeblock.pExprList; + + if( pExpr && pExpr->pNext == NULL && pExpr->ExprType == HB_ET_FUNCALL && + pExpr->value.asFunCall.pFunName->ExprType == HB_ET_FUNNAME && + pExpr->value.asFunCall.pFunName->value.asSymbol.funcid == HB_F_BREAK && + pSelf->value.asCodeblock.pLocals != NULL ) + { + PHB_EXPR pParms = pExpr->value.asFunCall.pParms; + if( hb_compExprParamListLen( pParms ) == 1 && + pParms->value.asList.pExprList->ExprType == HB_ET_VARIABLE && + strcmp( pSelf->value.asCodeblock.pLocals->szName, + pParms->value.asList.pExprList->value.asSymbol.name ) == 0 ) + { + HB_COMP_EXPR_FREE( pSelf ); + pSelf = HB_COMP_EXPR_NEW( HB_ET_FUNCALL ); + pSelf->value.asFunCall.pParms = NULL; + pSelf->value.asFunCall.pFunName = hb_compExprNewFunName( "__BREAKBLOCK", HB_COMP_PARAM ); + break; + } + } pSelf->value.asCodeblock.flags |= HB_BLOCK_REDUCE; break; + } case HB_EA_ARRAY_AT: HB_COMP_ERROR_TYPE( pSelf ); break; @@ -4541,9 +4563,9 @@ static HB_BOOL hb_compExprCodeblockPush( PHB_EXPR pSelf, int iEarlyEvalPass, HB_ pExpr->value.asMacro.SubType |= HB_ET_MACRO_PARE; } - /* store next expression in case the current will be reduced + /* store next expression in case the current will be reduced * NOTE: During reduction the expression can be replaced by the - * new one - this will break the linked list of expressions. + * new one - this will break the linked list of expressions. */ pNext = pExpr->pNext; /* store next expression in case the current will be reduced */ if( ( pSelf->value.asCodeblock.flags & HB_BLOCK_REDUCE ) != 0 || diff --git a/src/vm/hvm.c b/src/vm/hvm.c index 7e27e8948f..a3e6fa92d6 100644 --- a/src/vm/hvm.c +++ b/src/vm/hvm.c @@ -12322,6 +12322,11 @@ HB_FUNC( __VMMODULESVERIFY ) hb_vmVerifySymbols( hb_stackReturnItem() ); } +HB_FUNC( __BREAKBLOCK ) +{ + hb_itemReturn( hb_breakBlock() ); +} + HB_FUNC( HB_ARRAYTOPARAMS ) { HB_STACK_TLS_PRELOAD