diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 7b4e827592..871e41f877 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,19 @@ +20000501-18:48 GMT+1 Victor Szakats + + * 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 *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 * source/rtl/filesys.c diff --git a/harbour/include/hbpcode.h b/harbour/include/hbpcode.h index 9194ad8881..62adb7ff29 100644 --- a/harbour/include/hbpcode.h +++ b/harbour/include/hbpcode.h @@ -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 */ diff --git a/harbour/source/compiler/genc.c b/harbour/source/compiler/genc.c index bdaf2e21d5..f472fb8cc4 100644 --- a/harbour/source/compiler/genc.c +++ b/harbour/source/compiler/genc.c @@ -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, diff --git a/harbour/source/compiler/harbour.c b/harbour/source/compiler/harbour.c index e2e379ab66..d887b0d1f4 100644 --- a/harbour/source/compiler/harbour.c +++ b/harbour/source/compiler/harbour.c @@ -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; diff --git a/harbour/source/compiler/hbfix.c b/harbour/source/compiler/hbfix.c index 060499761a..154560c157 100644 --- a/harbour/source/compiler/hbfix.c +++ b/harbour/source/compiler/hbfix.c @@ -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, */ diff --git a/harbour/source/compiler/hbpcode.c b/harbour/source/compiler/hbpcode.c index fb9e94bb61..683695f7a2 100644 --- a/harbour/source/compiler/hbpcode.c +++ b/harbour/source/compiler/hbpcode.c @@ -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, */ diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 83eda3b808..7d829014f1 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -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