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
This commit is contained in:
Przemyslaw Czerpak
2006-08-16 10:53:50 +00:00
parent 9526552410
commit 8210adba05
6 changed files with 80 additions and 63 deletions

View File

@@ -8,6 +8,24 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
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.

View File

@@ -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 );

View File

@@ -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;

View File

@@ -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 )
{
/*

View File

@@ -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 */
}
/* ------------------------------------------------------------------------ */

View File

@@ -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;