diff --git a/harbour/ChangeLog b/harbour/ChangeLog index a994b3de5a..9dca2a312b 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,22 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2004-09-08 16:40 UTC+0100 Ryszard Glab + * include/hbapi.h + * source/vm/dynsym.c + * a new function 'hb_dynsymScope' was added to check if the + passed symbol has requested scope + + * source/vm/macro.c + * source/vm/hvm.c + * fixed support for static functions used in macro compiled + expressions (the runtime error is generated during evaluation + instead of macro compilation - like in Clipper) + + * source/pp/ppcore.c + * fixed support for '¯o.' in complex expressions + + 2004-09-07 10:30 UTC+0100 Ryszard Glab * source/pp/ppcore.c * fixed support for Clipper undocumented match marker, diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index 1044cbcb22..b018588d73 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -465,6 +465,7 @@ extern PHB_DYNS hb_dynsymFindName( char * szName ); /* converts to uppercase and extern void hb_dynsymLog( void ); /* displays all dynamic symbols */ extern void hb_dynsymRelease( void ); /* releases the memory of the dynamic symbol table */ extern void hb_dynsymEval( PHB_DYNS_FUNC pFunction, void * Cargo ); /* enumerates all dynamic symbols */ +extern BOOL hb_dynsymScope( PHB_DYNS pSym, HB_SYMBOLSCOPE scope ); /* check if given symbol has a required scope */ /* Command line and environment argument management */ extern void HB_EXPORT hb_cmdargInit( int argc, char * argv[] ); /* initialize command line argument API's */ diff --git a/harbour/source/pp/ppcore.c b/harbour/source/pp/ppcore.c index 5ea43cd68d..caee6cb08b 100644 --- a/harbour/source/pp/ppcore.c +++ b/harbour/source/pp/ppcore.c @@ -2515,6 +2515,11 @@ static int getExpReal( char * expreal, char ** ptri, BOOL prlist, int maxrez, BO { State = STATE_ID_END; } + else if( **ptri == '&' ) + { + State = STATE_ID; + continue; + } else { State = STATE_EXPRES; diff --git a/harbour/source/vm/dynsym.c b/harbour/source/vm/dynsym.c index 6d3e3ea8dd..9517fd1550 100644 --- a/harbour/source/vm/dynsym.c +++ b/harbour/source/vm/dynsym.c @@ -200,6 +200,16 @@ PHB_DYNS HB_EXPORT hb_dynsymGet( char * szName ) /* finds and creates a symbol return pDynSym; } +BOOL hb_dynsymScope( PHB_DYNS pSym, HB_SYMBOLSCOPE scope ) +{ + if( pSym->pSymbol->cScope != SYM_ALLOCATED ) + { + return pSym->pSymbol->cScope & scope; + } + + return FALSE; +} + PHB_DYNS HB_EXPORT hb_dynsymFindName( char * szName ) /* finds a symbol */ { char szUprName[ HB_SYMBOL_NAME_LEN + 1 ]; diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 542029bac8..9c9d22aea1 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -1643,7 +1643,7 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_MPUSHSYM: { HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 ); - hb_vmPushSymbol( ( *pDynSym )->pSymbol ); + hb_vmPushMacroSymbol( ( *pDynSym )->pSymbol ); w += sizeof( HB_DYNS_PTR ) + 1; break; } @@ -3408,11 +3408,9 @@ void HB_EXPORT hb_vmDo( USHORT uiParams ) { /* static functions are not allowed in macro */ - HB_ITEM_PTR pError = hb_errRT_New( ES_ERROR, NULL, EG_NOFUNC, 1001, - NULL, pSym->szName, - 0, EF_NONE ); - hb_errLaunch( pError ); - hb_errRelease( pError ); + PHB_ITEM pArgsArray = hb_arrayFromStack( uiParams ); + hb_errRT_BASE_SubstR( EG_NOFUNC, 1001, NULL, pSym->szName, 1, pArgsArray ); + hb_itemRelease( pArgsArray ); } else { diff --git a/harbour/source/vm/macro.c b/harbour/source/vm/macro.c index 09028793f6..b0f69be53f 100644 --- a/harbour/source/vm/macro.c +++ b/harbour/source/vm/macro.c @@ -1219,25 +1219,19 @@ void hb_compGenPushSymbol( char * szSymbolName, BOOL bFunction, BOOL bAlias, HB_ * NULL value for pSym */ } + else if( bFunction ) + { + if( pSym && hb_dynsymScope(pSym, HB_FS_STATIC) ) + { + /* static functions are not allowed in macro */ + HB_MACRO_DATA->status |= HB_MACRO_UNKN_SYM; + HB_MACRO_DATA->status &= ~HB_MACRO_CONT; /* don't run this pcode */ + } + } } else pSym = hb_dynsymGet( szSymbolName ); - if( bFunction ) - { - if( pSym && ((pSym->pSymbol->value.pFunPtr == NULL) || (pSym->pSymbol->cScope & HB_FS_STATIC)) ) - { - /* static functions are not allowed in macro */ - HB_MACRO_DATA->status |= HB_MACRO_UNKN_SYM; - HB_MACRO_DATA->status &= ~HB_MACRO_CONT; /* don't run this pcode */ - if( !(HB_MACRO_DATA->Flags & HB_MACRO_GEN_TYPE) ) - { - HB_MACRO_DATA->pError = hb_errRT_New( ES_ERROR, NULL, EG_NOFUNC, 1001, - NULL, szSymbolName, - 0, EF_NONE ); - } - } - } hb_compGenPCode1( HB_P_MPUSHSYM, HB_MACRO_PARAM ); hb_compGenPCodeN( ( BYTE * ) &pSym, sizeof( pSym ), HB_MACRO_PARAM );