ChangeLog 20000419-18:40 GMT+1
This commit is contained in:
@@ -1,3 +1,25 @@
|
||||
20000419-18:40 GMT+1 Ryszard Glab <rglab@imid.med.pl>
|
||||
|
||||
*inlcude/hbcomp.h
|
||||
*source/compiler/genc.c
|
||||
*source/compiler/genhrb.c
|
||||
*source/compiler/genjava.c
|
||||
*source/compiler/genobj32.c
|
||||
*source/compiler/harbour.c
|
||||
*source/compiler/harbour.y
|
||||
* added code to handle new jump opcodes
|
||||
* fixed symbol table handling - there is no special handling
|
||||
needed for symbols' positions during output generation
|
||||
* the name of compiled file (the starting procedure) is not
|
||||
placed into the symbol table if '-n' switch is used
|
||||
* HB_P_ENDPROC is automatically generated after the function
|
||||
or procedure is parsed - there is no need to check it
|
||||
during output generation phase
|
||||
|
||||
NOTE:
|
||||
output generated by genobj32.c is not tested!
|
||||
output generated by genjava.c is not tested! (did it worked ?)
|
||||
|
||||
20000419-16:00 GMT+1 Antonio Linares <alinares@fivetech.com>
|
||||
* source/compiler/genobj32.c
|
||||
* Implemented code optimizations proposed by Victor.
|
||||
|
||||
@@ -183,7 +183,6 @@ extern PCOMSYMBOL hb_compSymbolAdd( char *, USHORT * );
|
||||
extern PCOMSYMBOL hb_compSymbolKill( PCOMSYMBOL ); /* releases all memory allocated by symbol and returns the next one */
|
||||
extern PCOMSYMBOL hb_compSymbolFind( char *, USHORT * ); /* returns a symbol pointer from the symbol table */
|
||||
extern PCOMSYMBOL hb_compSymbolGetPos( USHORT ); /* returns a symbol based on its index on the symbol table */
|
||||
extern USHORT hb_compSymbolFixPos( USHORT ); /* converts symbol's compile-time position into generation-time position */
|
||||
|
||||
extern void hb_compGenBreak( void ); /* generate code for BREAK statement */
|
||||
|
||||
|
||||
@@ -44,7 +44,6 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
USHORT iNestedCodeblock = 0;
|
||||
ULONG lPCodePos;
|
||||
char chr;
|
||||
BOOL bEndProcRequired;
|
||||
LONG lOffset;
|
||||
|
||||
FILE * yyc; /* file handle for C output */
|
||||
@@ -107,9 +106,6 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
hb_strupr( pFileName->szName );
|
||||
fprintf( yyc, "\n\nHB_INIT_SYMBOLS_BEGIN( hb_vm_SymbolInit_%s%s )\n", hb_comp_szPrefix, pFileName->szName );
|
||||
|
||||
if( ! hb_comp_bStartProc )
|
||||
pSym = pSym->pNext; /* starting procedure is always the first symbol */
|
||||
|
||||
while( pSym )
|
||||
{
|
||||
if( pSym->szName[ 0 ] == '(' )
|
||||
@@ -195,7 +191,6 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
fprintf( yyc, "\n{\n static BYTE pcode[] =\n {\n" );
|
||||
|
||||
bEndProcRequired = TRUE;
|
||||
lPCodePos = 0;
|
||||
while( lPCodePos < pFunc->lPCodePos )
|
||||
{
|
||||
@@ -273,7 +268,6 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
lPCodePos++;
|
||||
if( lPCodePos == pFunc->lPCodePos )
|
||||
{
|
||||
bEndProcRequired = FALSE;
|
||||
fprintf( yyc, "\tHB_P_ENDPROC\n" );
|
||||
}
|
||||
else
|
||||
@@ -563,13 +557,10 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_MESSAGE:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wSym = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wSym );
|
||||
fprintf( yyc, "\tHB_P_MESSAGE, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wSym ),
|
||||
HB_HIBYTE( wSym ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wSym )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -631,13 +622,10 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_PARAMETER:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_PARAMETER, %i, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ),
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ),
|
||||
pFunc->pCode[ lPCodePos + 3 ] );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
@@ -662,13 +650,10 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_POPALIASEDFIELD:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_POPALIASEDFIELD, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -677,13 +662,10 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_POPALIASEDVAR:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_POPALIASEDVAR, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -692,13 +674,10 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_POPFIELD:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_POPFIELD, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -746,13 +725,10 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_POPMEMVAR:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_POPMEMVAR, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -779,13 +755,10 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_POPVARIABLE:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_POPVARIABLE, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -804,14 +777,11 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_PUSHALIASEDFIELD:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] +
|
||||
pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_PUSHALIASEDFIELD, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -820,14 +790,11 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_PUSHALIASEDVAR:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] +
|
||||
pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_PUSHALIASEDVAR, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -898,14 +865,11 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_PUSHFIELD:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] +
|
||||
pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_PUSHFIELD, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -1014,14 +978,11 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_PUSHMEMVAR:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] +
|
||||
pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_PUSHMEMVAR, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -1030,14 +991,11 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_PUSHMEMVARREF:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] +
|
||||
pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_PUSHMEMVARREF, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -1125,14 +1083,11 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_PUSHSYM:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wSym = pFunc->pCode[ lPCodePos + 1 ] +
|
||||
pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wSym );
|
||||
fprintf( yyc, "\tHB_P_PUSHSYM, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wSym ),
|
||||
HB_HIBYTE( wSym ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wSym )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -1141,14 +1096,11 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
|
||||
case HB_P_PUSHVARIABLE:
|
||||
{
|
||||
USHORT wFixPos;
|
||||
|
||||
wVar = pFunc->pCode[ lPCodePos + 1 ] +
|
||||
pFunc->pCode[ lPCodePos + 2 ] * 256;
|
||||
wFixPos = hb_compSymbolFixPos( wVar );
|
||||
fprintf( yyc, "\tHB_P_PUSHVARIABLE, %i, %i,",
|
||||
HB_LOBYTE( wFixPos ),
|
||||
HB_HIBYTE( wFixPos ) );
|
||||
HB_LOBYTE( wVar ),
|
||||
HB_HIBYTE( wVar ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* %s */", hb_compSymbolGetPos( wVar )->szName );
|
||||
fprintf( yyc, "\n" );
|
||||
lPCodePos += 3;
|
||||
@@ -1194,7 +1146,6 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
if( pFunc->bFlags & FUN_USES_STATICS )
|
||||
{
|
||||
hb_compSymbolFind( hb_comp_pInitFunc->szName, &w );
|
||||
w = hb_compSymbolFixPos( w );
|
||||
fprintf( yyc, "\tHB_P_SFRAME, %i, %i,",
|
||||
HB_LOBYTE( w ), HB_HIBYTE( w ) );
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "\t/* symbol (_INITSTATICS) */" );
|
||||
@@ -1204,9 +1155,7 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
break;
|
||||
|
||||
case HB_P_STATICS:
|
||||
|
||||
hb_compSymbolFind( hb_comp_pInitFunc->szName, &w );
|
||||
w = hb_compSymbolFixPos( w );
|
||||
fprintf( yyc, "\tHB_P_STATICS, %i, %i, %i, %i,",
|
||||
HB_LOBYTE( w ),
|
||||
HB_HIBYTE( w ),
|
||||
@@ -1245,16 +1194,7 @@ void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language ou
|
||||
}
|
||||
}
|
||||
|
||||
if( bEndProcRequired )
|
||||
{
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "/* %05li */ ", lPCodePos );
|
||||
else fprintf( yyc, "\t" );
|
||||
fprintf( yyc, "HB_P_ENDPROC\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "/* %05li */\n", lPCodePos );
|
||||
}
|
||||
if( hb_comp_bGenCVerbose ) fprintf( yyc, "/* %05li */\n", lPCodePos );
|
||||
|
||||
fprintf( yyc, " };\n\n" );
|
||||
fprintf( yyc, " hb_vmExecute( pcode, symbols );\n}\n\n" );
|
||||
|
||||
@@ -44,11 +44,10 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
char szFileName[ _POSIX_PATH_MAX ];
|
||||
PFUNCTION pFunc /*= hb_comp_functions.pFirst */;
|
||||
PCOMSYMBOL pSym = hb_comp_symbols.pFirst;
|
||||
USHORT w, wLen, wVar;
|
||||
USHORT wLen, wVar;
|
||||
ULONG lPCodePos;
|
||||
LONG lPad;
|
||||
LONG lSymbols;
|
||||
BOOL bEndProcReq;
|
||||
ULONG ulCodeLength;
|
||||
FILE * yyc; /* file handle for C output */
|
||||
|
||||
@@ -71,9 +70,6 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
|
||||
/* writes the symbol table */
|
||||
|
||||
if( ! hb_comp_bStartProc )
|
||||
pSym = pSym->pNext; /* starting procedure is always the first symbol */
|
||||
|
||||
lSymbols = 0; /* Count number of symbols */
|
||||
while( pSym )
|
||||
{
|
||||
@@ -86,9 +82,6 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
fputc( ( BYTE ) ( ( lSymbols >> 24 ) & 255 ), yyc );
|
||||
|
||||
pSym = hb_comp_symbols.pFirst;
|
||||
if( ! hb_comp_bStartProc )
|
||||
pSym = pSym->pNext; /* starting procedure is always the first symbol */
|
||||
|
||||
while( pSym )
|
||||
{
|
||||
fputs( pSym->szName, yyc );
|
||||
@@ -143,11 +136,7 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
{
|
||||
fputs( pFunc->szName, yyc );
|
||||
fputc( 0, yyc );
|
||||
/* We will have to add HB_P_ENDPROC in cases when RETURN statement
|
||||
* was not used in a function/procedure - this is why we have to reserve
|
||||
* one additional byte
|
||||
*/
|
||||
ulCodeLength = pFunc->lPCodePos + 1;
|
||||
ulCodeLength = pFunc->lPCodePos;
|
||||
fputc( ( BYTE ) ( ( ulCodeLength ) & 255 ), yyc ); /* Write size */
|
||||
fputc( ( BYTE ) ( ( ulCodeLength >> 8 ) & 255 ), yyc );
|
||||
fputc( ( BYTE ) ( ( ulCodeLength >> 16 ) & 255 ), yyc );
|
||||
@@ -157,7 +146,6 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
|
||||
lPCodePos = 0;
|
||||
lPad = 0; /* Number of bytes optimized */
|
||||
bEndProcReq = TRUE;
|
||||
while( lPCodePos < pFunc->lPCodePos )
|
||||
{
|
||||
switch( pFunc->pCode[ lPCodePos ] )
|
||||
@@ -170,6 +158,7 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
case HB_P_DUPLICATE:
|
||||
case HB_P_DUPLTWO:
|
||||
case HB_P_ENDBLOCK:
|
||||
case HB_P_ENDPROC:
|
||||
case HB_P_EQUAL:
|
||||
case HB_P_EXACTLYEQUAL:
|
||||
case HB_P_FALSE:
|
||||
@@ -209,6 +198,13 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
break;
|
||||
|
||||
case HB_P_JUMPSHORT:
|
||||
case HB_P_JUMPSHORTFALSE:
|
||||
case HB_P_JUMPSHORTTRUE:
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
break;
|
||||
|
||||
case HB_P_ARRAYDIM:
|
||||
case HB_P_DO:
|
||||
case HB_P_FUNCTION:
|
||||
@@ -224,8 +220,19 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
case HB_P_PUSHLOCALREF:
|
||||
case HB_P_PUSHSTATIC:
|
||||
case HB_P_PUSHSTATICREF:
|
||||
case HB_P_SEQBEGIN:
|
||||
case HB_P_SEQEND:
|
||||
case HB_P_PUSHSYM:
|
||||
case HB_P_MESSAGE:
|
||||
case HB_P_POPMEMVAR:
|
||||
case HB_P_PUSHMEMVAR:
|
||||
case HB_P_PUSHMEMVARREF:
|
||||
case HB_P_POPVARIABLE:
|
||||
case HB_P_PUSHVARIABLE:
|
||||
case HB_P_POPFIELD:
|
||||
case HB_P_PUSHFIELD:
|
||||
case HB_P_POPALIASEDFIELD:
|
||||
case HB_P_PUSHALIASEDFIELD:
|
||||
case HB_P_POPALIASEDVAR:
|
||||
case HB_P_PUSHALIASEDVAR:
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
@@ -234,18 +241,15 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
case HB_P_JUMPFAR:
|
||||
case HB_P_JUMPFARFALSE:
|
||||
case HB_P_JUMPFARTRUE:
|
||||
case HB_P_PARAMETER:
|
||||
case HB_P_SEQBEGIN:
|
||||
case HB_P_SEQEND:
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
break;
|
||||
|
||||
case HB_P_ENDPROC:
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
if( lPCodePos == pFunc->lPCodePos )
|
||||
bEndProcReq = FALSE;
|
||||
break;
|
||||
|
||||
case HB_P_FRAME:
|
||||
/* update the number of local variables */
|
||||
{
|
||||
@@ -273,35 +277,6 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
}
|
||||
break;
|
||||
|
||||
case HB_P_PUSHSYM:
|
||||
case HB_P_MESSAGE:
|
||||
case HB_P_POPMEMVAR:
|
||||
case HB_P_PUSHMEMVAR:
|
||||
case HB_P_PUSHMEMVARREF:
|
||||
case HB_P_POPVARIABLE:
|
||||
case HB_P_PUSHVARIABLE:
|
||||
case HB_P_POPFIELD:
|
||||
case HB_P_PUSHFIELD:
|
||||
case HB_P_POPALIASEDFIELD:
|
||||
case HB_P_PUSHALIASEDFIELD:
|
||||
case HB_P_POPALIASEDVAR:
|
||||
case HB_P_PUSHALIASEDVAR:
|
||||
fputc( pFunc->pCode[ lPCodePos ], yyc );
|
||||
wVar = hb_compSymbolFixPos( pFunc->pCode[ lPCodePos + 1 ] + 256 * pFunc->pCode[ lPCodePos + 2 ] );
|
||||
fputc( HB_LOBYTE( wVar ), yyc );
|
||||
fputc( HB_HIBYTE( wVar ), yyc );
|
||||
lPCodePos += 3;
|
||||
break;
|
||||
|
||||
case HB_P_PARAMETER:
|
||||
fputc( pFunc->pCode[ lPCodePos ], yyc );
|
||||
wVar = hb_compSymbolFixPos( pFunc->pCode[ lPCodePos + 1 ] + 256 * pFunc->pCode[ lPCodePos + 2 ] );
|
||||
fputc( HB_LOBYTE( wVar ), yyc );
|
||||
fputc( HB_HIBYTE( wVar ), yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos + 3 ], yyc );
|
||||
lPCodePos +=4;
|
||||
break;
|
||||
|
||||
case HB_P_PUSHBLOCK:
|
||||
wVar = * ( ( USHORT * ) &( pFunc->pCode [ lPCodePos + 5 ] ) );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
@@ -353,25 +328,23 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
/* we only generate it if there are statics used in this function */
|
||||
if( pFunc->bFlags & FUN_USES_STATICS )
|
||||
{
|
||||
hb_compSymbolFind( hb_comp_pInitFunc->szName, &w );
|
||||
w = hb_compSymbolFixPos( w );
|
||||
fputc( pFunc->pCode[ lPCodePos ], yyc );
|
||||
fputc( HB_LOBYTE( w ), yyc );
|
||||
fputc( HB_HIBYTE( w ), yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
}
|
||||
else
|
||||
{
|
||||
lPad += 3;
|
||||
lPCodePos += 3;
|
||||
lPCodePos += 3;
|
||||
}
|
||||
break;
|
||||
|
||||
case HB_P_STATICS:
|
||||
hb_compSymbolFind( hb_comp_pInitFunc->szName, &w );
|
||||
w = hb_compSymbolFixPos( w );
|
||||
fputc( pFunc->pCode[ lPCodePos ], yyc );
|
||||
fputc( HB_LOBYTE( w ), yyc );
|
||||
fputc( HB_HIBYTE( w ), yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos + 3 ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos + 4 ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
lPCodePos += 5;
|
||||
break;
|
||||
|
||||
@@ -382,16 +355,7 @@ void hb_compGenPortObj( PHB_FNAME pFileName )
|
||||
}
|
||||
}
|
||||
|
||||
if( bEndProcReq )
|
||||
fputc( HB_P_ENDPROC, yyc );
|
||||
else
|
||||
{
|
||||
/* HB_P_ENDPROC was the last opcode: we have to fill the byte
|
||||
* reserved earlier
|
||||
*/
|
||||
lPad++;
|
||||
}
|
||||
for( ; lPad; lPad-- )
|
||||
while( lPad-- )
|
||||
{
|
||||
/* write additional bytes to agree with stored earlier
|
||||
* function/procedure size
|
||||
|
||||
@@ -50,11 +50,10 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
char szFileName[ _POSIX_PATH_MAX ];
|
||||
PFUNCTION pFunc /*= hb_comp_functions.pFirst */;
|
||||
PCOMSYMBOL pSym = hb_comp_symbols.pFirst;
|
||||
USHORT w, wLen, wVar;
|
||||
USHORT wLen, wVar;
|
||||
ULONG lPCodePos;
|
||||
LONG lPad;
|
||||
LONG lSymbols;
|
||||
BOOL bEndProcReq;
|
||||
ULONG ulCodeLength;
|
||||
FILE * yyc; /* file handle for C output */
|
||||
|
||||
@@ -89,9 +88,6 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
|
||||
/* writes the symbol table */
|
||||
|
||||
if( ! hb_comp_bStartProc )
|
||||
pSym = pSym->pNext; /* starting procedure is always the first symbol */
|
||||
|
||||
lSymbols = 0; /* Count number of symbols */
|
||||
while( pSym )
|
||||
{
|
||||
@@ -104,9 +100,6 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
hb_fputc( ( BYTE ) ( ( lSymbols >> 24 ) & 255 ), yyc );
|
||||
|
||||
pSym = hb_comp_symbols.pFirst;
|
||||
if( ! hb_comp_bStartProc )
|
||||
pSym = pSym->pNext; /* starting procedure is always the first symbol */
|
||||
|
||||
while( pSym )
|
||||
{
|
||||
hb_fputs( pSym->szName, yyc );
|
||||
@@ -161,11 +154,7 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
{
|
||||
hb_fputs( pFunc->szName, yyc );
|
||||
hb_fputc( 0, yyc );
|
||||
/* We will have to add HB_P_ENDPROC in cases when RETURN statement
|
||||
* was not used in a function/procedure - this is why we have to reserve
|
||||
* one additional byte
|
||||
*/
|
||||
ulCodeLength = pFunc->lPCodePos + 1;
|
||||
ulCodeLength = pFunc->lPCodePos;
|
||||
hb_fputc( ( BYTE ) ( ( ulCodeLength ) & 255 ), yyc ); /* Write size */
|
||||
hb_fputc( ( BYTE ) ( ( ulCodeLength >> 8 ) & 255 ), yyc );
|
||||
hb_fputc( ( BYTE ) ( ( ulCodeLength >> 16 ) & 255 ), yyc );
|
||||
@@ -175,7 +164,6 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
|
||||
lPCodePos = 0;
|
||||
lPad = 0; /* Number of bytes optimized */
|
||||
bEndProcReq = TRUE;
|
||||
while( lPCodePos < pFunc->lPCodePos )
|
||||
{
|
||||
switch( pFunc->pCode[ lPCodePos ] )
|
||||
@@ -188,7 +176,8 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
case HB_P_DUPLICATE:
|
||||
case HB_P_DUPLTWO:
|
||||
case HB_P_ENDBLOCK:
|
||||
case HB_P_EQUAL:
|
||||
case HB_P_ENDPROC:
|
||||
case HB_P_EQUAL:
|
||||
case HB_P_EXACTLYEQUAL:
|
||||
case HB_P_FALSE:
|
||||
case HB_P_FORTEST:
|
||||
@@ -227,6 +216,13 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
break;
|
||||
|
||||
case HB_P_JUMPSHORT:
|
||||
case HB_P_JUMPSHORTFALSE:
|
||||
case HB_P_JUMPSHORTTRUE:
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
break;
|
||||
|
||||
case HB_P_ARRAYDIM:
|
||||
case HB_P_DO:
|
||||
case HB_P_FUNCTION:
|
||||
@@ -242,8 +238,19 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
case HB_P_PUSHLOCALREF:
|
||||
case HB_P_PUSHSTATIC:
|
||||
case HB_P_PUSHSTATICREF:
|
||||
case HB_P_SEQBEGIN:
|
||||
case HB_P_SEQEND:
|
||||
case HB_P_PUSHSYM:
|
||||
case HB_P_MESSAGE:
|
||||
case HB_P_POPMEMVAR:
|
||||
case HB_P_PUSHMEMVAR:
|
||||
case HB_P_PUSHMEMVARREF:
|
||||
case HB_P_POPVARIABLE:
|
||||
case HB_P_PUSHVARIABLE:
|
||||
case HB_P_POPFIELD:
|
||||
case HB_P_PUSHFIELD:
|
||||
case HB_P_POPALIASEDFIELD:
|
||||
case HB_P_PUSHALIASEDFIELD:
|
||||
case HB_P_POPALIASEDVAR:
|
||||
case HB_P_PUSHALIASEDVAR:
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
@@ -252,18 +259,15 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
case HB_P_JUMPFAR:
|
||||
case HB_P_JUMPFARFALSE:
|
||||
case HB_P_JUMPFARTRUE:
|
||||
case HB_P_PARAMETER:
|
||||
case HB_P_SEQBEGIN:
|
||||
case HB_P_SEQEND:
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
break;
|
||||
|
||||
case HB_P_ENDPROC:
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
if( lPCodePos == pFunc->lPCodePos )
|
||||
bEndProcReq = FALSE;
|
||||
break;
|
||||
|
||||
case HB_P_FRAME:
|
||||
/* update the number of local variables */
|
||||
{
|
||||
@@ -291,35 +295,6 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
}
|
||||
break;
|
||||
|
||||
case HB_P_PUSHSYM:
|
||||
case HB_P_MESSAGE:
|
||||
case HB_P_POPMEMVAR:
|
||||
case HB_P_PUSHMEMVAR:
|
||||
case HB_P_PUSHMEMVARREF:
|
||||
case HB_P_POPVARIABLE:
|
||||
case HB_P_PUSHVARIABLE:
|
||||
case HB_P_POPFIELD:
|
||||
case HB_P_PUSHFIELD:
|
||||
case HB_P_POPALIASEDFIELD:
|
||||
case HB_P_PUSHALIASEDFIELD:
|
||||
case HB_P_POPALIASEDVAR:
|
||||
case HB_P_PUSHALIASEDVAR:
|
||||
hb_fputc( pFunc->pCode[ lPCodePos ], yyc );
|
||||
wVar = hb_compSymbolFixPos( pFunc->pCode[ lPCodePos + 1 ] + 256 * pFunc->pCode[ lPCodePos + 2 ] );
|
||||
hb_fputc( HB_LOBYTE( wVar ), yyc );
|
||||
hb_fputc( HB_HIBYTE( wVar ), yyc );
|
||||
lPCodePos += 3;
|
||||
break;
|
||||
|
||||
case HB_P_PARAMETER:
|
||||
hb_fputc( pFunc->pCode[ lPCodePos ], yyc );
|
||||
wVar = hb_compSymbolFixPos( pFunc->pCode[ lPCodePos + 1 ] + 256 * pFunc->pCode[ lPCodePos + 2 ] );
|
||||
hb_fputc( HB_LOBYTE( wVar ), yyc );
|
||||
hb_fputc( HB_HIBYTE( wVar ), yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos + 3 ], yyc );
|
||||
lPCodePos +=4;
|
||||
break;
|
||||
|
||||
case HB_P_PUSHBLOCK:
|
||||
wVar = * ( ( USHORT * ) &( pFunc->pCode [ lPCodePos + 5 ] ) );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
@@ -371,26 +346,23 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
/* we only generate it if there are statics used in this function */
|
||||
if( pFunc->bFlags & FUN_USES_STATICS )
|
||||
{
|
||||
hb_compSymbolFind( hb_comp_pInitFunc->szName, &w );
|
||||
w = hb_compSymbolFixPos( w );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos ], yyc );
|
||||
hb_fputc( HB_LOBYTE( w ), yyc );
|
||||
hb_fputc( HB_HIBYTE( w ), yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
}
|
||||
else
|
||||
{
|
||||
lPad += 3;
|
||||
lPCodePos += 3;
|
||||
lPCodePos += 3;
|
||||
}
|
||||
break;
|
||||
|
||||
case HB_P_STATICS:
|
||||
hb_compSymbolFind( hb_comp_pInitFunc->szName, &w );
|
||||
w = hb_compSymbolFixPos( w );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos ], yyc );
|
||||
hb_fputc( HB_LOBYTE( w ), yyc );
|
||||
hb_fputc( HB_HIBYTE( w ), yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos + 3 ], yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos + 4 ], yyc );
|
||||
lPCodePos += 5;
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
hb_fputc( pFunc->pCode[ lPCodePos++ ], yyc );
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -400,15 +372,6 @@ void hb_compGenJava( PHB_FNAME pFileName )
|
||||
}
|
||||
}
|
||||
|
||||
if( bEndProcReq )
|
||||
hb_fputc( HB_P_ENDPROC, yyc );
|
||||
else
|
||||
{
|
||||
/* HB_P_ENDPROC was the last opcode: we have to fill the byte
|
||||
* reserved earlier
|
||||
*/
|
||||
lPad++;
|
||||
}
|
||||
for( ; lPad; lPad-- )
|
||||
{
|
||||
/* write additional bytes to agree with stored earlier
|
||||
|
||||
@@ -119,16 +119,12 @@ void hb_compGenObj32( PHB_FNAME pFileName )
|
||||
|
||||
static ULONG GetSymbolsSize( void )
|
||||
{
|
||||
return ( hb_comp_symbols.iCount - ( hb_comp_bStartProc ? 0: 1 ) ) * sizeof( HB_SYMB );
|
||||
return hb_comp_symbols.iCount * sizeof( HB_SYMB );
|
||||
}
|
||||
|
||||
static PCOMSYMBOL GetFirstSymbol( void )
|
||||
{
|
||||
PCOMSYMBOL pSymbol = hb_comp_symbols.pFirst;
|
||||
|
||||
if( ! hb_comp_bStartProc )
|
||||
pSymbol = pSymbol->pNext;
|
||||
|
||||
return pSymbol;
|
||||
}
|
||||
|
||||
@@ -477,7 +473,7 @@ static void CodeSegment( FILE * hObjFile, BYTE * prgCode, ULONG ulPrgLen, USHORT
|
||||
USHORT wTotalLen = ( ulPrgLen * wFunctions ) + 4;
|
||||
ULONG ul;
|
||||
PFUNCTION pFunction = hb_comp_functions.pFirst;
|
||||
ULONG ulPCodeOffset = ( hb_comp_symbols.iCount - ( hb_comp_bStartProc ? 0: 1 ) ) * sizeof( HB_SYMB );
|
||||
ULONG ulPCodeOffset = hb_comp_symbols.iCount * sizeof( HB_SYMB );
|
||||
|
||||
if( ! hb_comp_bStartProc )
|
||||
pFunction = pFunction->pNext;
|
||||
@@ -552,12 +548,21 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
|
||||
while( pFunction )
|
||||
{
|
||||
BOOL bEndProcRequired = TRUE;
|
||||
|
||||
for( w = 0; w < pFunction->lPCodePos; w++ )
|
||||
w = 0;
|
||||
while( w < pFunction->lPCodePos )
|
||||
{
|
||||
switch( pFunction->pCode[ w ] )
|
||||
{
|
||||
case HB_P_JUMPFAR:
|
||||
case HB_P_JUMPFARFALSE:
|
||||
case HB_P_JUMPFARTRUE:
|
||||
{
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 1 ], hObjFile, &bChk );
|
||||
w += 2;
|
||||
}
|
||||
break;
|
||||
|
||||
case HB_P_ARRAYDIM:
|
||||
case HB_P_ARRAYGEN:
|
||||
case HB_P_DO:
|
||||
@@ -577,7 +582,7 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 1 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 2 ], hObjFile, &bChk );
|
||||
w += 2;
|
||||
w += 3;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -591,7 +596,7 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
putbyte( pFunction->pCode[ w + 1 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 2 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 3 ], hObjFile, &bChk );
|
||||
w += 3;
|
||||
w += 4;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -602,7 +607,7 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
putbyte( pFunction->pCode[ w + 2 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 3 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 4 ], hObjFile, &bChk );
|
||||
w += 4;
|
||||
w += 5;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -616,7 +621,7 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
putbyte( bLocals - pFunction->wParamCount, hObjFile, &bChk );
|
||||
putbyte( pFunction->wParamCount, hObjFile, &bChk );
|
||||
}
|
||||
w += 2;
|
||||
w += 3;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -624,21 +629,11 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
{
|
||||
if( pFunction->bFlags & FUN_USES_STATICS )
|
||||
{
|
||||
USHORT wPos;
|
||||
hb_compSymbolFind( hb_comp_pInitFunc->szName, &wPos );
|
||||
wPos = hb_compSymbolFixPos( wPos );
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putword( wPos, hObjFile, &bChk );
|
||||
}
|
||||
w += 2;
|
||||
}
|
||||
break;
|
||||
|
||||
case HB_P_ENDPROC:
|
||||
{
|
||||
if( w + 1 == pFunction->lPCodePos )
|
||||
bEndProcRequired = FALSE;
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
w += 3;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -656,25 +651,21 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
case HB_P_PUSHMEMVARREF:
|
||||
case HB_P_PUSHSYM:
|
||||
{
|
||||
USHORT wPos = pFunction->pCode[ w + 1 ] +
|
||||
pFunction->pCode[ w + 2 ] * 256;
|
||||
wPos = hb_compSymbolFixPos( wPos );
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putword( wPos, hObjFile, &bChk );
|
||||
w += 2;
|
||||
putbyte( pFunction->pCode[ w + 1 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 2 ], hObjFile, &bChk );
|
||||
w += 3;
|
||||
}
|
||||
break;
|
||||
|
||||
case HB_P_STATICS:
|
||||
{
|
||||
USHORT wPos = pFunction->pCode[ w + 1 ] +
|
||||
pFunction->pCode[ w + 2 ] * 256;
|
||||
wPos = hb_compSymbolFixPos( wPos );
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putword( wPos, hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 1 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 2 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 3 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 4 ], hObjFile, &bChk );
|
||||
w += 4;
|
||||
w += 5;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -682,16 +673,16 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
{
|
||||
USHORT uLen = pFunction->pCode[ w + 1 ] +
|
||||
pFunction->pCode[ w + 2 ] * 256;
|
||||
putbyte( HB_P_PUSHSTR, hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putword( uLen, hObjFile, &bChk );
|
||||
w += 2;
|
||||
w += 3;
|
||||
|
||||
if( uLen > 0 )
|
||||
{
|
||||
USHORT u = 0;
|
||||
|
||||
while( u++ < uLen )
|
||||
putbyte( pFunction->pCode[ ++w ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w++ ], hObjFile, &bChk );
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -701,37 +692,31 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 1 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 2 ], hObjFile, &bChk );
|
||||
w += 2;
|
||||
w += 3;
|
||||
|
||||
while( pFunction->pCode[ w + 1 ] )
|
||||
putbyte( pFunction->pCode[ ++w ], hObjFile, &bChk );
|
||||
|
||||
w++;
|
||||
putbyte( 0, hObjFile, &bChk );
|
||||
do {
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
} while( pFunction->pCode[ w++ ] )
|
||||
}
|
||||
break;
|
||||
|
||||
case HB_P_MODULENAME:
|
||||
{
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w++ ], hObjFile, &bChk );
|
||||
|
||||
while( pFunction->pCode[ w + 1 ] )
|
||||
putbyte( pFunction->pCode[ ++w ], hObjFile, &bChk );
|
||||
|
||||
w++;
|
||||
putbyte( 0, hObjFile, &bChk );
|
||||
do {
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
} while( pFunction->pCode[ w++ ] )
|
||||
}
|
||||
break;
|
||||
|
||||
case HB_P_PARAMETER:
|
||||
{
|
||||
USHORT wPos = pFunction->pCode[ w + 1 ] +
|
||||
pFunction->pCode[ w + 2 ] * 256;
|
||||
wPos = hb_compSymbolFixPos( wPos );
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putword( wPos, hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 1 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 2 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 3 ], hObjFile, &bChk );
|
||||
w += 3;
|
||||
w += 4;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -745,11 +730,11 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
putbyte( pFunction->pCode[ w + 3 ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w + 4 ], hObjFile, &bChk );
|
||||
putword( uVars, hObjFile, &bChk );
|
||||
w += 6;
|
||||
w += 7;
|
||||
while( uVars-- )
|
||||
{
|
||||
putbyte( pFunction->pCode[ ++w ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ ++w ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w++ ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w++ ], hObjFile, &bChk );
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -760,15 +745,14 @@ static void DataSegment( FILE * hObjFile, BYTE * symbol, ULONG wSymLen, ULONG wS
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
while( i++ < sizeof( double ) + sizeof( BYTE ) )
|
||||
putbyte( pFunction->pCode[ ++w ], hObjFile, &bChk );
|
||||
++w;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
putbyte( pFunction->pCode[ w ], hObjFile, &bChk );
|
||||
putbyte( pFunction->pCode[ w++ ], hObjFile, &bChk );
|
||||
}
|
||||
}
|
||||
if( bEndProcRequired )
|
||||
putbyte( HB_P_ENDPROC, hObjFile, &bChk );
|
||||
|
||||
pFunction = pFunction->pNext;
|
||||
}
|
||||
|
||||
@@ -626,29 +626,39 @@ BOOL hb_compVariableMacroCheck( char * szVarName )
|
||||
|
||||
PCOMSYMBOL hb_compSymbolAdd( char * szSymbolName, USHORT * pwPos )
|
||||
{
|
||||
PCOMSYMBOL pSym = ( PCOMSYMBOL ) hb_xgrab( sizeof( COMSYMBOL ) );
|
||||
|
||||
pSym->szName = szSymbolName;
|
||||
pSym->cScope = 0;
|
||||
pSym->cType = hb_comp_cVarType;
|
||||
pSym->pNext = NULL;
|
||||
|
||||
if( ! hb_comp_symbols.iCount )
|
||||
PCOMSYMBOL pSym;
|
||||
|
||||
if( szSymbolName[ 0 ] )
|
||||
{
|
||||
hb_comp_symbols.pFirst = pSym;
|
||||
hb_comp_symbols.pLast = pSym;
|
||||
/* Create a symbol for non-empty names only.
|
||||
* NOTE: an empty name is passed for a fake starting function when
|
||||
* '-n' switch is used
|
||||
*/
|
||||
pSym = ( PCOMSYMBOL ) hb_xgrab( sizeof( COMSYMBOL ) );
|
||||
|
||||
pSym->szName = szSymbolName;
|
||||
pSym->cScope = 0;
|
||||
pSym->cType = hb_comp_cVarType;
|
||||
pSym->pNext = NULL;
|
||||
|
||||
if( ! hb_comp_symbols.iCount )
|
||||
{
|
||||
hb_comp_symbols.pFirst = pSym;
|
||||
hb_comp_symbols.pLast = pSym;
|
||||
}
|
||||
else
|
||||
{
|
||||
( ( PCOMSYMBOL ) hb_comp_symbols.pLast )->pNext = pSym;
|
||||
hb_comp_symbols.pLast = pSym;
|
||||
}
|
||||
hb_comp_symbols.iCount++;
|
||||
|
||||
if( pwPos )
|
||||
*pwPos = hb_comp_symbols.iCount -1; /* position number starts form 0 */
|
||||
}
|
||||
else
|
||||
{
|
||||
( ( PCOMSYMBOL ) hb_comp_symbols.pLast )->pNext = pSym;
|
||||
hb_comp_symbols.pLast = pSym;
|
||||
}
|
||||
hb_comp_symbols.iCount++;
|
||||
pSym = NULL;
|
||||
|
||||
if( pwPos )
|
||||
*pwPos = hb_comp_symbols.iCount;
|
||||
|
||||
/*if( hb_comp_cVarType != ' ') printf("\nDeclared %s as type %c at symbol %i\n", szSymbolName, hb_comp_cVarType, hb_comp_symbols.iCount );*/
|
||||
return pSym;
|
||||
}
|
||||
|
||||
@@ -722,7 +732,7 @@ void hb_compFunctionAdd( char * szFunName, HB_SYMBOLSCOPE cScope, int iType )
|
||||
/* there is not a symbol on the symbol table for this function name */
|
||||
pSym = hb_compSymbolAdd( szFunName, NULL );
|
||||
|
||||
if( cScope != HB_FS_PUBLIC )
|
||||
if( pSym && cScope != HB_FS_PUBLIC )
|
||||
pSym->cScope |= cScope; /* we may have a non public function and a object message */
|
||||
|
||||
pFunc = hb_compFunctionNew( szFunName, cScope );
|
||||
@@ -763,6 +773,7 @@ void hb_compAnnounce( char * szFunName )
|
||||
|
||||
pFunc = hb_compFunctionFind( szFunName );
|
||||
if( pFunc )
|
||||
|
||||
{
|
||||
/* there is a function/procedure defined already - ANNOUNCEd procedure
|
||||
* have to be a public symbol - check if existing symbol is public
|
||||
@@ -1185,19 +1196,14 @@ static int hb_compMemvarGetPos( char * szVarName, PFUNCTION pFunc )
|
||||
return iVar;
|
||||
}
|
||||
|
||||
USHORT hb_compSymbolFixPos( USHORT wCompilePos )
|
||||
{
|
||||
return ( hb_comp_bStartProc ? wCompilePos - 1 : wCompilePos - 2 );
|
||||
}
|
||||
|
||||
|
||||
/* returns a symbol pointer from the symbol table
|
||||
* and sets its position in the symbol table
|
||||
* and sets its position in the symbol table.
|
||||
* NOTE: symbol's position number starts from 0
|
||||
*/
|
||||
PCOMSYMBOL hb_compSymbolFind( char * szSymbolName, USHORT * pwPos )
|
||||
{
|
||||
PCOMSYMBOL pSym = hb_comp_symbols.pFirst;
|
||||
USHORT wCnt = 1;
|
||||
USHORT wCnt = 0;
|
||||
|
||||
if( pwPos )
|
||||
*pwPos = 0;
|
||||
@@ -1223,10 +1229,13 @@ PCOMSYMBOL hb_compSymbolFind( char * szSymbolName, USHORT * pwPos )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PCOMSYMBOL hb_compSymbolGetPos( USHORT wSymbol ) /* returns a symbol based on its index on the symbol table */
|
||||
/* returns a symbol based on its index on the symbol table
|
||||
* index starts from 0
|
||||
*/
|
||||
PCOMSYMBOL hb_compSymbolGetPos( USHORT wSymbol )
|
||||
{
|
||||
PCOMSYMBOL pSym = hb_comp_symbols.pFirst;
|
||||
USHORT w = 1;
|
||||
USHORT w = 0;
|
||||
|
||||
while( w++ < wSymbol && pSym->pNext )
|
||||
pSym = pSym->pNext;
|
||||
@@ -2284,6 +2293,14 @@ static void hb_compCheckDuplVars( PVAR pVar, char * szVarName, int iVarScope )
|
||||
|
||||
void hb_compFixReturns( void ) /* fixes all last defined function returns jumps offsets */
|
||||
{
|
||||
if( hb_comp_functions.pLast && (hb_comp_functions.pLast->bFlags & FUN_WITH_RETURN) == 0 )
|
||||
{
|
||||
/* The last statement in a function/procedure was not a RETURN
|
||||
* Generate end-of-procedure pcode
|
||||
*/
|
||||
hb_compGenPCode1( HB_P_ENDPROC );
|
||||
}
|
||||
|
||||
if ( hb_comp_iJumpOptimize )
|
||||
if ( hb_comp_functions.pLast && hb_comp_functions.pLast->iNOOPs )
|
||||
hb_compOptimizeJumps();
|
||||
|
||||
@@ -1457,6 +1457,7 @@ int hb_compYACCMain( char * szName )
|
||||
pSym->cScope |= hb_comp_pInitFunc->cScope;
|
||||
hb_comp_functions.pLast->pNext = hb_comp_pInitFunc;
|
||||
hb_comp_functions.pLast = hb_comp_pInitFunc;
|
||||
hb_compGenPCode1( HB_P_ENDPROC );
|
||||
++hb_comp_functions.iCount;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user