From ab3fe6f50c43a365367457f59d8acff7e23f6d10 Mon Sep 17 00:00:00 2001 From: Antonio Linares Date: Mon, 30 Jun 2003 16:33:06 +0000 Subject: [PATCH] Added support for multidimensional arrays for Harbour.NET --- harbour/source/compiler/gencli.c | 236 +++++++++++++++++++++++++++---- 1 file changed, 209 insertions(+), 27 deletions(-) diff --git a/harbour/source/compiler/gencli.c b/harbour/source/compiler/gencli.c index c7f1be7c13..fec2d56655 100644 --- a/harbour/source/compiler/gencli.c +++ b/harbour/source/compiler/gencli.c @@ -42,13 +42,19 @@ typedef struct HB_stru_genc_info USHORT iNestedCodeblock; } HB_GENC_INFO, * HB_GENC_INFO_PTR; +typedef struct HB_stru_funcalls +{ + char * szName; + BOOL bFirstParam; + void * pNext; +} HB_FUNCALLS, * HB_FUNCALLS_PTR; + +static HB_FUNCALLS_PTR pFunCalls = NULL; + #define HB_GENC_FUNC( func ) HB_PCODE_FUNC( func, HB_GENC_INFO_PTR ) 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 ]; @@ -386,7 +392,11 @@ static HB_GENC_FUNC( hb_p_arraypush ) HB_SYMBOL_UNUSED( pFunc ); HB_SYMBOL_UNUSED( lPCodePos ); - fprintf( cargo->yyc, "\tHB_P_ARRAYPUSH,\n" ); + fprintf( cargo->yyc, " IL_%04lX: ", lPCodePos ); + fprintf( cargo->yyc, "call object ObjArrayPush( object, object )\n" ); + + // fprintf( cargo->yyc, "\tHB_P_ARRAYPUSH,\n" ); + return 1; } @@ -437,19 +447,29 @@ static HB_GENC_FUNC( hb_p_do ) static HB_GENC_FUNC( hb_p_doshort ) { + HB_FUNCALLS_PTR pTemp = pFunCalls, pPrev = NULL; + char * szFunName; + + while( pTemp->pNext != NULL ) + { + pPrev = pTemp; + pTemp = ( HB_FUNCALLS_PTR ) pTemp->pNext; + } + + szFunName = pTemp->szName; + pTemp->bFirstParam = FALSE; + hb_xfree( pTemp ); + + if( pTemp == pFunCalls ) + pFunCalls = NULL; + else if( pPrev != NULL ) + pPrev->pNext = NULL; + fprintf( cargo->yyc, " IL_%04lX: ", lPCodePos ); + fprintf( cargo->yyc, "call object %s( object )\n", szFunName ); + fprintf( cargo->yyc, " pop\n" ); // fprintf( cargo->yyc, "\tHB_P_DOSHORT, %i,\n", pFunc->pCode[ lPCodePos + 1 ] ); - if( strcmp( szSymbol, "QOUT" ) == 0 ) - { - fprintf( cargo->yyc, "call object QOUT( object )\n" ); - fprintf( cargo->yyc, " pop\n" ); - } - else - fprintf( cargo->yyc, "call void %s()\n", szSymbol ); - - szSymbol = NULL; - bFirstSymbolParam = FALSE; return 2; } @@ -582,20 +602,51 @@ static HB_GENC_FUNC( hb_p_function ) static HB_GENC_FUNC( hb_p_functionshort ) { - HB_SYMBOL_UNUSED( pFunc ); - HB_SYMBOL_UNUSED( lPCodePos ); + HB_FUNCALLS_PTR pTemp = pFunCalls, pPrev = NULL; + char * szFunName; - fprintf( cargo->yyc, "\tHB_P_FUNCTIONSHORT, %i,\n", pFunc->pCode[ lPCodePos + 1 ] ); - return 1; + while( pTemp->pNext != NULL ) + { + pPrev = pTemp; + pTemp = ( HB_FUNCALLS_PTR ) pTemp->pNext; + } + + szFunName = pTemp->szName; + pTemp->bFirstParam = FALSE; + hb_xfree( pTemp ); + + if( pTemp == pFunCalls ) + pFunCalls = NULL; + else if( pPrev != NULL ) + pPrev->pNext = NULL; + + fprintf( cargo->yyc, " IL_%04lX: ", lPCodePos ); + fprintf( cargo->yyc, "call object %s( object )\n", szFunName ); + + // fprintf( cargo->yyc, "\tHB_P_FUNCTIONHORT, %i,\n", pFunc->pCode[ lPCodePos + 1 ] ); + + return 2; } static HB_GENC_FUNC( hb_p_arraygen ) { - fprintf( cargo->yyc, "\tHB_P_ARRAYGEN, %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" ); + int i; + + fprintf( cargo->yyc, " IL_%04lX: ", lPCodePos ); + fprintf( cargo->yyc, "call vararg object ObjArrayGen( ..." ); + + for( i = 0; i < pFunc->pCode[ lPCodePos + 1 ] + + ( pFunc->pCode[ lPCodePos + 2 ] * 256 ); i++ ) + fprintf( cargo->yyc, ",object" ); + + fprintf( cargo->yyc, ")\n" ); + + // fprintf( cargo->yyc, "\tHB_P_ARRAYGEN, %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; } @@ -1552,11 +1603,24 @@ static HB_GENC_FUNC( hb_p_pushmemvarref ) static HB_GENC_FUNC( hb_p_pushnil ) { + HB_FUNCALLS_PTR pTemp = pFunCalls; + HB_SYMBOL_UNUSED( pFunc ); HB_SYMBOL_UNUSED( lPCodePos ); - if( bFirstSymbolParam ) - bFirstSymbolParam = FALSE; + if( pTemp ) + { + while( pTemp->pNext ) + pTemp = ( HB_FUNCALLS_PTR ) pTemp->pNext; + + if( pTemp->bFirstParam ) + pTemp->bFirstParam = FALSE; + else + { + // fprintf( cargo->yyc, " IL_%04lX: ", lPCodePos ); + // fprintf( cargo->yyc, "ldnull\n" ); + } + } else { // fprintf( cargo->yyc, " IL_%04lX: ", lPCodePos ); @@ -1709,17 +1773,37 @@ static HB_GENC_FUNC( hb_p_pushsym ) static HB_GENC_FUNC( hb_p_pushsymnear ) { + HB_FUNCALLS_PTR pTemp = pFunCalls; + + if( pTemp != NULL ) + { + while( pTemp->pNext != NULL ) + pTemp = ( HB_FUNCALLS_PTR ) pTemp->pNext; + + pTemp->pNext = ( struct HB_FUNCALLS * ) hb_xgrab( sizeof( HB_FUNCALLS ) ); + pTemp = pTemp->pNext; + } + else + { + pFunCalls = ( HB_FUNCALLS_PTR ) hb_xgrab( sizeof( HB_FUNCALLS ) ); + pTemp = pFunCalls; + } + + pTemp->szName = hb_compSymbolGetPos( pFunc->pCode[ lPCodePos + 1 ] )->szName; + pTemp->bFirstParam = TRUE; + pTemp->pNext = NULL; + // 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, " IL_%04lX: ", lPCodePos ); fprintf( cargo->yyc, "nop\n" ); - 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; } @@ -2243,6 +2327,72 @@ static void hb_genNetFunctions( FILE * yyc ) " IL_0075: br.s IL_0077", " IL_0077: ldloc.0", " IL_0078: ret", +"}", 0 }; + + // public static object ObjArrayGen( __arglist ) + // { + // ArrayList a = new ArrayList(); + // ArgIterator ai = new ArgIterator( __arglist ); + // + // while( ai.GetRemainingCount() > 0 ) + // a.Add( __refvalue( ai.GetNextArg(), object ) ); + // + // return a; + // } + + char * ObjArrayGen[] = { +"\n.method public static vararg object ObjArrayGen()", +"{", +" .maxstack 2", +" .locals init (class [mscorlib]System.Collections.ArrayList V_0,", +" valuetype [mscorlib]System.ArgIterator V_1,", +" object V_2)", +" IL_0000: newobj instance void [mscorlib]System.Collections.ArrayList::.ctor()", +" IL_0005: stloc.0", +" IL_0006: ldloca.s V_1", +" IL_0008: arglist", +" IL_000a: call instance void [mscorlib]System.ArgIterator::.ctor(valuetype [mscorlib]System.RuntimeArgumentHandle)", +" IL_000f: br.s IL_0025", +" IL_0011: ldloc.0", +" IL_0012: ldloca.s V_1", +" IL_0014: call instance typedref [mscorlib]System.ArgIterator::GetNextArg()", +" IL_0019: refanyval [mscorlib]System.Object", +" IL_001e: ldind.ref", +" IL_001f: callvirt instance int32 [mscorlib]System.Collections.ArrayList::Add(object)", +" IL_0024: pop", +" IL_0025: ldloca.s V_1", +" IL_0027: call instance int32 [mscorlib]System.ArgIterator::GetRemainingCount()", +" IL_002c: ldc.i4.0", +" IL_002d: bgt.s IL_0011", +" IL_002f: ldloc.0", +" IL_0030: stloc.2", +" IL_0031: br.s IL_0033", +" IL_0033: ldloc.2", +" IL_0034: ret", +"}", 0 }; + + // public static object ObjArrayPush( object array, object index ) + // { + // return ( ( ArrayList ) array )[ ( ( int ) index ) - 1 ]; + // } + + char * ObjArrayPush[] = { +"\n.method public static object ObjArrayPush(object 'array', object index)", +"{", +" .maxstack 3", +" .locals init (object V_0)", +" IL_0000: ldarg.0", +" IL_0001: castclass [mscorlib]System.Collections.ArrayList", +" IL_0006: ldarg.1", +" IL_0007: unbox [mscorlib]System.Int32", +" IL_000c: ldind.i4", +" IL_000d: ldc.i4.1", +" IL_000e: sub", +" IL_000f: callvirt instance object [mscorlib]System.Collections.ArrayList::get_Item(int32)", +" IL_0014: stloc.0", +" IL_0015: br.s IL_0017", +" IL_0017: ldloc.0", +" IL_0018: ret", "}", 0 }; // public static bool ObjLessEqual( object a, object b ) @@ -2409,6 +2559,26 @@ static void hb_genNetFunctions( FILE * yyc ) " IL_0010: br.s IL_0012", " IL_0012: ldloc.0", " IL_0013: ret", +"}", 0 }; + + // public static object LEN( object o ) + // { + // return ( ( ArrayList ) o ).Count; + // } + + char * LEN[] = { +"\n.method public static object LEN(object o)", +"{", +" .maxstack 2", +" .locals init (object V_0)", +" IL_0000: ldarg.0", +" IL_0001: castclass [mscorlib]System.Collections.ArrayList", +" IL_0006: callvirt instance int32 [mscorlib]System.Collections.ArrayList::get_Count()", +" IL_000b: box [mscorlib]System.Int32", +" IL_0010: stloc.0", +" IL_0011: br.s IL_0013", +" IL_0013: ldloc.0", +" IL_0014: ret", "}", 0 }; // public static object QOUT( object o ) @@ -2463,6 +2633,14 @@ static void hb_genNetFunctions( FILE * yyc ) while( ObjAdd[ i ] != 0 ) fprintf( yyc, "%s\n", ObjAdd[ i++ ] ); + i = 0; + while( ObjArrayGen[ i ] != 0 ) + fprintf( yyc, "%s\n", ObjArrayGen[ i++ ] ); + + i = 0; + while( ObjArrayPush[ i ] != 0 ) + fprintf( yyc, "%s\n", ObjArrayPush[ i++ ] ); + i = 0; while( ObjLessEqual[ i ] != 0 ) fprintf( yyc, "%s\n", ObjLessEqual[ i++ ] ); @@ -2479,6 +2657,10 @@ static void hb_genNetFunctions( FILE * yyc ) while( ObjNot[ i ] != 0 ) fprintf( yyc, "%s\n", ObjNot[ i++ ] ); + i = 0; + while( LEN[ i ] != 0 ) + fprintf( yyc, "%s\n", LEN[ i++ ] ); + i = 0; while( QOUT[ i ] != 0 ) fprintf( yyc, "%s\n", QOUT[ i++ ] );