20000501-18:48 GMT+1 Victor Szakats <info@szelvesz.hu>

This commit is contained in:
Viktor Szakats
2000-05-01 16:49:56 +00:00
parent 0affcb633f
commit d2baf5dbfc
7 changed files with 100 additions and 7 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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