Some quick & dirty implementations :-)

This commit is contained in:
Antonio Linares
2003-06-23 15:55:54 +00:00
parent 817fc8a9ae
commit dcf3a5e60f

View File

@@ -45,6 +45,9 @@ typedef struct HB_stru_genc_info
typedef HB_GENC_FUNC( HB_GENC_FUNC_ );
typedef HB_GENC_FUNC_ * HB_GENC_FUNC_PTR;
static char * szSymbol = NULL;
static BOOL bFirstSymbolParam = FALSE;
void hb_compGenILCode( PHB_FNAME pFileName ) /* generates the IL output */
{
char szFileName[ _POSIX_PATH_MAX ];
@@ -52,7 +55,7 @@ void hb_compGenILCode( PHB_FNAME pFileName ) /* generates the IL output */
PCOMSYMBOL pSym = hb_comp_symbols.pFirst;
PCOMDECLARED pDeclared;
PCOMCLASS pClass;
FILE * yyc; /* file handle for C output */
FILE * yyc; /* file handle for IL output */
PINLINE pInline = hb_comp_inlines.pFirst;
BOOL bIsPublicFunction ;
@@ -92,8 +95,8 @@ void hb_compGenILCode( PHB_FNAME pFileName ) /* generates the IL output */
// fprintf( yyc, "#include \"hbpcode.h\"\n" );
// fprintf( yyc, "#include \"hbinit.h\"\n\n\n" );
if( ! hb_comp_bStartProc )
pFunc = pFunc->pNext; /* No implicit starting procedure */
// if( ! hb_comp_bStartProc )
// pFunc = pFunc->pNext; /* No implicit starting procedure */
// /* write functions prototypes for PRG defined functions */
// while( pFunc )
@@ -223,6 +226,12 @@ void hb_compGenILCode( PHB_FNAME pFileName ) /* generates the IL output */
// hb_comp_szPrefix, pFileName->szName,
// hb_comp_szPrefix, pFileName->szName );
/* QOUT() */
fprintf( yyc, "\n.method public static void QOUT( string c )\n{\n" );
fprintf( yyc, " ldarg.0\n" );
fprintf( yyc, " call void [mscorlib]System.Console::WriteLine( string )\n" );
fprintf( yyc, " ret\n}\n" );
/* Generate functions data
*/
pFunc = hb_comp_functions.pFirst;
@@ -430,7 +439,15 @@ static HB_GENC_FUNC( hb_p_do )
static HB_GENC_FUNC( hb_p_doshort )
{
fprintf( cargo->yyc, "\tHB_P_DOSHORT, %i,\n", pFunc->pCode[ lPCodePos + 1 ] );
// fprintf( cargo->yyc, "\tHB_P_DOSHORT, %i,\n", pFunc->pCode[ lPCodePos + 1 ] );
if( strcmp( szSymbol, "QOUT" ) == 0 )
fprintf( cargo->yyc, " call void QOUT( string )\n" );
else
fprintf( cargo->yyc, " call void %s()\n", szSymbol );
szSymbol = NULL;
bFirstSymbolParam = FALSE;
return 2;
}
@@ -482,10 +499,10 @@ static HB_GENC_FUNC( hb_p_endblock )
static HB_GENC_FUNC( hb_p_endproc )
{
if( (lPCodePos+1) == pFunc->lPCodePos )
fprintf( cargo->yyc, "\tHB_P_ENDPROC\n" );
else
fprintf( cargo->yyc, "\tHB_P_ENDPROC,\n" );
// if( (lPCodePos+1) == pFunc->lPCodePos )
// fprintf( cargo->yyc, "\tHB_P_ENDPROC\n" );
// else
// fprintf( cargo->yyc, "\tHB_P_ENDPROC,\n" );
return 1;
}
@@ -766,16 +783,16 @@ static HB_GENC_FUNC( hb_p_lessequal )
static HB_GENC_FUNC( hb_p_line )
{
if( cargo->bVerbose )
fprintf( cargo->yyc, "/* %05li */ ", lPCodePos );
else
fprintf( cargo->yyc, "\t" );
fprintf( cargo->yyc, "HB_P_LINE, %i, %i,",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ] );
if( cargo->bVerbose )
fprintf( cargo->yyc, "\t/* %i */", pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256 );
fprintf( cargo->yyc, "\n" );
// if( cargo->bVerbose )
// fprintf( cargo->yyc, "/* %05li */ ", lPCodePos );
// else
// fprintf( cargo->yyc, "\t" );
// fprintf( cargo->yyc, "HB_P_LINE, %i, %i,",
// pFunc->pCode[ lPCodePos + 1 ],
// pFunc->pCode[ lPCodePos + 2 ] );
// if( cargo->bVerbose )
// fprintf( cargo->yyc, "\t/* %i */", pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256 );
// fprintf( cargo->yyc, "\n" );
return 3;
}
@@ -1443,7 +1460,10 @@ static HB_GENC_FUNC( hb_p_pushnil )
HB_SYMBOL_UNUSED( pFunc );
HB_SYMBOL_UNUSED( lPCodePos );
fprintf( cargo->yyc, "\tHB_P_PUSHNIL,\n" );
if( bFirstSymbolParam )
bFirstSymbolParam = FALSE;
else
fprintf( cargo->yyc, " // HB_P_PUSHNIL,\n" );
return 1;
}
@@ -1540,15 +1560,16 @@ static HB_GENC_FUNC( hb_p_pushstrshort )
ULONG ulStart = lPCodePos;
USHORT wLen = pFunc->pCode[ lPCodePos + 1 ];
fprintf( cargo->yyc, "\tHB_P_PUSHSTRSHORT, %i,", pFunc->pCode[ lPCodePos + 1 ] );
// fprintf( cargo->yyc, "\tHB_P_PUSHSTRSHORT, %i,", pFunc->pCode[ lPCodePos + 1 ] );
fprintf( cargo->yyc, " ldstr " );
if( cargo->bVerbose )
fprintf( cargo->yyc, "\t/* %i */", wLen );
// if( cargo->bVerbose )
// fprintf( cargo->yyc, "\t/* %i */", wLen );
lPCodePos += 2;
if( wLen > 0 )
{
fprintf( cargo->yyc, "\n\t" );
fprintf( cargo->yyc, "\"" );
while( wLen-- )
{
BYTE uchr = ( BYTE ) pFunc->pCode[ lPCodePos++ ];
@@ -1558,15 +1579,17 @@ static HB_GENC_FUNC( hb_p_pushstrshort )
*
* TODO: add switch to use hexadecimal format "%#04x"
*/
if( ( uchr < ( BYTE ) ' ' ) || ( uchr >= 127 ) )
if( uchr == 0 )
fprintf( cargo->yyc, "" );
else if( ( uchr < ( BYTE ) ' ' ) || ( uchr >= 127 ) )
fprintf( cargo->yyc, "%i, ", uchr );
else if( strchr( "\'\\\"", uchr ) )
fprintf( cargo->yyc, "%i, ", uchr );
else
fprintf( cargo->yyc, "\'%c\', ", uchr );
fprintf( cargo->yyc, "%c", uchr );
}
}
fprintf( cargo->yyc, "\n" );
fprintf( cargo->yyc, "\"\n" );
return (USHORT) ( lPCodePos - ulStart );
}
@@ -1584,11 +1607,14 @@ static HB_GENC_FUNC( hb_p_pushsym )
static HB_GENC_FUNC( hb_p_pushsymnear )
{
fprintf( cargo->yyc, "\tHB_P_PUSHSYMNEAR, %i,",
pFunc->pCode[ lPCodePos + 1 ] );
if( cargo->bVerbose )
fprintf( cargo->yyc, "\t/* %s */", hb_compSymbolGetPos( pFunc->pCode[ lPCodePos + 1 ] )->szName );
fprintf( cargo->yyc, "\n" );
// fprintf( cargo->yyc, "\tHB_P_PUSHSYMNEAR, %i,",
// pFunc->pCode[ lPCodePos + 1 ] );
// if( cargo->bVerbose )
// fprintf( cargo->yyc, "\t/* %s */", hb_compSymbolGetPos( pFunc->pCode[ lPCodePos + 1 ] )->szName );
szSymbol = hb_compSymbolGetPos( pFunc->pCode[ lPCodePos + 1 ] )->szName;
bFirstSymbolParam = TRUE;
// fprintf( cargo->yyc, " call void %s()\n", hb_compSymbolGetPos( pFunc->pCode[ lPCodePos + 1 ] )->szName );
// fprintf( cargo->yyc, "\n" );
return 2;
}
@@ -1607,7 +1633,7 @@ static HB_GENC_FUNC( hb_p_retvalue )
HB_SYMBOL_UNUSED( pFunc );
HB_SYMBOL_UNUSED( lPCodePos );
fprintf( cargo->yyc, "\tHB_P_RETVALUE,\n" );
fprintf( cargo->yyc, " // HB_P_RETVALUE,\n" );
return 1;
}
@@ -1992,8 +2018,8 @@ static void hb_compGenCReadable( PFUNCTION pFunc, FILE * yyc )
hb_compPCodeEval( pFunc, ( HB_PCODE_FUNC_PTR * ) s_verbose_table, ( void * ) &genc_info );
if( genc_info.bVerbose )
fprintf( yyc, "/* %05li */\n", pFunc->lPCodePos );
// if( genc_info.bVerbose )
// fprintf( yyc, "/* %05li */\n", pFunc->lPCodePos );
}
static void hb_compGenCCompact( PFUNCTION pFunc, FILE * yyc )