ChangeLog 20000419-18:40 GMT+1

This commit is contained in:
Ryszard Glab
2000-04-19 16:29:42 +00:00
parent eafc621bfe
commit a14bd974c9
8 changed files with 219 additions and 329 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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