20000502-10:41 GMT+1 Victor Szakats <info@szelvesz.hu>

This commit is contained in:
Viktor Szakats
2000-05-02 08:41:18 +00:00
parent d9583b3651
commit 4f4de292f3
9 changed files with 178 additions and 10 deletions

View File

@@ -1,3 +1,20 @@
20000502-10:41 GMT+1 Victor Szakats <info@szelvesz.hu>
* include/hbpcode.h
* include/hbexprb.c
* include/hbexprc.c
* include/hbvm.h
* source/compiler/hbpcode.c
* source/compiler/hbfix.c
* source/compiler/genc.c
* source/vm/hvm.c
+ HB_P_SEND and HB_P_SENDSHORT pcodes added. At this moment they are
exactly the same as HB_P_FUNCTION[SHORT]. More work is needed to
optimize the stack usage for SEND/DO/FUNCTION.
+ hb_vmSend() function added.
! WARNING ! All sources must be recompiled.
20000502-01:30 GMT-8 Ron Pinkas <Ron@Profit-Master.com>
* source/compiler/harbour.c

View File

@@ -1526,16 +1526,16 @@ static HB_EXPR_FUNC( hb_compExprUseSend )
HB_EXPR_USE( pSelf->value.asMessage.pParms, HB_EA_PUSH_PCODE );
if( iParms > 255 )
HB_EXPR_GENPCODE3( hb_compGenPCode3, HB_P_FUNCTION, HB_LOBYTE( iParms ), HB_HIBYTE( iParms ), ( BOOL ) 1 );
HB_EXPR_GENPCODE3( hb_compGenPCode3, HB_P_SEND, HB_LOBYTE( iParms ), HB_HIBYTE( iParms ), ( BOOL ) 1 );
else
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_FUNCTIONSHORT, ( BYTE ) iParms, ( BOOL ) 1 );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_SENDSHORT, ( BYTE ) iParms, ( BOOL ) 1 );
}
else
{
/* acces to instance variable */
HB_EXPR_USE( pSelf->value.asMessage.pObject, HB_EA_PUSH_PCODE );
HB_EXPR_PCODE1( hb_compGenMessage, pSelf->value.asMessage.szMessage );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_FUNCTIONSHORT, 0, ( BOOL ) 1 );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_SENDSHORT, 0, ( BOOL ) 1 );
}
}
break;
@@ -1548,7 +1548,7 @@ static HB_EXPR_FUNC( hb_compExprUseSend )
HB_EXPR_USE( pSelf->value.asMessage.pObject, HB_EA_PUSH_PCODE );
HB_EXPR_PCODE1( hb_compGenMessageData, pSelf->value.asMessage.szMessage );
HB_EXPR_USE( pSelf->value.asMessage.pParms, HB_EA_PUSH_PCODE );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_FUNCTIONSHORT, 1, ( BOOL ) 1 );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_SENDSHORT, 1, ( BOOL ) 1 );
}
break;

View File

