20000422-20:37 GMT+1 Victor Szakats <info@szelvesz.hu>

This commit is contained in:
Viktor Szakats
2000-04-22 18:34:36 +00:00
parent 12fcab20d5
commit 28a4c0837e
6 changed files with 172 additions and 165 deletions

View File

@@ -1,3 +1,17 @@
20000422-20:37 GMT+1 Victor Szakats <info@szelvesz.hu>
* 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 <info@szelvesz.hu>
* include/hbpcode.h

View File

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

View File

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

View File

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

View File

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

View File

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