From 6c5369f4f849dd78715efeb7c6f18ddaa23ffc9f Mon Sep 17 00:00:00 2001 From: Ron Pinkas Date: Mon, 16 Jul 2001 09:41:28 +0000 Subject: [PATCH] 2001-07-16 02:45 UTC-0800 Ron Pinkas * source/vm/hvm.c * Few improvements to recent support for lists in macro expansion * source/vm/macro.c + Added preprocessing support to hb_macroGetValue() * source/compiler/harbour.sly * source/compiler/harbour.y + Added rules to support MacroVar and MacroExpr as a standalone Statement. --- harbour/ChangeLog | 11 +++ harbour/source/compiler/harbour.sly | 2 + harbour/source/compiler/harbour.y | 2 + harbour/source/vm/hvm.c | 107 ++++++++++++++++++++++++---- harbour/source/vm/macro.c | 32 ++++++++- 5 files changed, 138 insertions(+), 16 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 37253538b8..b04ce8065c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,14 @@ +2001-07-16 02:45 UTC-0800 Ron Pinkas + * source/vm/hvm.c + * Few improvements to recent support for lists in macro expansion + + * source/vm/macro.c + + Added preprocessing support to hb_macroGetValue() + + * source/compiler/harbour.sly + * source/compiler/harbour.y + + Added rules to support MacroVar and MacroExpr as a standalone Statement. + 2001-07-15 20:45 UTC-0800 Ron Pinkas * include/hbapi.h + Added member iListElements to HB_MACRO structure. diff --git a/harbour/source/compiler/harbour.sly b/harbour/source/compiler/harbour.sly index cae29e1c29..81b722dd5b 100644 --- a/harbour/source/compiler/harbour.sly +++ b/harbour/source/compiler/harbour.sly @@ -337,6 +337,8 @@ Statement : ExecFlow CrlfStmnt { } | FunCall CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | AliasExpr CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | ObjectMethod CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } + | MacroVar CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } + | MacroExpr CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | PareExpList CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | ExprPreOp CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | ExprPostOp CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } diff --git a/harbour/source/compiler/harbour.y b/harbour/source/compiler/harbour.y index 95f14171b9..75fb48681f 100644 --- a/harbour/source/compiler/harbour.y +++ b/harbour/source/compiler/harbour.y @@ -325,6 +325,8 @@ Statement : ExecFlow CrlfStmnt { } | FunCall CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | AliasExpr CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | ObjectMethod CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } + | MacroVar CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } + | MacroExpr CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | PareExpList CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | ExprPreOp CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } | ExprPostOp CrlfStmnt { hb_compExprDelete( hb_compExprGenStatement( $1 ) ); } diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index c74ad6de43..297d837b6f 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -247,7 +247,7 @@ static LONG s_lRecoverBase; #define HB_RECOVER_ADDRESS -3 #define HB_RECOVER_VALUE -4 -int hb_vm_iFunCalls = 0, *hb_vm_aiMacroListParameters = NULL, hb_vm_iMacroListAllocated; +int hb_vm_iFunCalls = 0, *hb_vm_aiMacroListParameters = NULL, hb_vm_iMacroListAllocated = 0, hb_vm_iExtraParams; /* Request for some action - stop processing of opcodes */ @@ -387,7 +387,10 @@ void hb_vmQuit( void ) { HB_TRACE(HB_TR_DEBUG, ("hb_vmQuit()")); - hb_xfree( (void*) hb_vm_aiMacroListParameters ); + if( hb_vm_aiMacroListParameters ) + { + hb_xfree( (void*) hb_vm_aiMacroListParameters ); + } s_uiActionRequest = 0; /* EXIT procedures should be processed */ hb_vmDoExitFunctions(); /* process defined EXIT functions */ @@ -581,6 +584,13 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) /* Object */ case HB_P_MESSAGE: + if( hb_vm_iFunCalls >= hb_vm_iMacroListAllocated ) + { + //printf( "\nRealloc! FunCalls: %i Allocated: %i \n", hb_vm_iFunCalls, hb_vm_iMacroListAllocated ); + hb_vm_aiMacroListParameters = (int *) hb_xrealloc( (void*) hb_vm_aiMacroListParameters, sizeof( int ) * ( hb_vm_iMacroListAllocated += 16 ) ); + } + hb_vm_aiMacroListParameters[ hb_vm_iFunCalls++ ] = 0; + hb_vmMessage( pSymbols + ( USHORT ) ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) ) ); w += 3; break; @@ -595,42 +605,102 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) /* Execution */ case HB_P_DO: - hb_vmDo( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) + hb_vm_aiMacroListParameters[ hb_vm_iFunCalls - 1 ] ); + if( hb_vm_iFunCalls ) + { + hb_vm_iExtraParams = hb_vm_aiMacroListParameters[ --hb_vm_iFunCalls ]; + } + else + { + hb_vm_iExtraParams = 0; + //printf( "\nOops!\n" ); + } + + hb_vmDo( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) + hb_vm_iExtraParams ); w += 3; break; case HB_P_DOSHORT: - hb_vmDo( pCode[ w + 1 ] + hb_vm_aiMacroListParameters[ hb_vm_iFunCalls - 1 ] ); + if( hb_vm_iFunCalls ) + { + hb_vm_iExtraParams = hb_vm_aiMacroListParameters[ --hb_vm_iFunCalls ]; + } + else + { + hb_vm_iExtraParams = 0; + //printf( "\nOops!\n" ); + } + + hb_vmDo( pCode[ w + 1 ] + hb_vm_iExtraParams ); w += 2; break; case HB_P_FUNCTION: + if( hb_vm_iFunCalls ) + { + hb_vm_iExtraParams = hb_vm_aiMacroListParameters[ --hb_vm_iFunCalls ]; + } + else + { + hb_vm_iExtraParams = 0; + //printf( "\nOops!\n" ); + } + hb_itemClear( &hb_stack.Return ); - hb_vmDo( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) + hb_vm_aiMacroListParameters[ hb_vm_iFunCalls - 1 ] ); + hb_vmDo( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) + hb_vm_iExtraParams ); hb_itemCopy( hb_stackTopItem(), &hb_stack.Return ); hb_stackPush(); w += 3; break; case HB_P_FUNCTIONSHORT: + if( hb_vm_iFunCalls ) + { + hb_vm_iExtraParams = hb_vm_aiMacroListParameters[ --hb_vm_iFunCalls ]; + } + else + { + hb_vm_iExtraParams = 0; + //printf( "\nOops!\n" ); + } + hb_itemClear( &hb_stack.Return ); - hb_vmDo( pCode[ w + 1 ] + hb_vm_aiMacroListParameters[ hb_vm_iFunCalls - 1 ] ); + hb_vmDo( pCode[ w + 1 ] + hb_vm_iExtraParams ); hb_itemCopy( hb_stackTopItem(), &hb_stack.Return ); hb_stackPush(); w += 2; break; case HB_P_SEND: + if( hb_vm_iFunCalls ) + { + hb_vm_iExtraParams = hb_vm_aiMacroListParameters[ --hb_vm_iFunCalls ]; + } + else + { + hb_vm_iExtraParams = 0; + //printf( "\nOops!\n" ); + } + hb_itemClear( &hb_stack.Return ); - hb_vmSend( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 + hb_vm_aiMacroListParameters[ hb_vm_iFunCalls - 1 ] ) ); + hb_vmSend( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 + hb_vm_iExtraParams ) ); hb_itemCopy( hb_stackTopItem(), &hb_stack.Return ); hb_stackPush(); w += 3; break; case HB_P_SENDSHORT: + if( hb_vm_iFunCalls ) + { + hb_vm_iExtraParams = hb_vm_aiMacroListParameters[ --hb_vm_iFunCalls ]; + } + else + { + hb_vm_iExtraParams = 0; + //printf( "\nOops!\n" ); + } + hb_itemClear( &hb_stack.Return ); - hb_vmSend( pCode[ w + 1 ] + hb_vm_aiMacroListParameters[ hb_vm_iFunCalls - 1 ] ); + hb_vmSend( pCode[ w + 1 ] + hb_vm_iExtraParams ); hb_itemCopy( hb_stackTopItem(), &hb_stack.Return ); hb_stackPush(); w += 2; @@ -1024,8 +1094,9 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_PUSHSYM: - if( hb_vm_iFunCalls > hb_vm_iMacroListAllocated ) + if( hb_vm_iFunCalls >= hb_vm_iMacroListAllocated ) { + //printf( "\nRealloc! FunCalls: %i Allocated: %i \n", hb_vm_iFunCalls, hb_vm_iMacroListAllocated ); hb_vm_aiMacroListParameters = (int *) hb_xrealloc( (void*) hb_vm_aiMacroListParameters, sizeof( int ) * ( hb_vm_iMacroListAllocated += 16 ) ); } hb_vm_aiMacroListParameters[ hb_vm_iFunCalls++ ] = 0; @@ -1035,8 +1106,9 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_PUSHSYMNEAR: - if( hb_vm_iFunCalls > hb_vm_iMacroListAllocated ) + if( hb_vm_iFunCalls >= hb_vm_iMacroListAllocated ) { + //printf( "\nRealloc! FunCalls: %i Allocated: %i \n", hb_vm_iFunCalls, hb_vm_iMacroListAllocated ); hb_vm_aiMacroListParameters = (int *) hb_xrealloc( (void*) hb_vm_aiMacroListParameters, sizeof( int ) * ( hb_vm_iMacroListAllocated += 16 ) ); } hb_vm_aiMacroListParameters[ hb_vm_iFunCalls++ ] = 0; @@ -1244,8 +1316,9 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MACROSYMBOL: /* compile into a symbol name (used in function calls) */ - if( hb_vm_iFunCalls > hb_vm_iMacroListAllocated ) + if( hb_vm_iFunCalls >= hb_vm_iMacroListAllocated ) { + //printf( "\nRealloc! FunCalls: %i Allocated: %i \n", hb_vm_iFunCalls, hb_vm_iMacroListAllocated ); hb_vm_aiMacroListParameters = (int *) hb_xrealloc( (void*) hb_vm_aiMacroListParameters, sizeof( int ) * ( hb_vm_iMacroListAllocated += 16 ) ); } hb_vm_aiMacroListParameters[ hb_vm_iFunCalls++ ] = 0; @@ -1267,6 +1340,14 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MMESSAGE: { HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); + + if( hb_vm_iFunCalls >= hb_vm_iMacroListAllocated ) + { + //printf( "\nRealloc! FunCalls: %i Allocated: %i \n", hb_vm_iFunCalls, hb_vm_iMacroListAllocated ); + hb_vm_aiMacroListParameters = (int *) hb_xrealloc( (void*) hb_vm_aiMacroListParameters, sizeof( int ) * ( hb_vm_iMacroListAllocated += 16 ) ); + } + hb_vm_aiMacroListParameters[ hb_vm_iFunCalls++ ] = 0; + hb_vmMessage( ( *pDynSym )->pSymbol ); w += sizeof( HB_DYNS_PTR ) + 1; break; @@ -2859,8 +2940,6 @@ void hb_vmDo( USHORT uiParams ) HB_TRACE(HB_TR_DEBUG, ("hb_vmDo(%hu)", uiParams)); - hb_vm_aiMacroListParameters[ --hb_vm_iFunCalls ] = 0; - hb_inkeyPoll(); /* Poll the console keyboard */ pItem = hb_stackNewFrame( &sStackState, uiParams ); @@ -2975,8 +3054,6 @@ void hb_vmSend( USHORT uiParams ) HB_TRACE(HB_TR_DEBUG, ("hb_vmSend(%hu)", uiParams)); - hb_vm_aiMacroListParameters[ --hb_vm_iFunCalls ] = 0; - pItem = hb_stackNewFrame( &sStackState, uiParams ); /* procedure name */ pSym = pItem->item.asSymbol.value; pSelf = hb_stackSelfItem(); /* NIL, OBJECT or BLOCK */ diff --git a/harbour/source/vm/macro.c b/harbour/source/vm/macro.c index 5a97862c1a..de70fe1fb7 100644 --- a/harbour/source/vm/macro.c +++ b/harbour/source/vm/macro.c @@ -433,15 +433,45 @@ void hb_macroGetValue( HB_ITEM_PTR pItem ) int iStatus; char * szString = pItem->item.asString.value; + char * pText = ( char * ) hb_xgrab( HB_PP_STR_SIZE ); + char * pOut = ( char * ) hb_xgrab( HB_PP_STR_SIZE ); + char * ptr = pText; + int slen; + struMacro.Flags = HB_MACRO_GEN_PUSH; struMacro.bShortCuts = hb_comp_bShortCuts; struMacro.uiNameLen = HB_SYMBOL_NAME_LEN; struMacro.status = HB_MACRO_CONT; struMacro.iListElements = 0; + slen = HB_MIN( szString, HB_PP_STR_SIZE - 1 ); + memcpy( pText, szString, slen ); + pText[ slen ] = 0; + memset( pOut, 0, HB_PP_STR_SIZE ); + + HB_SKIPTABSPACES( ptr ); + + if( !hb_pp_topDefine ) + { + hb_pp_Table(); + } + + hb_pp_ParseExpression( ptr, pOut ); + szString = pText; + iStatus = hb_macroParse( &struMacro, szString ); - hb_vm_aiMacroListParameters[ hb_vm_iFunCalls - 1 ] = struMacro.iListElements; + hb_xfree( pText ); + hb_xfree( pOut ); + + if( hb_vm_iFunCalls ) + { + hb_vm_aiMacroListParameters[ hb_vm_iFunCalls - 1 ] = struMacro.iListElements; + } + else + { + //printf( "Oops\n" ); + } hb_stackPop(); /* remove compiled string */ if( iStatus == HB_MACRO_OK && ( struMacro.status & HB_MACRO_CONT ) )