2001-07-19 20:30 UTC-0800 Ron Pinkas <ron@profit-master.com>
* include/hbapi.h
+ Added #define HB_MAX_MACRO_ARGS 16
* source/vm/hvm.c
* source/vm/macro.c
+ Added support for nested HB_P_MACROPUSHARG
* contrib/dot/pp.prg
- Removed bSplit in PP_PreProLine(). Instead added logic to split the line unless line is a directive.
This commit is contained in:
@@ -1,3 +1,14 @@
|
||||
2001-07-19 20:30 UTC-0800 Ron Pinkas <ron@profit-master.com>
|
||||
* include/hbapi.h
|
||||
+ Added #define HB_MAX_MACRO_ARGS 16
|
||||
|
||||
* source/vm/hvm.c
|
||||
* source/vm/macro.c
|
||||
+ Added support for nested HB_P_MACROPUSHARG
|
||||
|
||||
* contrib/dot/pp.prg
|
||||
- Removed bSplit in PP_PreProLine(). Instead added logic to split the line unless line is a directive.
|
||||
|
||||
2001-07-19 21:30 GMT -3 Luiz Rafael Culik <culik@sl.conex.net>
|
||||
*utils/hbmake/hbmake.prg
|
||||
*Small changes needed to be more compatible with Gcc under OS/2
|
||||
|
||||
@@ -2228,7 +2228,7 @@ FUNCTION PP_PreProFile( sSource, sPPOExt, bBlanks )
|
||||
FWrite( hPP, CRLF )
|
||||
ENDIF
|
||||
ELSE
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource, .F. )
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource )
|
||||
IF bBlanks .OR. ! ( sLine == '' )
|
||||
FWrite( hPP, sLine + CRLF )
|
||||
ENDIF
|
||||
@@ -2266,7 +2266,7 @@ FUNCTION PP_PreProFile( sSource, sPPOExt, bBlanks )
|
||||
FWrite( hPP, CRLF )
|
||||
ENDIF
|
||||
ELSE
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource, .F. )
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource )
|
||||
IF bBlanks .OR. ! ( sLine == '' )
|
||||
FWrite( hPP, sLine + CRLF )
|
||||
ENDIF
|
||||
@@ -2429,7 +2429,7 @@ FUNCTION PP_PreProFile( sSource, sPPOExt, bBlanks )
|
||||
ENDIF
|
||||
ELSE
|
||||
//sLine += sRight
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource, .F. )
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource )
|
||||
IF bBlanks .OR. ! ( sLine == '' )
|
||||
FWrite( hPP, sLine + CRLF )
|
||||
ENDIF
|
||||
@@ -2452,7 +2452,7 @@ FUNCTION PP_PreProFile( sSource, sPPOExt, bBlanks )
|
||||
FWrite( hPP, CRLF )
|
||||
ENDIF
|
||||
ELSE
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource, .F. )
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource )
|
||||
IF bBlanks .OR. ! ( sLine == '' )
|
||||
FWrite( hPP, sLine + CRLF )
|
||||
ENDIF
|
||||
@@ -2514,7 +2514,7 @@ FUNCTION PP_PreProFile( sSource, sPPOExt, bBlanks )
|
||||
FWrite( hPP, sLine )
|
||||
ENDIF
|
||||
ELSE
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource, .F. )
|
||||
sLine := PP_PreProLine( sLine, nLine, sPath + sSource )
|
||||
IF bBlanks .OR. ! ( sLine == '' )
|
||||
FWrite( hPP, sLine )
|
||||
ENDIF
|
||||
@@ -2537,7 +2537,7 @@ RETURN .T.
|
||||
|
||||
//--------------------------------------------------------------//
|
||||
|
||||
FUNCTION PP_PreProLine( sLine, nLine, sSource, bSplit )
|
||||
FUNCTION PP_PreProLine( sLine, nLine, sSource )
|
||||
|
||||
LOCAL nPendingLines := 0, aPendingLines := {}
|
||||
|
||||
@@ -2551,11 +2551,7 @@ FUNCTION PP_PreProLine( sLine, nLine, sSource, bSplit )
|
||||
LOCAL sBackupLine
|
||||
LOCAL sSkipped
|
||||
|
||||
IF bSplit == NIL
|
||||
bSplit := .T.
|
||||
ENDIF
|
||||
|
||||
IF bSplit
|
||||
IF Left( LTrim( sLine ), 1 ) != '#'
|
||||
nPosition := 0
|
||||
WHILE ( nNewLineAt := nAtSkipStr( ';', sLine ) ) > 0
|
||||
nPendingLines++
|
||||
|
||||
@@ -64,6 +64,8 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define HB_MAX_MACRO_ARGS 16
|
||||
|
||||
/* items types and type checking macros */
|
||||
#define HB_IT_NIL ( ( USHORT ) 0x0000 )
|
||||
#define HB_IT_POINTER ( ( USHORT ) 0x0001 )
|
||||
|
||||
@@ -253,8 +253,8 @@ static LONG s_lRecoverBase;
|
||||
#define HB_RECOVER_ADDRESS -3
|
||||
#define HB_RECOVER_VALUE -4
|
||||
|
||||
int hb_vm_iExtraParams = 0;
|
||||
PHB_SYMB hb_vm_pExtraParamsSymbol = NULL;
|
||||
int hb_vm_aiExtraParams[HB_MAX_MACRO_ARGS], hb_vm_iExtraParamsIndex = 0;
|
||||
PHB_SYMB hb_vm_apExtraParamsSymbol[HB_MAX_MACRO_ARGS];
|
||||
|
||||
/* Request for some action - stop processing of opcodes
|
||||
*/
|
||||
@@ -1236,24 +1236,44 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
|
||||
/* the topmost element on the stack contains a macro
|
||||
* string for compilation
|
||||
*/
|
||||
if( pCode[ w + 1 ] == HB_P_PUSHSYMNEAR )
|
||||
{
|
||||
hb_vm_pExtraParamsSymbol = pSymbols + ( USHORT ) ( pCode[ w + 2 ] );
|
||||
w += 3;
|
||||
}
|
||||
else if( pCode[ w + 1 ] == HB_P_MPUSHSYM )
|
||||
{
|
||||
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 2 );
|
||||
hb_macroGetValue( hb_stackItemFromTop( -1 ), TRUE );
|
||||
w++;
|
||||
|
||||
hb_vm_pExtraParamsSymbol = ( *pDynSym )->pSymbol;
|
||||
w += sizeof( HB_DYNS_PTR ) + 2;
|
||||
if( hb_vm_iExtraParamsIndex && hb_vm_apExtraParamsSymbol[hb_vm_iExtraParamsIndex - 1] == NULL )
|
||||
{
|
||||
if( pCode[w] == HB_P_PUSHSYMNEAR )
|
||||
{
|
||||
hb_vm_apExtraParamsSymbol[hb_vm_iExtraParamsIndex - 1] = pSymbols + ( USHORT ) ( pCode[w + 1] );
|
||||
w += 2;
|
||||
}
|
||||
else if( pCode[w] == HB_P_MPUSHSYM )
|
||||
{
|
||||
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
|
||||
|
||||
hb_vm_apExtraParamsSymbol[hb_vm_iExtraParamsIndex - 1] = ( *pDynSym )->pSymbol;
|
||||
w += sizeof( HB_DYNS_PTR ) + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
hb_vm_apExtraParamsSymbol[hb_vm_iExtraParamsIndex - 1] = pSymbols + ( USHORT ) ( pCode[w + 1] + ( pCode[w + 2] * 256 ) );
|
||||
w += 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
hb_vm_pExtraParamsSymbol = pSymbols + ( USHORT ) ( pCode[ w + 2 ] + ( pCode[ w + 3 ] * 256 ) );
|
||||
w += 4;
|
||||
if( pCode[w] == HB_P_PUSHSYMNEAR )
|
||||
{
|
||||
w += 2;
|
||||
}
|
||||
else if( pCode[w] == HB_P_MPUSHSYM )
|
||||
{
|
||||
w += sizeof( HB_DYNS_PTR ) + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
w += 3;
|
||||
}
|
||||
}
|
||||
hb_macroGetValue( hb_stackItemFromTop( -1 ), TRUE );
|
||||
break;
|
||||
|
||||
case HB_P_MACROPUSHALIASED:
|
||||
@@ -2875,13 +2895,11 @@ void hb_vmDo( USHORT uiParams )
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_vmDo(%hu)", uiParams));
|
||||
|
||||
/*
|
||||
printf( "\nItems: %i Params: %i Extra %i\n", hb_stack.pPos - hb_stack.pBase, uiParams, hb_vm_iExtraParams );
|
||||
printf( "\nItems: %i Params: %i Extra %i\n", hb_stack.pPos - hb_stack.pBase, uiParams, hb_vm_aiExtraParams[hb_vm_iExtraParamsIndex - 1] );
|
||||
*/
|
||||
if( hb_vm_iExtraParams && ( ( hb_stack.pPos - hb_stack.pBase ) >= ( uiParams + hb_vm_iExtraParams + 2 ) ) && HB_IS_SYMBOL( pItem = hb_stackItemFromTop( -( uiParams + hb_vm_iExtraParams + 2 ) ) ) && pItem->item.asSymbol.value == hb_vm_pExtraParamsSymbol )
|
||||
if( hb_vm_iExtraParamsIndex && HB_IS_SYMBOL( pItem = hb_stackItemFromTop( -( uiParams + hb_vm_aiExtraParams[hb_vm_iExtraParamsIndex - 1] + 2 ) ) ) && pItem->item.asSymbol.value == hb_vm_apExtraParamsSymbol[hb_vm_iExtraParamsIndex - 1] )
|
||||
{
|
||||
uiParams += hb_vm_iExtraParams;
|
||||
hb_vm_iExtraParams = 0;
|
||||
hb_vm_pExtraParamsSymbol = NULL;
|
||||
uiParams += hb_vm_aiExtraParams[--hb_vm_iExtraParamsIndex];
|
||||
}
|
||||
|
||||
if( bProfiler )
|
||||
@@ -3007,11 +3025,9 @@ void hb_vmSend( USHORT uiParams )
|
||||
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_vmSend(%hu)", uiParams));
|
||||
|
||||
if( hb_vm_iExtraParams && ( hb_stack.pPos - hb_stack.pBase >= ( uiParams + hb_vm_iExtraParams + 2 ) ) && HB_IS_SYMBOL( pItem = hb_stackItemFromTop( -( uiParams + hb_vm_iExtraParams + 2 ) ) ) && pItem->item.asSymbol.value == hb_vm_pExtraParamsSymbol )
|
||||
if( hb_vm_iExtraParamsIndex && HB_IS_SYMBOL( pItem = hb_stackItemFromTop( -( uiParams + hb_vm_aiExtraParams[hb_vm_iExtraParamsIndex - 1] + 2 ) ) ) && pItem->item.asSymbol.value == hb_vm_apExtraParamsSymbol[hb_vm_iExtraParamsIndex - 1] )
|
||||
{
|
||||
uiParams += hb_vm_iExtraParams;
|
||||
hb_vm_iExtraParams = 0;
|
||||
hb_vm_pExtraParamsSymbol = NULL;
|
||||
uiParams += hb_vm_aiExtraParams[--hb_vm_iExtraParamsIndex];
|
||||
}
|
||||
|
||||
if( bProfiler )
|
||||
|
||||
@@ -427,7 +427,8 @@ char * hb_macroTextSubst( char * szString, ULONG *pulStringLen )
|
||||
*/
|
||||
void hb_macroGetValue( HB_ITEM_PTR pItem, BOOL bArg )
|
||||
{
|
||||
extern int hb_vm_iExtraParams;
|
||||
extern int hb_vm_aiExtraParams[HB_MAX_MACRO_ARGS], hb_vm_iExtraParamsIndex;
|
||||
extern PHB_SYMB hb_vm_apExtraParamsSymbol[HB_MAX_MACRO_ARGS];
|
||||
|
||||
HB_TRACE(HB_TR_DEBUG, ("hb_macroGetValue(%p)", pItem));
|
||||
|
||||
@@ -469,6 +470,11 @@ void hb_macroGetValue( HB_ITEM_PTR pItem, BOOL bArg )
|
||||
|
||||
iStatus = hb_macroParse( &struMacro, szString );
|
||||
|
||||
if( bArg && hb_vm_iExtraParamsIndex == HB_MAX_MACRO_ARGS )
|
||||
{
|
||||
hb_macroSyntaxError( &struMacro );
|
||||
}
|
||||
|
||||
#ifdef HB_MACRO_STATEMENTS
|
||||
hb_xfree( pText );
|
||||
hb_xfree( pOut );
|
||||
@@ -481,7 +487,8 @@ void hb_macroGetValue( HB_ITEM_PTR pItem, BOOL bArg )
|
||||
|
||||
if( bArg && struMacro.iListElements > 0 )
|
||||
{
|
||||
hb_vm_iExtraParams += struMacro.iListElements;
|
||||
hb_vm_aiExtraParams[hb_vm_iExtraParamsIndex] = struMacro.iListElements;
|
||||
hb_vm_apExtraParamsSymbol[hb_vm_iExtraParamsIndex++] = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user