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:
@@ -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.
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
/*
|
||||
|
||||
@@ -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 */
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user