2010-03-04 11:06 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbcompdf.h
* harbour/src/vm/macro.c
% changed HB_PCODE_INFO structure to eliminate one memory allocation
in macro compiler
* harbour/include/hbapi.h
* harbour/include/hbvm.h
* harbour/src/vm/codebloc.c
* harbour/src/vm/itemapi.c
* harbour/src/vm/hvm.c
* changed second parameter in hb_codeblockGet*() function to 'int'
* merged codeblock execution context setting into one function
hb_vmDoBlock() and removed hb_codeblockEvaluate()
+ added new internal function hb_vmEval()
* harbour/src/vm/arrays.c
% use hb_vmEval()
* harbour/src/macro/macrolex.c
* added missing const to maro text declaration
* harbour/tests/speedtst.prg
! fixed to work with CLIP and xHarbour after we changed
SECONDSCPU() to HB_SECONDSCPU() - all these compilers and FlagShip
have SECONDSCPU() function
This commit is contained in:
@@ -59,12 +59,12 @@
|
||||
|
||||
typedef struct _HB_MACRO_LEX
|
||||
{
|
||||
char * pString;
|
||||
char * pDst;
|
||||
HB_SIZE ulLen;
|
||||
HB_SIZE ulSrc;
|
||||
HB_BOOL quote;
|
||||
char pBuffer[ 2 ];
|
||||
const char * pString;
|
||||
char * pDst;
|
||||
HB_SIZE ulLen;
|
||||
HB_SIZE ulSrc;
|
||||
HB_BOOL quote;
|
||||
char pBuffer[ 2 ];
|
||||
}
|
||||
HB_MACRO_LEX, * PHB_MACRO_LEX;
|
||||
|
||||
|
||||
@@ -1001,7 +1001,7 @@ HB_SIZE hb_arrayScan( PHB_ITEM pArray, PHB_ITEM pValue, HB_SIZE * pulStart, HB_S
|
||||
hb_vmPush( pValue );
|
||||
hb_vmPush( pBaseArray->pItems + ulStart );
|
||||
hb_vmPushLong( ++ulStart );
|
||||
hb_vmSend( 2 );
|
||||
hb_vmEval( 2 );
|
||||
|
||||
if( HB_IS_LOGICAL( hb_stackReturnItem() ) && hb_stackReturnItem()->item.asLogical.value )
|
||||
return ulStart;
|
||||
@@ -1168,7 +1168,7 @@ HB_SIZE hb_arrayRevScan( PHB_ITEM pArray, PHB_ITEM pValue, HB_SIZE * pulStart, H
|
||||
else
|
||||
hb_vmPushNil();
|
||||
hb_vmPushLong( ulStart + 1 );
|
||||
hb_vmSend( 2 );
|
||||
hb_vmEval( 2 );
|
||||
|
||||
if( HB_IS_LOGICAL( hb_stackReturnItem() ) && hb_stackReturnItem()->item.asLogical.value )
|
||||
return ulStart + 1;
|
||||
@@ -1326,7 +1326,7 @@ HB_BOOL hb_arrayEval( PHB_ITEM pArray, PHB_ITEM bBlock, HB_SIZE * pulStart, HB_S
|
||||
hb_vmPush( bBlock );
|
||||
hb_vmPush( pBaseArray->pItems + ulStart );
|
||||
hb_vmPushLong( ulStart + 1 );
|
||||
hb_vmSend( 2 );
|
||||
hb_vmEval( 2 );
|
||||
}
|
||||
while( --ulCount > 0 && ++ulStart < pBaseArray->ulLen );
|
||||
/*
|
||||
|
||||
@@ -293,29 +293,13 @@ HB_CODEBLOCK_PTR hb_codeblockMacroNew( const HB_BYTE * pBuffer, HB_SIZE ulLen )
|
||||
return pCBlock;
|
||||
}
|
||||
|
||||
/* Evaluate passed codeblock
|
||||
* Before evaluation we have to switch to a static variable base that
|
||||
* was defined when the codeblock was created.
|
||||
* (The codeblock can only see the static variables defined in a module
|
||||
* where the codeblock was created)
|
||||
*/
|
||||
void hb_codeblockEvaluate( HB_ITEM_PTR pItem )
|
||||
{
|
||||
HB_STACK_TLS_PRELOAD
|
||||
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_codeblockEvaluate(%p)", pItem));
|
||||
|
||||
hb_stackSetStaticsBase( pItem->item.asBlock.value->pStatics );
|
||||
hb_vmExecute( pItem->item.asBlock.value->pCode, pItem->item.asBlock.value->pSymbols );
|
||||
}
|
||||
|
||||
/* Get local variable referenced in a codeblock
|
||||
*/
|
||||
PHB_ITEM hb_codeblockGetVar( PHB_ITEM pItem, HB_LONG iItemPos )
|
||||
PHB_ITEM hb_codeblockGetVar( PHB_ITEM pItem, int iItemPos )
|
||||
{
|
||||
HB_CODEBLOCK_PTR pCBlock = pItem->item.asBlock.value;
|
||||
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_codeblockGetVar(%p, %ld)", pItem, iItemPos));
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_codeblockGetVar(%p, %d)", pItem, iItemPos));
|
||||
|
||||
/* local variables accessed in a codeblock are always stored as reference */
|
||||
return hb_itemUnRef( pCBlock->pLocals - iItemPos );
|
||||
@@ -323,9 +307,9 @@ PHB_ITEM hb_codeblockGetVar( PHB_ITEM pItem, HB_LONG iItemPos )
|
||||
|
||||
/* Get local variable passed by reference
|
||||
*/
|
||||
PHB_ITEM hb_codeblockGetRef( HB_CODEBLOCK_PTR pCBlock, HB_LONG iItemPos )
|
||||
PHB_ITEM hb_codeblockGetRef( HB_CODEBLOCK_PTR pCBlock, int iItemPos )
|
||||
{
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_codeblockGetRef(%p, %ld)", pCBlock, iItemPos));
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_codeblockGetRef(%p, %d)", pCBlock, iItemPos));
|
||||
|
||||
return pCBlock->pLocals - iItemPos;
|
||||
}
|
||||
|
||||
@@ -5557,11 +5557,13 @@ static void hb_vmPushVParams( void )
|
||||
{
|
||||
HB_STACK_TLS_PRELOAD
|
||||
int iPCount, iFirst, i = 0;
|
||||
PHB_ITEM pBase;
|
||||
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_vmPushVParams()"));
|
||||
|
||||
iFirst = hb_stackBaseItem()->item.asSymbol.paramdeclcnt;
|
||||
iPCount = hb_pcount();
|
||||
pBase = hb_stackBaseItem();
|
||||
iFirst = pBase->item.asSymbol.paramdeclcnt;
|
||||
iPCount = pBase->item.asSymbol.paramcnt;
|
||||
while( ++iFirst <= iPCount )
|
||||
{
|
||||
hb_vmPush( hb_stackItemFromBase( iFirst ) );
|
||||
@@ -5953,35 +5955,71 @@ static void hb_vmPushObjectVarRef( void )
|
||||
hb_stackPushReturn();
|
||||
}
|
||||
|
||||
void hb_vmEval( HB_USHORT uiParams )
|
||||
{
|
||||
HB_STACK_TLS_PRELOAD
|
||||
HB_STACK_STATE sStackState;
|
||||
#ifndef HB_NO_PROFILER
|
||||
HB_ULONG ulClock = 0;
|
||||
HB_BOOL bProfiler = hb_bProfiler; /* because profiler state may change */
|
||||
#endif
|
||||
|
||||
HB_TASK_SHEDULER
|
||||
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_vmEval(%hu)", uiParams));
|
||||
|
||||
#ifndef HB_NO_PROFILER
|
||||
if( bProfiler )
|
||||
ulClock = ( HB_ULONG ) clock();
|
||||
#endif
|
||||
|
||||
hb_stackNewFrame( &sStackState, uiParams );
|
||||
|
||||
hb_vmDoBlock();
|
||||
|
||||
#ifndef HB_NO_PROFILER
|
||||
if( bProfiler )
|
||||
hb_mthAddTime( clock() - ulClock );
|
||||
#endif
|
||||
|
||||
#ifndef HB_NO_DEBUG
|
||||
if( sStackState.fDebugging )
|
||||
hb_vmDebuggerEndProc();
|
||||
#endif
|
||||
|
||||
hb_stackOldFrame( &sStackState );
|
||||
}
|
||||
|
||||
static HARBOUR hb_vmDoBlock( void )
|
||||
{
|
||||
HB_STACK_TLS_PRELOAD
|
||||
PHB_ITEM pBlock;
|
||||
PHB_ITEM pBlock, pBase;
|
||||
int iParam;
|
||||
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_vmDoBlock()"));
|
||||
|
||||
pBlock = hb_stackSelfItem();
|
||||
|
||||
if( ! HB_IS_BLOCK( pBlock ) )
|
||||
hb_errInternal( HB_EI_VMNOTCBLOCK, NULL, "hb_vmDoBlock()", NULL );
|
||||
|
||||
/* Check for valid count of parameters */
|
||||
iParam = pBlock->item.asBlock.paramcnt - hb_pcount();
|
||||
hb_stackBaseItem()->item.asSymbol.paramdeclcnt =
|
||||
pBlock->item.asBlock.paramcnt;
|
||||
pBase = hb_stackBaseItem();
|
||||
|
||||
/* set number of declared parameters */
|
||||
pBase->item.asSymbol.paramdeclcnt = pBlock->item.asBlock.paramcnt;
|
||||
/* set the current line number to a line where the codeblock was defined */
|
||||
pBase->item.asSymbol.stackstate->uiLineNo = pBlock->item.asBlock.lineno;
|
||||
/* set execution context for OOP scope */
|
||||
pBase->item.asSymbol.stackstate->uiClass = pBlock->item.asBlock.hclass;
|
||||
pBase->item.asSymbol.stackstate->uiMethod = pBlock->item.asBlock.method;
|
||||
/* add missing parameters */
|
||||
iParam = pBlock->item.asBlock.paramcnt - pBase->item.asSymbol.paramcnt;
|
||||
while( --iParam >= 0 )
|
||||
hb_vmPushNil();
|
||||
hb_stackAllocItem()->type = HB_IT_NIL;
|
||||
/* set static base offset */
|
||||
hb_stackSetStaticsBase( pBlock->item.asBlock.value->pStatics );
|
||||
|
||||
/* set the current line number to a line where the codeblock was defined
|
||||
*/
|
||||
hb_stackBaseItem()->item.asSymbol.stackstate->uiLineNo = pBlock->item.asBlock.lineno;
|
||||
hb_stackBaseItem()->item.asSymbol.stackstate->uiClass = pBlock->item.asBlock.hclass;
|
||||
hb_stackBaseItem()->item.asSymbol.stackstate->uiMethod = pBlock->item.asBlock.method;
|
||||
|
||||
hb_codeblockEvaluate( pBlock );
|
||||
hb_vmExecute( pBlock->item.asBlock.value->pCode,
|
||||
pBlock->item.asBlock.value->pSymbols );
|
||||
}
|
||||
|
||||
/* Evaluates a passed codeblock item with no arguments passed to a codeblock
|
||||
@@ -6953,7 +6991,7 @@ static void hb_vmPushLocal( int iLocal )
|
||||
/* local variable referenced in a codeblock
|
||||
* hb_stackSelfItem() points to a codeblock that is currently evaluated
|
||||
*/
|
||||
pLocal = hb_codeblockGetRef( hb_stackSelfItem()->item.asBlock.value, ( HB_LONG ) iLocal );
|
||||
pLocal = hb_codeblockGetRef( hb_stackSelfItem()->item.asBlock.value, iLocal );
|
||||
}
|
||||
|
||||
hb_itemCopy( hb_stackAllocItem(),
|
||||
@@ -9093,7 +9131,7 @@ static PHB_ITEM hb_xvmLocalPtr( int iLocal )
|
||||
/* local variable referenced in a codeblock
|
||||
* hb_stackSelfItem() points to a codeblock that is currently evaluated
|
||||
*/
|
||||
return hb_codeblockGetRef( hb_stackSelfItem()->item.asBlock.value, ( HB_LONG ) iLocal );
|
||||
return hb_codeblockGetRef( hb_stackSelfItem()->item.asBlock.value, iLocal );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1845,7 +1845,7 @@ PHB_ITEM hb_itemUnRefOnce( PHB_ITEM pItem )
|
||||
{
|
||||
/* local variable referenced in a codeblock */
|
||||
pItem = hb_codeblockGetRef( pItem->item.asRefer.BasePtr.block,
|
||||
pItem->item.asRefer.value );
|
||||
( int ) pItem->item.asRefer.value );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ static int hb_macroParse( HB_MACRO_PTR pMacro )
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_macroParse(%p)", pMacro));
|
||||
|
||||
/* initialize the output (pcode) buffer - it will be filled by yacc */
|
||||
pMacro->pCodeInfo = (HB_PCODE_INFO_PTR ) hb_xgrab( sizeof( HB_PCODE_INFO ) );
|
||||
pMacro->pCodeInfo = &pMacro->pCodeInfoBuffer;
|
||||
pMacro->pCodeInfo->lPCodeSize = HB_PCODE_SIZE;
|
||||
pMacro->pCodeInfo->lPCodePos = 0;
|
||||
pMacro->pCodeInfo->fVParams = HB_FALSE;
|
||||
@@ -140,8 +140,7 @@ void hb_macroDelete( HB_MACRO_PTR pMacro )
|
||||
{
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_macroDelete(%p)", pMacro));
|
||||
|
||||
hb_xfree( (void *) pMacro->pCodeInfo->pCode );
|
||||
hb_xfree( (void *) pMacro->pCodeInfo );
|
||||
hb_xfree( ( void * ) pMacro->pCodeInfo->pCode );
|
||||
if( pMacro->pError )
|
||||
hb_errRelease( pMacro->pError );
|
||||
if( pMacro->Flags & HB_MACRO_DEALLOCATE )
|
||||
@@ -1639,17 +1638,16 @@ void hb_macroCodeBlockStart( HB_COMP_DECL )
|
||||
|
||||
pCB = ( HB_PCODE_INFO_PTR ) hb_xgrab( sizeof( HB_PCODE_INFO ) );
|
||||
|
||||
/* replace current pcode buffer with the new one
|
||||
*/
|
||||
pCB->pPrev = HB_PCODE_DATA;
|
||||
HB_PCODE_DATA = pCB;
|
||||
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_macroCodeBlockStart.(%p)", HB_COMP_PARAM));
|
||||
pCB->pCode = ( HB_BYTE * ) hb_xgrab( HB_PCODE_SIZE );
|
||||
pCB->lPCodeSize = HB_PCODE_SIZE;
|
||||
pCB->lPCodePos = 0;
|
||||
pCB->fVParams = HB_FALSE;
|
||||
pCB->pLocals = NULL;
|
||||
|
||||
/* replace current pcode buffer with the new one
|
||||
*/
|
||||
pCB->pPrev = HB_PCODE_DATA;
|
||||
HB_PCODE_DATA = pCB;
|
||||
}
|
||||
|
||||
void hb_macroCodeBlockEnd( HB_COMP_DECL )
|
||||
|
||||
Reference in New Issue
Block a user