@@ -95,7 +95,7 @@ void hb_compExprPushOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
#endif
/* now send the message */
HB_EXPR_PCODE1( hb_compGenMessage, pObj->value.asMessage.szMessage );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_FUNCTIONSHORT, 0, ( BOOL ) 1 );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_SENDSHORT, 0, ( BOOL ) 1 );
/* NOTE: COMPATIBILITY ISSUE:
* The above HB_C52_STRICT setting determines
@@ -128,7 +128,7 @@ void hb_compExprPushOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
HB_EXPR_GENPCODE1( hb_compGenPCode1, bOpEq );
/* call pop message with one argument */
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_FUNCTIONSHORT, 1, ( BOOL ) 1 );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_SENDSHORT, 1, ( BOOL ) 1 );
}
/* TODO: add a special code for arrays to correctly handle a[ i++ ]++
*/
@@ -176,7 +176,7 @@ void hb_compExprUseOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
#endif
/* now send the message */
HB_EXPR_PCODE1( hb_compGenMessage, pObj->value.asMessage.szMessage );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_FUNCTIONSHORT, 0, ( BOOL ) 1 );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_SENDSHORT, 0, ( BOOL ) 1 );
/* push increment value */
HB_EXPR_USE( pSelf->value.asOperator.pRight, HB_EA_PUSH_PCODE );
@@ -184,7 +184,7 @@ void hb_compExprUseOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
HB_EXPR_GENPCODE1( hb_compGenPCode1, bOpEq );
/* call pop message with one argument */
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_FUNCTIONSHORT, 1, ( BOOL ) 1 );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_SENDSHORT, 1, ( BOOL ) 1 );
/* pop the value from the stack */
HB_EXPR_GENPCODE1( hb_compGenPCode1, HB_P_POP );
}
@@ -230,13 +230,13 @@ void hb_compExprPushPreOp( HB_EXPR_PTR pSelf, BYTE bOper )
#endif
/* now send the message */
HB_EXPR_PCODE1( hb_compGenMessage, pObj->value.asMessage.szMessage );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_FUNCTIONSHORT, 0, ( BOOL ) 1 );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_SENDSHORT, 0, ( BOOL ) 1 );
/* increase/decrease operation */
HB_EXPR_GENPCODE1( hb_compGenPCode1, bOper );
/* call pop message with one argument - it leaves the value on the stack */
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_FUNCTIONSHORT, 1, ( BOOL ) 1 );
HB_EXPR_GENPCODE2( hb_compGenPCode2, HB_P_SENDSHORT, 1, ( BOOL ) 1 );
}
else
{

View File

@@ -153,6 +153,8 @@ typedef enum
HB_P_PUSHSYMNEAR, /* places a symbol on the virtual machine stack */
HB_P_PUSHVARIABLE, /* pushes the contains of an undeclared variable to the virtual machine stack */
HB_P_RETVALUE, /* instructs the virtual machine to return the latest stack value */
HB_P_SEND, /* send operator */
HB_P_SENDSHORT, /* send operator */
HB_P_SEQBEGIN, /* BEGIN SEQUENCE */
HB_P_SEQEND, /* END SEQUENCE */
HB_P_SEQRECOVER, /* RECOVER statement */

View File

@@ -72,6 +72,7 @@ extern void hb_vmMessage( PHB_SYMB pSymMsg ); /* sends a message to an object
/* Execution */
extern void hb_vmDo( USHORT uiParams ); /* invoke the virtual machine */
extern void hb_vmFunction( USHORT uiParams ); /* executes a function saving its result */
extern void hb_vmSend( USHORT uiParams ); /* sends a message to an object */
extern PHB_ITEM hb_vmEvalBlock( PHB_ITEM pBlockItem ); /* executes passed codeblock with no arguments */
/* executes passed codeblock with variable number of arguments */
extern PHB_ITEM hb_vmEvalBlockV( PHB_ITEM pBlockItem, USHORT uiArgCount, ... );

View File

@@ -1452,6 +1452,20 @@ static HB_GENC_FUNC( hb_p_retvalue )
return 1;
}
static HB_GENC_FUNC( hb_p_send )
{
fprintf( cargo->yyc, "\tHB_P_SEND, %i, %i,\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ] );
return 3;
}
static HB_GENC_FUNC( hb_p_sendshort )
{
fprintf( cargo->yyc, "\tHB_P_SENDSHORT, %i,\n", pFunc->pCode[ lPCodePos + 1 ] );
return 2;
}
static HB_GENC_FUNC( hb_p_seqbegin )
{
fprintf( cargo->yyc, "\tHB_P_SEQBEGIN, %i, %i, %i,",
@@ -1681,6 +1695,8 @@ static HB_GENC_FUNC_PTR s_verbose_table[] = {
hb_p_pushsymnear,
hb_p_pushvariable,
hb_p_retvalue,
hb_p_send,
hb_p_sendshort,
hb_p_seqbegin,
hb_p_seqend,
hb_p_seqrecover,

View File

@@ -330,6 +330,8 @@ static HB_FIX_FUNC_PTR s_fixlocals_table[] =
NULL, /* HB_P_PUSHSYMNEAR, */
NULL, /* HB_P_PUSHVARIABLE, */
NULL, /* HB_P_RETVALUE, */
NULL, /* HB_P_SEND, */
NULL, /* HB_P_SENDSHORT, */
NULL, /* HB_P_SEQBEGIN, */
NULL, /* HB_P_SEQEND, */
NULL, /* HB_P_SEQRECOVER, */

View File

@@ -158,6 +158,8 @@ static BYTE s_pcode_len[] = {
2, /* HB_P_PUSHSYMNEAR, */
3, /* HB_P_PUSHVARIABLE, */
1, /* HB_P_RETVALUE, */
3, /* HB_P_SEND, */
2, /* HB_P_SENDSHORT, */
4, /* HB_P_SEQBEGIN, */
4, /* HB_P_SEQEND, */
1, /* HB_P_SEQRECOVER, */

View File

@@ -131,6 +131,7 @@ static void hb_vmSFrame( PHB_SYMB pSym ); /* sets the statics frame for a
static void hb_vmStatics( PHB_SYMB pSym, USHORT uiStatics ); /* increases the the global statics array to hold a PRG statics */
static void hb_vmEndBlock( void ); /* copies the last codeblock pushed value into the return value */
static void hb_vmRetValue( void ); /* pops the latest stack value into stack.Return */
static void hb_vmSendFunc( USHORT uiParams );
static void hb_vmDebuggerShowLine( USHORT uiLine ); /* makes the debugger shows a specific source code line */
static void hb_vmDebuggerEndProc( void ); /* notifies the debugger for an endproc */
@@ -560,6 +561,16 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
w += 2;
break;
case HB_P_SEND:
hb_vmSendFunc( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) );
w += 3;
break;
case HB_P_SENDSHORT:
hb_vmSendFunc( pCode[ w + 1 ] );
w += 2;
break;
case HB_P_LINE:
HB_TRACE(HB_TR_INFO, ("Opcode: HB_P_LINE: %s (%i)", hb_stack.pBase->item.asSymbol.value->szName, hb_stack.pBase->item.asSymbol.lineno));
@@ -2798,6 +2809,113 @@ void hb_vmDo( USHORT uiParams )
s_bDebugging = bDebugPrevState;
}
void hb_vmSend( USHORT uiParams )
{
PHB_ITEM pItem;
PHB_SYMB pSym;
LONG wStackBase;
LONG wItemIndex;
PHB_ITEM pSelf;
PHB_BASEARRAY pSelfBase;
PHB_FUNC pFunc;
int iStatics;
BOOL bDebugPrevState;
HB_TRACE(HB_TR_DEBUG, ("hb_vmSend(%hu)", uiParams));
pItem = hb_stack.pPos - uiParams - 2; /* procedure name */
pSym = pItem->item.asSymbol.value;
wStackBase = hb_stack.pBase - hb_stack.pItems; /* as the stack memory block could change */
wItemIndex = pItem - hb_stack.pItems;
pSelf = hb_stack.pPos - uiParams - 1; /* NIL, OBJECT or BLOCK */
iStatics = hb_stack.iStatics; /* Return iStatics position */
bDebugPrevState = s_bDebugging;
s_bDebugging = FALSE;
if( ! HB_IS_SYMBOL( pItem ) )
{
/* QUESTION: Is this call needed ? [vszakats] */
hb_stackDispLocal();
hb_errInternal( IE_VMNOTSYMBOL, NULL, "hb_vmSend()", NULL );
}
#if 0
if( ! HB_IS_NIL( pSelf ) )
{
/* QUESTION: Is this call needed ? [vszakats] */
hb_stackDispLocal();
hb_errInternal( IE_VMINVSYMBOL, NULL, "hb_vmSend()", NULL );
}
#endif
pItem->item.asSymbol.lineno = 0;
pItem->item.asSymbol.paramcnt = uiParams;
hb_stack.pBase = hb_stack.pItems + pItem->item.asSymbol.stackbase;
pItem->item.asSymbol.stackbase = wStackBase;
if( ! HB_IS_NIL( pSelf ) ) /* are we sending a message ? */
{
if( pSym == &( hb_symEval ) && HB_IS_BLOCK( pSelf ) )
pFunc = pSym->pFunPtr; /* __EVAL method = function */
else
{
pFunc = hb_objGetMethod( pSelf, pSym );
if( HB_IS_OBJECT( pSelf ) ) /* Object passed */
{
pSelfBase = pSelf->item.asArray.value;
if( pSelfBase->uiPrevCls ) /* Is is a Super cast ? */
{
pSelfBase->uiClass = pSelfBase->uiPrevCls;
pSelfBase->uiPrevCls = 0;
}
}
}
if( pFunc )
pFunc();
else
{
PHB_ITEM pResult;
if( pSym->szName[ 0 ] == '_' )
pResult = hb_errRT_BASE_Subst( EG_NOVARMETHOD, 1005, NULL, pSym->szName + 1 );
else
pResult = hb_errRT_BASE_Subst( EG_NOMETHOD, 1004, NULL, pSym->szName );
if( pResult )
{
hb_itemReturn( pResult );
hb_itemRelease( pResult );
}
}
}
else /* it is a function */
{
pFunc = pSym->pFunPtr;
if( pFunc )
pFunc();
else
{
/* Attempt to call an undefined function
* - generate unrecoverable runtime error
*/
hb_errRT_BASE( EG_NOFUNC, 1001, NULL, pSym->szName );
}
}
while( hb_stack.pPos > hb_stack.pItems + wItemIndex )
hb_stackPop();
hb_stack.pBase = hb_stack.pItems + wStackBase;
hb_stack.iStatics = iStatics;
if( s_bDebugging )
hb_vmDebuggerEndProc();
s_bDebugging = bDebugPrevState;
}
static HARBOUR hb_vmDoBlock( void )
{
PHB_ITEM pBlock;
@@ -2881,6 +2999,16 @@ void hb_vmFunction( USHORT uiParams )
hb_stackPush();
}
static void hb_vmSendFunc( USHORT uiParams )
{
HB_TRACE(HB_TR_DEBUG, ("hb_vmSendFunc(%hu)", uiParams));
hb_itemClear( &hb_stack.Return );
hb_vmSend( uiParams );
hb_itemCopy( hb_stack.pPos, &hb_stack.Return );
hb_stackPush();
}
static void hb_vmLocalName( USHORT uiLocal, char * szLocalName ) /* locals and parameters index and name information for the debugger */
{
HB_TRACE(HB_TR_DEBUG, ("hb_vmLocalName(%hu, %s)", uiLocal, szLocalName));