From a14bd974c9c3d12cee31bedf27c6566c1df2cdb1 Mon Sep 17 00:00:00 2001 From: Ryszard Glab Date: Wed, 19 Apr 2000 16:29:42 +0000 Subject: [PATCH] ChangeLog 20000419-18:40 GMT+1 --- harbour/ChangeLog | 22 ++++++ harbour/include/hbcomp.h | 1 - harbour/source/compiler/genc.c | 118 +++++++---------------------- harbour/source/compiler/genhrb.c | 112 ++++++++++----------------- harbour/source/compiler/genjava.c | 113 ++++++++++----------------- harbour/source/compiler/genobj32.c | 104 +++++++++++-------------- harbour/source/compiler/harbour.c | 77 +++++++++++-------- harbour/source/compiler/harbour.y | 1 + 8 files changed, 219 insertions(+), 329 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index e959490002..059f7f382e 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,25 @@ +20000419-18:40 GMT+1 Ryszard Glab + + *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 * source/compiler/genobj32.c * Implemented code optimizations proposed by Victor. diff --git a/harbour/include/hbcomp.h b/harbour/include/hbcomp.h index 1c1436e12a..f898f49929 100644 --- a/harbour/include/hbcomp.h +++ b/harbour/include/hbcomp.h @@ -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 */ diff --git a/harbour/source/compiler/genc.c b/harbour/source/compiler/genc.c index f50fce3616..85d9a4c951 100644 --- a/harbour/source/compiler/genc.c +++ b/harbour/source/compiler/genc.c @@ -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" ); diff --git a/harbour/source/compiler/genhrb.c b/harbour/source/compiler/genhrb.c index aa0d9005a0..570cf416e4 100644 --- a/harbour/source/compiler/genhrb.c +++ b/harbour/source/compiler/genhrb.c @@ -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 diff --git a/harbour/source/compiler/genjava.c b/harbour/source/compiler/genjava.c index 079873346f..6ff83063f1 100644 --- a/harbour/source/compiler/genjava.c +++ b/harbour/source/compiler/genjava.c @@ -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 diff --git a/harbour/source/compiler/genobj32.c b/harbour/source/compiler/genobj32.c index ee5553ead7..e78e3fd688 100644 --- a/harbour/source/compiler/genobj32.c +++ b/harbour/source/compiler/genobj32.c @@ -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; } diff --git a/harbour/source/compiler/harbour.c b/harbour/source/compiler/harbour.c index 70bdd0b4f9..0776eb20f4 100644 --- a/harbour/source/compiler/harbour.c +++ b/harbour/source/compiler/harbour.c @@ -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(); diff --git a/harbour/source/compiler/harbour.y b/harbour/source/compiler/harbour.y index a82a5ed549..dd277db31c 100644 --- a/harbour/source/compiler/harbour.y +++ b/harbour/source/compiler/harbour.y @@ -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; }