From 8210adba05e36f52f5edb24d9e1bb750f67a106e Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 16 Aug 2006 10:53:50 +0000 Subject: [PATCH] 2006-08-16 12:55 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbstack.h * harbour/source/vm/estack.c + added: int hb_stackCallDepth( void ) LONG hb_stackBaseProcOffset( int iLevel ) * harbour/source/vm/arrays.c * harbour/source/vm/proc.c * use hb_stackBaseProcOffset() * harbour/source/vm/hvm.c - removed s_ulProcLevel used by HB_DBG_PROCLEVEL() - count the call stack dynamically using stack data - a little bit slower but it's not widely used function, now is MT safe and we eliminated some small overhead in each function call so statistically we improved overall performance --- harbour/ChangeLog | 18 +++++++++++ harbour/include/hbstack.h | 2 ++ harbour/source/vm/arrays.c | 19 +++--------- harbour/source/vm/estack.c | 29 +++++++++++++++++- harbour/source/vm/hvm.c | 12 +------- harbour/source/vm/proc.c | 63 ++++++++++++++++---------------------- 6 files changed, 80 insertions(+), 63 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index ecb5a7ccfd..fd6101bd65 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,24 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2006-08-16 12:55 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbstack.h + * harbour/source/vm/estack.c + + added: + int hb_stackCallDepth( void ) + LONG hb_stackBaseProcOffset( int iLevel ) + + * harbour/source/vm/arrays.c + * harbour/source/vm/proc.c + * use hb_stackBaseProcOffset() + + * harbour/source/vm/hvm.c + - removed s_ulProcLevel used by HB_DBG_PROCLEVEL() - count the call + stack dynamically using stack data - a little bit slower but it's + not widely used function, now is MT safe and we eliminated some + small overhead in each function call so statistically we improved + overall performance + 2006-08-14 14:22 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/TODO - removed eliminating hb_stackTopItem() from TOFIX - Done. diff --git a/harbour/include/hbstack.h b/harbour/include/hbstack.h index ef88cb9df8..9ca3479c18 100644 --- a/harbour/include/hbstack.h +++ b/harbour/include/hbstack.h @@ -176,6 +176,8 @@ extern HB_ITEM_PTR hb_stackAllocItem( void ); /* allocates new item on the top #endif /* stack management functions */ +extern int hb_stackCallDepth( void ); +extern LONG hb_stackBaseProcOffset( int iLevel ); extern void hb_stackBaseProcInfo( char * szProcName, USHORT * puiProcLine ); /* get current .PRG function name and line number */ extern void hb_stackDispLocal( void ); /* show the types of the items on the stack for debugging purposes */ extern void hb_stackDispCall( void ); diff --git a/harbour/source/vm/arrays.c b/harbour/source/vm/arrays.c index 956b3d25be..e93837ee71 100644 --- a/harbour/source/vm/arrays.c +++ b/harbour/source/vm/arrays.c @@ -915,31 +915,22 @@ HB_EXPORT PHB_ITEM hb_arrayFromStack( USHORT uiLen ) PHB_ITEM hb_arrayFromParams( int iLevel ) { - PHB_ITEM pArray, pBase; + PHB_ITEM pArray; USHORT uiPos, uiPCount; LONG lBaseOffset; HB_TRACE(HB_TR_DEBUG, ("hb_arrayFromParams(%d)", iLevel)); - lBaseOffset = hb_stackBaseOffset(); - while( iLevel-- > 0 && lBaseOffset > 1 ) - { - pBase = hb_stackItem( lBaseOffset - 1 ); - lBaseOffset = pBase->item.asSymbol.stackbase + 1; - } - - if( iLevel < 0 ) - { - pBase = hb_stackItem( lBaseOffset - 1 ); - uiPCount = pBase->item.asSymbol.paramcnt; - } + lBaseOffset = hb_stackBaseProcOffset( iLevel ); + if( lBaseOffset >= 0 ) + uiPCount = hb_stackItem( lBaseOffset )->item.asSymbol.paramcnt; else uiPCount = 0; pArray = hb_itemArrayNew( uiPCount ); for( uiPos = 1; uiPos <= uiPCount; uiPos++ ) { - hb_arraySet( pArray, uiPos, hb_stackItem( lBaseOffset + uiPos ) ); + hb_arraySet( pArray, uiPos, hb_stackItem( lBaseOffset + uiPos + 1 ) ); } return pArray; diff --git a/harbour/source/vm/estack.c b/harbour/source/vm/estack.c index 8a0e2342b6..a449622e61 100644 --- a/harbour/source/vm/estack.c +++ b/harbour/source/vm/estack.c @@ -272,7 +272,7 @@ HB_ITEM_PTR hb_stackItem( LONG iItemPos ) if( iItemPos < 0 ) hb_errInternal( HB_EI_STACKUFLOW, NULL, NULL, NULL ); - return ( * ( hb_stack.pItems + iItemPos ) ); + return * ( hb_stack.pItems + iItemPos ); } #undef hb_stackItemFromTop @@ -382,6 +382,33 @@ PHB_ITEM ** hb_stackItemBasePtr( void ) return &hb_stack.pItems; } +int hb_stackCallDepth( void ) +{ + LONG lOffset = hb_stack.pBase - hb_stack.pItems; + int iLevel = 1; + + while( lOffset > 0 ) + { + lOffset = ( * ( hb_stack.pItems + lOffset ) )->item.asSymbol.stackbase; + ++iLevel; + } + + return iLevel; +} + +LONG hb_stackBaseProcOffset( int iLevel ) +{ + LONG lOffset = hb_stack.pBase - hb_stack.pItems; + + while( iLevel-- > 0 && lOffset > 0 ) + lOffset = ( * ( hb_stack.pItems + lOffset ) )->item.asSymbol.stackbase; + + if( iLevel < 0 ) + return lOffset; + else + return -1; +} + void hb_stackBaseProcInfo( char * szProcName, USHORT * puiProcLine ) { /* diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 0afeb13eef..e696099850 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -263,10 +263,6 @@ static LONG s_lRecoverBase; #define HB_RECOVER_ADDRESS -3 #define HB_RECOVER_VALUE -4 -/* Stores level of procedures call stack -*/ -static ULONG s_ulProcLevel = 0; - /* Request for some action - stop processing of opcodes */ static USHORT s_uiActionRequest; @@ -3923,8 +3919,6 @@ HB_EXPORT void hb_vmDo( USHORT uiParams ) HB_TRACE(HB_TR_DEBUG, ("hb_vmDo(%hu)", uiParams)); - s_ulProcLevel++; - #ifndef HB_NO_PROFILER if( bProfiler ) ulClock = ( ULONG ) clock(); @@ -4013,7 +4007,6 @@ HB_EXPORT void hb_vmDo( USHORT uiParams ) hb_stackOldFrame( &sStackState ); s_bDebugging = bDebugPrevState; - s_ulProcLevel--; } HB_EXPORT void hb_vmSend( USHORT uiParams ) @@ -4033,8 +4026,6 @@ HB_EXPORT void hb_vmSend( USHORT uiParams ) HB_TRACE(HB_TR_DEBUG, ("hb_vmSend(%hu)", uiParams)); - s_ulProcLevel++; - #ifndef HB_NO_PROFILER if( bProfiler ) ulClock = ( ULONG ) clock(); @@ -4088,7 +4079,6 @@ HB_EXPORT void hb_vmSend( USHORT uiParams ) hb_stackOldFrame( &sStackState ); s_bDebugging = bDebugPrevState; - s_ulProcLevel--; } static HARBOUR hb_vmDoBlock( void ) @@ -7894,7 +7884,7 @@ HB_FUNC( HB_DBG_VMVARSSET ) HB_FUNC( HB_DBG_PROCLEVEL ) { - hb_retnl( s_ulProcLevel - 1 ); /* Don't count self */ + hb_retnl( hb_stackCallDepth() - 1 ); /* Don't count self */ } /* ------------------------------------------------------------------------ */ diff --git a/harbour/source/vm/proc.c b/harbour/source/vm/proc.c index 54be8a4391..05395123bb 100644 --- a/harbour/source/vm/proc.c +++ b/harbour/source/vm/proc.c @@ -94,14 +94,10 @@ HB_FUNC( PROCNAME ) HB_FUNC( PROCLINE ) { - long lOffset = hb_stackBaseOffset(); - int iLevel = hb_parni( 1 ) + 1; /* we are already inside ProcName() */ + long lOffset = hb_stackBaseProcOffset( hb_parni( 1 ) + 1 ); - while( iLevel-- > 0 && lOffset > 1 ) - lOffset = hb_stackItem( lOffset - 1 )->item.asSymbol.stackbase + 1; - - if( iLevel < 0 ) - hb_retni( hb_stackItem( lOffset - 1 )->item.asSymbol.lineno ); + if( lOffset >= 0 ) + hb_retni( hb_stackItem( lOffset )->item.asSymbol.lineno ); else hb_retni( 0 ); } @@ -122,19 +118,15 @@ HB_FUNC( PROCFILE ) } else { - long lOffset = hb_stackBaseOffset(); - int iLevel = hb_parni( 1 ) + 1; /* we are already inside ProcFile() */ + long lOffset = hb_stackBaseProcOffset( hb_parni( 1 ) + 1 ); - while( iLevel-- > 0 && lOffset > 1 ) - lOffset = hb_stackItem( lOffset - 1 )->item.asSymbol.stackbase + 1; - - if( iLevel < 0 ) + if( lOffset >= 0 ) { - pSym = hb_stackItem( lOffset - 1 )->item.asSymbol.value; + pSym = hb_stackItem( lOffset )->item.asSymbol.value; if( pSym == &hb_symEval || strcmp( pSym->szName, "EVAL" ) == 0 ) { - PHB_ITEM pSelf = hb_stackItem( lOffset ); + PHB_ITEM pSelf = hb_stackItem( lOffset + 1 ); if( HB_IS_BLOCK( pSelf ) ) pLocalSym = pSelf->item.asBlock.value->pDefSymb; @@ -161,27 +153,26 @@ HB_FUNC( PROCFILE ) char * hb_procname( int iLevel, char * szName, BOOL bSkipBlock ) { - long lOffset = hb_stackBaseOffset(), lPrevOffset = 0; - PHB_ITEM pBase, pSelf; + long lOffset = hb_stackBaseProcOffset( iLevel ); + long lPrevOffset = 0; - while( iLevel-- > 0 && lOffset > 1 ) - lOffset = hb_stackItem( lOffset - 1 )->item.asSymbol.stackbase + 1; - - if( iLevel < 0 ) + if( lOffset >= 0 ) { - if( bSkipBlock && lOffset > 1 ) + PHB_ITEM pBase, pSelf; + + if( bSkipBlock && lOffset > 0 ) { - char * szTstName = hb_stackItem( lOffset - 1 )->item.asSymbol.value->szName ; + char * szTstName = hb_stackItem( lOffset )->item.asSymbol.value->szName ; /* Is it an inline method ? if so back one more ... */ if( strcmp( szTstName, "__EVAL" ) == 0 ) { lPrevOffset = lOffset; - lOffset = hb_stackItem( lOffset - 1 )->item.asSymbol.stackbase + 1; + lOffset = hb_stackItem( lOffset )->item.asSymbol.stackbase; } } - pBase = hb_stackItem( lOffset - 1 ); - pSelf = hb_stackItem( lOffset ); + pBase = hb_stackItem( lOffset ); + pSelf = hb_stackItem( lOffset + 1 ); if( HB_IS_OBJECT( pSelf ) ) /* it is a method name */ { strcpy( szName, hb_objGetRealClsName( pSelf, pBase->item.asSymbol.value->szName ) ); @@ -198,8 +189,8 @@ char * hb_procname( int iLevel, char * szName, BOOL bSkipBlock ) if( lPrevOffset ) /* Back to standart code block */ { lOffset = lPrevOffset; - pBase = hb_stackItem( lOffset - 1 ); - pSelf = hb_stackItem( lOffset ); + pBase = hb_stackItem( lOffset ); + pSelf = hb_stackItem( lOffset + 1 ); } if( pBase->item.asSymbol.value == &hb_symEval || @@ -229,17 +220,15 @@ char * hb_procname( int iLevel, char * szName, BOOL bSkipBlock ) */ BOOL hb_procinfo( int iLevel, char * szName, USHORT * puiLine, char * szFile ) { - long lOffset = hb_stackBaseOffset(); - PHB_ITEM pBase, pSelf; - PHB_SYMB pSym; + long lOffset = hb_stackBaseProcOffset( iLevel ); - while( iLevel-- > 0 && lOffset > 1 ) - lOffset = hb_stackItem( lOffset - 1 )->item.asSymbol.stackbase + 1; - - if( iLevel < 0 ) + if( lOffset >= 0 ) { - pBase = hb_stackItem( lOffset - 1 ); - pSelf = hb_stackItem( lOffset ); + PHB_ITEM pBase, pSelf; + PHB_SYMB pSym; + + pBase = hb_stackItem( lOffset ); + pSelf = hb_stackItem( lOffset + 1 ); pSym = pBase->item.asSymbol.value;