20000501-18:48 GMT+1 Victor Szakats <info@szelvesz.hu>
This commit is contained in:
@@ -1,3 +1,19 @@
|
||||
20000501-18:48 GMT+1 Victor Szakats <info@szelvesz.hu>
|
||||
|
||||
* include/hbpcode.h
|
||||
* source/compiler/hbfix.c
|
||||
* source/compiler/hbpcode.c
|
||||
* source/compiler/genc.c
|
||||
* source/compiler/harbour.c
|
||||
* source/vm/hvm.c
|
||||
+ Added new pcode: HB_P_PUSHBLOCKSHORT
|
||||
This is used for codeblocks which have no parameters, use no locals,
|
||||
and the total size is smaller than 255 bytes. The majority of codeblocks
|
||||
falls into this category.
|
||||
HB_TEST is now 15K smaller.
|
||||
|
||||
! WARNING ! All .PRGs must be recompiled after the changes of today.
|
||||
|
||||
20000501 14:35 GMT-3 Luiz Rafael Culik <culik@sl.conex.net>
|
||||
*contrib/libgt/doc/gendoc.bat
|
||||
contrib/libgt/doc/gendoc.cmd
|
||||
@@ -7,7 +23,6 @@
|
||||
*utils/hbdoc/hbdoc.prg
|
||||
*small bug fixed
|
||||
|
||||
|
||||
20000501-18:05 GMT+1 Victor Szakats <info@szelvesz.hu>
|
||||
|
||||
* source/rtl/filesys.c
|
||||
|
||||
@@ -132,6 +132,7 @@ typedef enum
|
||||
HB_P_PUSHALIASEDFIELDNEAR, /* pushes aliased field */
|
||||
HB_P_PUSHALIASEDVAR, /* pushes aliased variable (either a field or a memvar) */
|
||||
HB_P_PUSHBLOCK, /* start of a codeblock definition */
|
||||
HB_P_PUSHBLOCKSHORT, /* start of a codeblock definition */
|
||||
HB_P_PUSHFIELD, /* pushes unaliased field */
|
||||
HB_P_PUSHBYTE, /* places a 1 byte integer number on the virtual machine stack */
|
||||
HB_P_PUSHINT, /* places an integer number on the virtual machine stack */
|
||||
|
||||
@@ -1099,6 +1099,20 @@ static HB_GENC_FUNC( hb_p_pushblock )
|
||||
return lPCodePos - ulStart;
|
||||
}
|
||||
|
||||
static HB_GENC_FUNC( hb_p_pushblockshort )
|
||||
{
|
||||
++cargo->iNestedCodeblock;
|
||||
|
||||
fprintf( cargo->yyc, "\tHB_P_PUSHBLOCKSHORT, %i,",
|
||||
pFunc->pCode[ lPCodePos + 1 ] );
|
||||
if( cargo->bVerbose )
|
||||
fprintf( cargo->yyc, "\t/* %i */",
|
||||
pFunc->pCode[ lPCodePos + 1 ] );
|
||||
fprintf( cargo->yyc, "\n" );
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
static HB_GENC_FUNC( hb_p_pushdouble )
|
||||
{
|
||||
int i;
|
||||
@@ -1645,6 +1659,7 @@ static HB_GENC_FUNC_PTR s_verbose_table[] = {
|
||||
hb_p_pushaliasedfieldnear,
|
||||
hb_p_pushaliasedvar,
|
||||
hb_p_pushblock,
|
||||
hb_p_pushblockshort,
|
||||
hb_p_pushfield,
|
||||
hb_p_pushbyte,
|
||||
hb_p_pushint,
|
||||
|
||||
@@ -2899,12 +2899,24 @@ void hb_compCodeBlockEnd( void )
|
||||
++wLocals;
|
||||
}
|
||||
|
||||
/* NOTE: 8 = HB_P_PUSHBLOCK + USHORT( size ) + USHORT( wParams ) + USHORT( wLocals ) + _ENDBLOCK */
|
||||
wSize = ( USHORT ) pCodeblock->lPCodePos + 8 + wLocals * 2;
|
||||
|
||||
hb_compGenPCode3( HB_P_PUSHBLOCK, HB_LOBYTE( wSize ), HB_HIBYTE( wSize ), ( BOOL ) 1 );
|
||||
hb_compGenPCode2( HB_LOBYTE( pCodeblock->wParamCount ), HB_HIBYTE( pCodeblock->wParamCount ), ( BOOL ) 0 );
|
||||
hb_compGenPCode2( HB_LOBYTE( wLocals ), HB_HIBYTE( wLocals ), ( BOOL ) 0 );
|
||||
if( ( pCodeblock->lPCodePos + 3 ) <= 255 &&
|
||||
pCodeblock->wParamCount == 0 &&
|
||||
wLocals == 0 )
|
||||
{
|
||||
/* NOTE: 3 = HB_P_PUSHBLOCKSHORT + BYTE( size ) + _ENDBLOCK */
|
||||
wSize = ( USHORT ) pCodeblock->lPCodePos + 3;
|
||||
|
||||
hb_compGenPCode2( HB_P_PUSHBLOCKSHORT, ( BYTE ) wSize, ( BOOL ) 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* NOTE: 8 = HB_P_PUSHBLOCK + USHORT( size ) + USHORT( wParams ) + USHORT( wLocals ) + _ENDBLOCK */
|
||||
wSize = ( USHORT ) pCodeblock->lPCodePos + 8 + wLocals * 2;
|
||||
|
||||
hb_compGenPCode3( HB_P_PUSHBLOCK, HB_LOBYTE( wSize ), HB_HIBYTE( wSize ), ( BOOL ) 1 );
|
||||
hb_compGenPCode2( HB_LOBYTE( pCodeblock->wParamCount ), HB_HIBYTE( pCodeblock->wParamCount ), ( BOOL ) 0 );
|
||||
hb_compGenPCode2( HB_LOBYTE( wLocals ), HB_HIBYTE( wLocals ), ( BOOL ) 0 );
|
||||
}
|
||||
|
||||
/* generate the table of referenced local variables */
|
||||
pVar = pCodeblock->pStatics;
|
||||
|
||||
@@ -93,6 +93,13 @@ static HB_FIX_FUNC( hb_p_pushblock )
|
||||
return lPCodePos - ulStart;
|
||||
}
|
||||
|
||||
static HB_FIX_FUNC( hb_p_pushblockshort )
|
||||
{
|
||||
++cargo->iNestedCodeblock;
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
static HB_FIX_FUNC( hb_p_localname )
|
||||
{
|
||||
ULONG ulStart = lPCodePos;
|
||||
@@ -302,6 +309,7 @@ static HB_FIX_FUNC_PTR s_fixlocals_table[] =
|
||||
NULL, /* HB_P_PUSHALIASEDFIELDNEAR, */
|
||||
NULL, /* HB_P_PUSHALIASEDVAR, */
|
||||
hb_p_pushblock, /* HB_P_PUSHBLOCK, */
|
||||
hb_p_pushblockshort, /* HB_P_PUSHBLOCKSHORT, */
|
||||
NULL, /* HB_P_PUSHFIELD, */
|
||||
NULL, /* HB_P_PUSHBYTE, */
|
||||
NULL, /* HB_P_PUSHINT, */
|
||||
|
||||
@@ -137,6 +137,7 @@ static BYTE s_pcode_len[] = {
|
||||
2, /* HB_P_PUSHALIASEDFIELDNEAR, */
|
||||
3, /* HB_P_PUSHALIASEDVAR, */
|
||||
0, /* HB_P_PUSHBLOCK, */
|
||||
0, /* HB_P_PUSHBLOCKSHORT, */
|
||||
3, /* HB_P_PUSHFIELD, */
|
||||
2, /* HB_P_PUSHBYTE, */
|
||||
3, /* HB_P_PUSHINT, */
|
||||
|
||||
@@ -139,6 +139,7 @@ static void hb_vmPushAlias( void ); /* pushes the current workarea
|
||||
static void hb_vmPushAliasedField( PHB_SYMB ); /* pushes an aliased field on the eval stack */
|
||||
static void hb_vmPushAliasedVar( PHB_SYMB ); /* pushes an aliased variable on the eval stack */
|
||||
static void hb_vmPushBlock( BYTE * pCode, PHB_SYMB pSymbols ); /* creates a codeblock */
|
||||
static void hb_vmPushBlockShort( BYTE * pCode, PHB_SYMB pSymbols ); /* creates a codeblock */
|
||||
static void hb_vmPushDoubleConst( double dNumber, int iWidth, int iDec ); /* Pushes a double constant (pcode) */
|
||||
static void hb_vmPushMacroBlock( BYTE * pCode, PHB_SYMB pSymbols ); /* creates a macro-compiled codeblock */
|
||||
static void hb_vmPushLocal( SHORT iLocal ); /* pushes the containts of a local onto the stack */
|
||||
@@ -924,6 +925,14 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
|
||||
w += ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) );
|
||||
break;
|
||||
|
||||
case HB_P_PUSHBLOCKSHORT:
|
||||
/* +0 -> _pushblock
|
||||
* +1 -> size of codeblock
|
||||
*/
|
||||
hb_vmPushBlockShort( ( BYTE * ) ( pCode + w ), pSymbols );
|
||||
w += pCode[ w + 1 ];
|
||||
break;
|
||||
|
||||
case HB_P_PUSHSELF:
|
||||
hb_vmPush( hb_stack.pBase + 1 );
|
||||
w++;
|
||||
@@ -3186,6 +3195,38 @@ static void hb_vmPushBlock( BYTE * pCode, PHB_SYMB pSymbols )
|
||||
hb_stackPush();
|
||||
}
|
||||
|
||||
/* +0 -> HB_P_PUSHBLOCKSHORT
|
||||
* +1 -> size of codeblock
|
||||
* +2 -> start of table with referenced local variables
|
||||
*
|
||||
* NOTE: pCode points to static memory
|
||||
*/
|
||||
static void hb_vmPushBlockShort( BYTE * pCode, PHB_SYMB pSymbols )
|
||||
{
|
||||
USHORT uiLocals;
|
||||
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_vmPushBlockShort(%p, %p)", pCode, pSymbols));
|
||||
|
||||
hb_stack.pPos->type = HB_IT_BLOCK;
|
||||
|
||||
hb_stack.pPos->item.asBlock.value =
|
||||
hb_codeblockNew( pCode + 2, /* pcode buffer */
|
||||
0, /* number of referenced local variables */
|
||||
NULL, /* table with referenced local variables */
|
||||
pSymbols );
|
||||
|
||||
/* store the statics base of function where the codeblock was defined
|
||||
*/
|
||||
hb_stack.pPos->item.asBlock.statics = hb_stack.iStatics;
|
||||
/* store the number of expected parameters
|
||||
*/
|
||||
hb_stack.pPos->item.asBlock.paramcnt = 0;
|
||||
/* store the line number where the codeblock was defined
|
||||
*/
|
||||
hb_stack.pPos->item.asBlock.lineno = hb_stack.pBase->item.asSymbol.lineno;
|
||||
hb_stackPush();
|
||||
}
|
||||
|
||||
/* +0 -> HB_P_MPUSHBLOCK
|
||||
* +1 +2 -> size of codeblock
|
||||
* +3 +4 -> number of expected parameters
|
||||
|
||||
Reference in New Issue
Block a user