From 28a4c0837e6bd7946d49cf54b1761738cfa87b58 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sat, 22 Apr 2000 18:34:36 +0000 Subject: [PATCH] 20000422-20:37 GMT+1 Victor Szakats --- harbour/ChangeLog | 14 ++ harbour/include/hbvm.h | 2 +- harbour/include/hbvmpub.h | 2 +- harbour/source/compiler/genc.c | 263 +++++++++++++++--------------- harbour/source/compiler/harbour.c | 7 +- harbour/source/vm/hvm.c | 49 +++--- 6 files changed, 172 insertions(+), 165 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 42c78bd9f9..76b0c6a5e0 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,17 @@ +20000422-20:37 GMT+1 Victor Szakats + + * source/vm/hvm.c + % Removed the temporary uiParams variable in hb_vmExecute(). + + * include/hbvm.h + * include/hbvmpub.h + * source/vm/hvm.c + ! hb_vmExecute() first param marked "const" + + * source/compiler/harbour.c + * source/compiler/genc.c + + Added support for empty .prg files. Thanks to Jose Lalin. + 20000422-18:41 GMT+1 Victor Szakats * include/hbpcode.h diff --git a/harbour/include/hbvm.h b/harbour/include/hbvm.h index bd258193b7..4f1c402119 100644 --- a/harbour/include/hbvm.h +++ b/harbour/include/hbvm.h @@ -47,7 +47,7 @@ extern void hb_vmInit( BOOL bStartMainProc ); extern void hb_vmQuit( void ); /* Harbour virtual machine functions */ -extern void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ); /* invokes the virtual machine */ +extern void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ); /* invokes the virtual machine */ extern void hb_vmProcessSymbols( PHB_SYMB pSymbols, USHORT uiSymbols ); /* statics symbols initialization */ extern void hb_vmSymbolInit_RT( void ); /* initialization of runtime support symbols */ diff --git a/harbour/include/hbvmpub.h b/harbour/include/hbvmpub.h index 4bc7f7a0a3..deb367407b 100644 --- a/harbour/include/hbvmpub.h +++ b/harbour/include/hbvmpub.h @@ -81,7 +81,7 @@ typedef HB_DYNS_FUNC( PHB_DYNS_FUNC ); #define HB_FS_MESSAGE ( ( HB_SYMBOLSCOPE ) 0x20 ) #define HB_FS_MEMVAR ( ( HB_SYMBOLSCOPE ) 0x80 ) -extern void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ); /* invokes the virtual machine */ +extern void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ); /* invokes the virtual machine */ #if defined(HB_EXTERN_C) } diff --git a/harbour/source/compiler/genc.c b/harbour/source/compiler/genc.c index 4868888624..566f64e790 100644 --- a/harbour/source/compiler/genc.c +++ b/harbour/source/compiler/genc.c @@ -66,141 +66,146 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou HB_VER_MAJOR, HB_VER_MINOR, HB_VER_REVISION, HB_VER_BUILD, HB_VER_YEAR, HB_VER_MONTH, HB_VER_DAY ); fprintf( yyc, " * Generated C source code\n */\n\n" ); - fprintf( yyc, "#include \"hbvmpub.h\"\n" ); - if( hb_comp_iGenCOutput != HB_COMPGENC_COMPACT ) - fprintf( yyc, "#include \"hbpcode.h\"\n" ); - fprintf( yyc, "#include \"hbinit.h\"\n\n\n" ); - - if( ! hb_comp_bStartProc ) - pFunc = pFunc->pNext; /* No implicit starting procedure */ - - /* write functions prototypes for PRG defined functions */ - while( pFunc ) + if( hb_comp_iFunctionCnt ) { - if( pFunc->cScope & HB_FS_STATIC || pFunc->cScope & HB_FS_INIT || pFunc->cScope & HB_FS_EXIT ) - fprintf( yyc, "static " ); - else - fprintf( yyc, " " ); - - if( pFunc == hb_comp_pInitFunc ) - fprintf( yyc, "HARBOUR hb_INITSTATICS( void );\n" ); /* NOTE: hb_ intentionally in lower case */ - else - fprintf( yyc, "HB_FUNC( %s );\n", pFunc->szName ); - pFunc = pFunc->pNext; - } - /* write functions prototypes for called functions outside this PRG */ - pFunc = hb_comp_funcalls.pFirst; - while( pFunc ) - { - pFTemp = hb_compFunctionFind( pFunc->szName ); - if( ! pFTemp || pFTemp == hb_comp_functions.pFirst ) - fprintf( yyc, "extern HB_FUNC( %s );\n", pFunc->szName ); - pFunc = pFunc->pNext; - } - - /* writes the symbol table */ - /* Generate the wrapper that will initialize local symbol table - */ - hb_strupr( pFileName->szName ); - fprintf( yyc, "\n\nHB_INIT_SYMBOLS_BEGIN( hb_vm_SymbolInit_%s%s )\n", hb_comp_szPrefix, pFileName->szName ); - - while( pSym ) - { - if( pSym->szName[ 0 ] == '(' ) + fprintf( yyc, "#include \"hbvmpub.h\"\n" ); + if( hb_comp_iGenCOutput != HB_COMPGENC_COMPACT ) + fprintf( yyc, "#include \"hbpcode.h\"\n" ); + fprintf( yyc, "#include \"hbinit.h\"\n\n\n" ); + + if( ! hb_comp_bStartProc ) + pFunc = pFunc->pNext; /* No implicit starting procedure */ + + /* write functions prototypes for PRG defined functions */ + while( pFunc ) { - /* Since the normal function cannot be INIT and EXIT at the same time - * we are using these two bits to mark the special function used to - * initialize static variables - */ - fprintf( yyc, "{ \"(_INITSTATICS)\", HB_FS_INIT | HB_FS_EXIT, hb_INITSTATICS, NULL }" ); /* NOTE: hb_ intentionally in lower case */ + if( pFunc->cScope & HB_FS_STATIC || pFunc->cScope & HB_FS_INIT || pFunc->cScope & HB_FS_EXIT ) + fprintf( yyc, "static " ); + else + fprintf( yyc, " " ); + + if( pFunc == hb_comp_pInitFunc ) + fprintf( yyc, "HARBOUR hb_INITSTATICS( void );\n" ); /* NOTE: hb_ intentionally in lower case */ + else + fprintf( yyc, "HB_FUNC( %s );\n", pFunc->szName ); + pFunc = pFunc->pNext; } - else + /* write functions prototypes for called functions outside this PRG */ + pFunc = hb_comp_funcalls.pFirst; + while( pFunc ) { - fprintf( yyc, "{ \"%s\", ", pSym->szName ); - - if( pSym->cScope & HB_FS_STATIC ) - fprintf( yyc, "HB_FS_STATIC" ); - - else if( pSym->cScope & HB_FS_INIT ) - fprintf( yyc, "HB_FS_INIT" ); - - else if( pSym->cScope & HB_FS_EXIT ) - fprintf( yyc, "HB_FS_EXIT" ); - - else - fprintf( yyc, "HB_FS_PUBLIC" ); - - if( pSym->cScope & VS_MEMVAR ) - fprintf( yyc, " | HB_FS_MEMVAR" ); - - if( ( pSym->cScope != HB_FS_MESSAGE ) && ( pSym->cScope & HB_FS_MESSAGE ) ) /* only for non public symbols */ - fprintf( yyc, " | HB_FS_MESSAGE" ); - - /* specify the function address if it is a defined function or an - external called function */ - if( hb_compFunctionFind( pSym->szName ) ) /* is it a function defined in this module */ - fprintf( yyc, ", HB_FUNCNAME( %s ), NULL }", pSym->szName ); - else if( hb_compFunCallFind( pSym->szName ) ) /* is it a function called from this module */ - fprintf( yyc, ", HB_FUNCNAME( %s ), NULL }", pSym->szName ); - else - fprintf( yyc, ", NULL, NULL }" ); /* memvar */ + pFTemp = hb_compFunctionFind( pFunc->szName ); + if( ! pFTemp || pFTemp == hb_comp_functions.pFirst ) + fprintf( yyc, "extern HB_FUNC( %s );\n", pFunc->szName ); + pFunc = pFunc->pNext; + } + + /* writes the symbol table */ + /* Generate the wrapper that will initialize local symbol table + */ + hb_strupr( pFileName->szName ); + fprintf( yyc, "\n\nHB_INIT_SYMBOLS_BEGIN( hb_vm_SymbolInit_%s%s )\n", hb_comp_szPrefix, pFileName->szName ); + + while( pSym ) + { + if( pSym->szName[ 0 ] == '(' ) + { + /* Since the normal function cannot be INIT and EXIT at the same time + * we are using these two bits to mark the special function used to + * initialize static variables + */ + fprintf( yyc, "{ \"(_INITSTATICS)\", HB_FS_INIT | HB_FS_EXIT, hb_INITSTATICS, NULL }" ); /* NOTE: hb_ intentionally in lower case */ + } + else + { + fprintf( yyc, "{ \"%s\", ", pSym->szName ); + + if( pSym->cScope & HB_FS_STATIC ) + fprintf( yyc, "HB_FS_STATIC" ); + + else if( pSym->cScope & HB_FS_INIT ) + fprintf( yyc, "HB_FS_INIT" ); + + else if( pSym->cScope & HB_FS_EXIT ) + fprintf( yyc, "HB_FS_EXIT" ); + + else + fprintf( yyc, "HB_FS_PUBLIC" ); + + if( pSym->cScope & VS_MEMVAR ) + fprintf( yyc, " | HB_FS_MEMVAR" ); + + if( ( pSym->cScope != HB_FS_MESSAGE ) && ( pSym->cScope & HB_FS_MESSAGE ) ) /* only for non public symbols */ + fprintf( yyc, " | HB_FS_MESSAGE" ); + + /* specify the function address if it is a defined function or an + external called function */ + if( hb_compFunctionFind( pSym->szName ) ) /* is it a function defined in this module */ + fprintf( yyc, ", HB_FUNCNAME( %s ), NULL }", pSym->szName ); + else if( hb_compFunCallFind( pSym->szName ) ) /* is it a function called from this module */ + fprintf( yyc, ", HB_FUNCNAME( %s ), NULL }", pSym->szName ); + else + fprintf( yyc, ", NULL, NULL }" ); /* memvar */ + } + + if( pSym != hb_comp_symbols.pLast ) + fprintf( yyc, ",\n" ); + + pSym = pSym->pNext; + } + + fprintf( yyc, "\nHB_INIT_SYMBOLS_END( hb_vm_SymbolInit_%s%s )\n" + "#if defined(_MSC_VER)\n" + " #if _MSC_VER >= 1010\n" + /* [pt] First version of MSC I have that supports this */ + /* is msvc4.1 (which is msc 10.10) */ + " #pragma data_seg( \".CRT$XIY\" )\n" + " #pragma comment( linker, \"/Merge:.CRT=.data\" )\n" + " #else\n" + " #pragma data_seg( \"XIY\" )\n" + " #endif\n" + " static HB_$INITSYM hb_vm_auto_SymbolInit_%s%s = hb_vm_SymbolInit_%s%s;\n" + " #pragma data_seg()\n" + "#elif ! defined(__GNUC__)\n" + " #pragma startup hb_vm_SymbolInit_%s%s\n" + "#endif\n\n", + hb_comp_szPrefix, pFileName->szName, + hb_comp_szPrefix, pFileName->szName, + hb_comp_szPrefix, pFileName->szName, + hb_comp_szPrefix, pFileName->szName ); + + /* Generate functions data + */ + pFunc = hb_comp_functions.pFirst; + + if( ! hb_comp_bStartProc ) + pFunc = pFunc->pNext; /* No implicit starting procedure */ + + while( pFunc ) + { + if( pFunc->cScope != HB_FS_PUBLIC ) + fprintf( yyc, "static " ); + + if( pFunc == hb_comp_pInitFunc ) /* Is it STATICS$ */ + fprintf( yyc, "HARBOUR hb_INITSTATICS( void )" ); /* NOTE: hb_ intentionally in lower case */ + else + fprintf( yyc, "HB_FUNC( %s )", pFunc->szName ); + + fprintf( yyc, "\n{\n static const BYTE pcode[] =\n {\n" ); + + if( hb_comp_iGenCOutput == HB_COMPGENC_COMPACT ) + hb_compGenCCompact( pFunc, yyc ); + else + hb_compGenCReadable( pFunc, yyc ); + + fprintf( yyc, " };\n\n" ); + fprintf( yyc, " hb_vmExecute( pcode, symbols );\n}\n\n" ); + pFunc = pFunc->pNext; } - - if( pSym != hb_comp_symbols.pLast ) - fprintf( yyc, ",\n" ); - - pSym = pSym->pNext; } - - fprintf( yyc, "\nHB_INIT_SYMBOLS_END( hb_vm_SymbolInit_%s%s )\n" - "#if defined(_MSC_VER)\n" - " #if _MSC_VER >= 1010\n" - /* [pt] First version of MSC I have that supports this */ - /* is msvc4.1 (which is msc 10.10) */ - " #pragma data_seg( \".CRT$XIY\" )\n" - " #pragma comment( linker, \"/Merge:.CRT=.data\" )\n" - " #else\n" - " #pragma data_seg( \"XIY\" )\n" - " #endif\n" - " static HB_$INITSYM hb_vm_auto_SymbolInit_%s%s = hb_vm_SymbolInit_%s%s;\n" - " #pragma data_seg()\n" - "#elif ! defined(__GNUC__)\n" - " #pragma startup hb_vm_SymbolInit_%s%s\n" - "#endif\n\n", - hb_comp_szPrefix, pFileName->szName, - hb_comp_szPrefix, pFileName->szName, - hb_comp_szPrefix, pFileName->szName, - hb_comp_szPrefix, pFileName->szName ); - - /* Generate functions data - */ - pFunc = hb_comp_functions.pFirst; - - if( ! hb_comp_bStartProc ) - pFunc = pFunc->pNext; /* No implicit starting procedure */ - - while( pFunc ) - { - if( pFunc->cScope != HB_FS_PUBLIC ) - fprintf( yyc, "static " ); - - if( pFunc == hb_comp_pInitFunc ) /* Is it STATICS$ */ - fprintf( yyc, "HARBOUR hb_INITSTATICS( void )" ); /* NOTE: hb_ intentionally in lower case */ - else - fprintf( yyc, "HB_FUNC( %s )", pFunc->szName ); - - fprintf( yyc, "\n{\n static const BYTE pcode[] =\n {\n" ); - - if( hb_comp_iGenCOutput == HB_COMPGENC_COMPACT ) - hb_compGenCCompact( pFunc, yyc ); - else - hb_compGenCReadable( pFunc, yyc ); - - fprintf( yyc, " };\n\n" ); - fprintf( yyc, " hb_vmExecute( pcode, symbols );\n}\n\n" ); - pFunc = pFunc->pNext; - } - + else + fprintf( yyc, "/* Empty source file */\n\n" ); + fclose( yyc ); pFunc = hb_comp_functions.pFirst; diff --git a/harbour/source/compiler/harbour.c b/harbour/source/compiler/harbour.c index 97735dc337..12af18aef8 100644 --- a/harbour/source/compiler/harbour.c +++ b/harbour/source/compiler/harbour.c @@ -231,12 +231,11 @@ int main( int argc, char * argv[] ) /* we create the output file name */ hb_compOutputFile(); + if( ! hb_comp_bStartProc ) + --hb_comp_iFunctionCnt; + if( ! hb_comp_bQuiet ) - { - if( ! hb_comp_bStartProc ) - --hb_comp_iFunctionCnt; printf( "\rLines %i, Functions/Procedures %i\n", hb_comp_iLine, hb_comp_iFunctionCnt ); - } hb_compGenOutput( hb_comp_iLanguage ); } diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 16e40d1c50..e0ede9c943 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -359,11 +359,10 @@ void hb_vmQuit( void ) exit( s_byErrorLevel ); } -void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) +void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) { BYTE bCode; LONG w = 0; - USHORT uiParams; BOOL bCanRecover = FALSE; ULONG ulPrivateBase; LONG lOffset; @@ -523,8 +522,7 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) /* Object */ case HB_P_MESSAGE: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_vmMessage( pSymbols + uiParams ); + hb_vmMessage( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); w += 3; break; @@ -559,8 +557,7 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_PARAMETER: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_memvarNewParameter( pSymbols + uiParams, hb_stack.pBase + 1 + pCode[ w + 3 ] ); + hb_memvarNewParameter( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ), hb_stack.pBase + 1 + pCode[ w + 3 ] ); HB_TRACE(HB_TR_INFO, ("(hb_vmPopParameter)")); w += 4; break; @@ -571,14 +568,12 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_SFRAME: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_vmSFrame( pSymbols + uiParams ); + hb_vmSFrame( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); w += 3; break; case HB_P_STATICS: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_vmStatics( pSymbols + uiParams, pCode[ w + 3 ] + ( pCode[ w + 4 ] * 256 ) ); + hb_vmStatics( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ), pCode[ w + 3 ] + ( pCode[ w + 4 ] * 256 ) ); w += 5; break; @@ -933,8 +928,7 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_PUSHSYM: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_vmPushSymbol( pSymbols + uiParams ); + hb_vmPushSymbol( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); w += 3; break; @@ -944,22 +938,19 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_PUSHALIASEDFIELD: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_vmPushAliasedField( pSymbols + uiParams ); + hb_vmPushAliasedField( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); w += 3; break; case HB_P_PUSHALIASEDVAR: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_vmPushAliasedVar( pSymbols + uiParams ); + hb_vmPushAliasedVar( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); w += 3; break; case HB_P_PUSHFIELD: /* It pushes the current value of the given field onto the eval stack */ - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_rddGetFieldValue( hb_stack.pPos, pSymbols + uiParams ); + hb_rddGetFieldValue( hb_stack.pPos, pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); hb_stackPush(); HB_TRACE(HB_TR_INFO, ("(hb_vmPushField)")); w += 3; @@ -991,16 +982,14 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_PUSHMEMVAR: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_memvarGetValue( hb_stack.pPos, pSymbols + uiParams ); + hb_memvarGetValue( hb_stack.pPos, pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); hb_stackPush(); HB_TRACE(HB_TR_INFO, ("(hb_vmPushMemvar)")); w += 3; break; case HB_P_PUSHMEMVARREF: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_memvarGetRefer( hb_stack.pPos, pSymbols + uiParams ); + hb_memvarGetRefer( hb_stack.pPos, pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); hb_stackPush(); HB_TRACE(HB_TR_INFO, ("(hb_vmPushMemvarRef)")); w += 3; @@ -1036,14 +1025,12 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_POPALIASEDFIELD: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_vmPopAliasedField( pSymbols + uiParams ); + hb_vmPopAliasedField( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); w += 3; break; case HB_P_POPALIASEDVAR: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); - hb_vmPopAliasedVar( pSymbols + uiParams ); + hb_vmPopAliasedVar( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); w += 3; break; @@ -1051,9 +1038,8 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) /* Pops a value from the eval stack and uses it to set * a new value of the given field */ - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); hb_stackDec(); - hb_rddPutFieldValue( hb_stack.pPos, pSymbols + uiParams ); + hb_rddPutFieldValue( hb_stack.pPos, pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); hb_itemClear( hb_stack.pPos ); HB_TRACE(HB_TR_INFO, ("(hb_vmPopField)")); w += 3; @@ -1075,15 +1061,17 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_POPMEMVAR: - uiParams = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ); hb_stackDec(); - hb_memvarSetValue( pSymbols + uiParams, hb_stack.pPos ); + hb_memvarSetValue( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ), hb_stack.pPos ); hb_itemClear( hb_stack.pPos ); HB_TRACE(HB_TR_INFO, ("(hb_vmPopMemvar)")); w += 3; break; case HB_P_POPVARIABLE: + { + USHORT uiParams; + /* Pops a value from the eval stack and uses it to set * a new value of a variable of unknown type. */ @@ -1100,6 +1088,7 @@ void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ) HB_TRACE(HB_TR_INFO, ("(hb_vmPopVariable)")); w += 3; break; + } /* macro creation */