diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 2d3d6006ca..76112359dc 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,14 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-07-08 20:33 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbexprb.c + ! fixed macropop used with messages + + * harbour/include/hbapi.h + * harbour/source/vm/hvm.c + * added code to debug recover statements - it's disabled by default + 2009-07-08 20:05 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * source/rtl/tget.prg ! Fixed to handle lowercase picture mask characters. diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index ba93c42c43..50acd51426 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -93,6 +93,7 @@ HB_EXTERN_BEGIN #define HB_IT_ENUM ( ( HB_TYPE ) 0x10000 ) #define HB_IT_EXTREF ( ( HB_TYPE ) 0x20000 ) #define HB_IT_DEFAULT ( ( HB_TYPE ) 0x40000 ) +#define HB_IT_RECOVER ( ( HB_TYPE ) 0x80000 ) #define HB_IT_OBJECT HB_IT_ARRAY #define HB_IT_NUMERIC ( ( HB_TYPE ) ( HB_IT_INTEGER | HB_IT_LONG | HB_IT_DOUBLE ) ) #define HB_IT_NUMINT ( ( HB_TYPE ) ( HB_IT_INTEGER | HB_IT_LONG ) ) diff --git a/harbour/include/hbexprb.c b/harbour/include/hbexprb.c index 14d3861936..aa0dbac406 100644 --- a/harbour/include/hbexprb.c +++ b/harbour/include/hbexprb.c @@ -2573,10 +2573,13 @@ static HB_EXPR_FUNC( hb_compExprUseSend ) } else { + /* executed from macro compiler */ HB_GEN_FUNC2( PCode2, HB_P_SWAP, 1 ); HB_GEN_FUNC2( PCode2, HB_P_SWAP, 1 ); } HB_GEN_FUNC2( PCode2, HB_P_SENDSHORT, 1 ); + if( !pSelf->value.asMessage.pParms ) + HB_GEN_FUNC1( PCode1, HB_P_POP ); break; case HB_EA_PUSH_POP: diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index f228c69b54..a84b410ad7 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -1794,7 +1794,7 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) */ pItem = hb_stackAllocItem(); /* mark type as NIL - it's not real item */ - pItem->type = HB_IT_NIL; + pItem->type = HB_IT_RECOVER; /* store the address of RECOVER or END opcode */ pItem->item.asRecover.recover = pCode + HB_PCODE_MKINT24( &pCode[ 1 ] ); /* store current RECOVER base */ @@ -1817,6 +1817,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) } case HB_P_ALWAYSBEGIN: +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "HB_P_ALWAYSBEGIN", NULL, NULL ); +#endif /* change the recover address to ALWAYSEND opcode */ hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.recover = pCode + HB_PCODE_MKINT24( &pCode[ 1 ] ); @@ -1834,6 +1838,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) { USHORT uiPrevAction, uiCurrAction; +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "HB_P_ALWAYSEND", NULL, NULL ); +#endif uiPrevAction = hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.flags; uiCurrAction = hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.request; @@ -1885,7 +1893,7 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) */ pItem = hb_stackAllocItem(); /* mark type as NIL - it's not real item */ - pItem->type = HB_IT_NIL; + pItem->type = HB_IT_RECOVER; /* store the address of RECOVER or END opcode */ pItem->item.asRecover.recover = pCode + HB_PCODE_MKINT24( &pCode[ 1 ] ); /* store current RECOVER base */ @@ -1913,7 +1921,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) * This is executed either at the end of sequence or as the * response to the break statement if there is no RECOVER clause */ - +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "HB_P_SEQEND", NULL, NULL ); +#endif /* * 2) Restore previous recovery state */ @@ -1936,7 +1947,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) /* * Execute the RECOVER code */ - +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "HB_P_SEQRECOVER", NULL, NULL ); +#endif /* * 2) Restore previous recovery state */ @@ -2795,6 +2809,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) do { hb_stackRemove( hb_stackGetRecoverBase() ); +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "ENDPROC", NULL, NULL ); +#endif if( hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.flags & HB_SEQ_DOALWAYS ) break; /* Restore previous recovery state */ @@ -2806,6 +2824,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) /* ALWAYS found? */ if( bCanRecover ) { +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "ENDPROC ALWAYS", NULL, NULL ); +#endif /* reload the address of ALWAYS code */ pCode = hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.recover; /* store and reset action */ @@ -2832,6 +2854,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) /* * reload the address of recovery code */ +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "BREAK", NULL, NULL ); +#endif pCode = hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.recover; /* * leave the SEQUENCE envelope on the stack - it will @@ -2852,6 +2878,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) do { hb_stackRemove( hb_stackGetRecoverBase() ); +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "QUIT", NULL, NULL ); +#endif if( hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.flags & HB_SEQ_DOALWAYS ) break; /* Restore previous recovery state */ @@ -2864,6 +2894,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) /* ALWAYS found? */ if( bCanRecover ) { +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "QUIT ALWAYS", NULL, NULL ); +#endif /* reload the address of ALWAYS code */ pCode = hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.recover; /* store and reset action */ @@ -8294,12 +8328,20 @@ void hb_vmRequestBreak( PHB_ITEM pItem ) while( ulRecoverBase && ( hb_stackItem( ulRecoverBase + HB_RECOVER_STATE )->item.asRecover.flags & HB_SEQ_DOALWAYS ) ) { +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItem( ulRecoverBase + HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "hb_vmRequestBreak", NULL, NULL ); +#endif ulRecoverBase = hb_stackItem( ulRecoverBase + HB_RECOVER_STATE )->item.asRecover.base; } if( ulRecoverBase ) { +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItem( ulRecoverBase + HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "hb_vmRequestBreak2", NULL, NULL ); +#endif if( pItem ) hb_itemCopy( hb_stackItem( ulRecoverBase + HB_RECOVER_VALUE ), pItem ); @@ -8502,7 +8544,7 @@ void hb_xvmSeqBegin( void ) /* 2) recovery state */ pItem = hb_stackAllocItem(); /* mark type as NIL - it's not real item */ - pItem->type = HB_IT_NIL; + pItem->type = HB_IT_RECOVER; /* address of RECOVER or END opcode - not used in C code */ pItem->item.asRecover.recover = NULL; /* store current RECOVER base */ @@ -8524,7 +8566,10 @@ BOOL hb_xvmSeqEnd( void ) * remove all items placed on the stack after BEGIN code */ hb_stackRemove( hb_stackGetRecoverBase() ); - +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "hb_xvmSeqEnd", NULL, NULL ); +#endif /* * Remove the SEQUENCE envelope * This is executed either at the end of sequence or as the @@ -8532,7 +8577,7 @@ BOOL hb_xvmSeqEnd( void ) */ /* 2) Restore previous recovery base address */ - hb_stackSetRecoverBase( hb_stackItemFromTop( -1 )->item.asRecover.base ); + hb_stackSetRecoverBase( hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.base ); hb_stackDec(); /* 1) Discard the value returned by BREAK statement */ hb_stackPop(); @@ -8564,7 +8609,10 @@ BOOL hb_xvmSeqEndTest( void ) * remove all items placed on the stack after BEGIN code */ hb_stackRemove( hb_stackGetRecoverBase() ); - +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "hb_xvmSeqEndTest", NULL, NULL ); +#endif /* * Remove the SEQUENCE envelope * This is executed either at the end of sequence or as the @@ -8572,7 +8620,7 @@ BOOL hb_xvmSeqEndTest( void ) */ /* 2) Restore previous recovery base address */ - hb_stackSetRecoverBase( hb_stackItemFromTop( -1 )->item.asRecover.base ); + hb_stackSetRecoverBase( hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.base ); hb_stackDec(); /* 1) Discard the value returned by BREAK statement */ hb_stackPop(); @@ -8591,9 +8639,12 @@ BOOL hb_xvmSeqRecover( void ) * remove all items placed on the stack after BEGIN code */ hb_stackRemove( hb_stackGetRecoverBase() ); - +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "hb_xvmSeqRecover", NULL, NULL ); +#endif /* 2) Restore previous recovery base address */ - hb_stackSetRecoverBase( hb_stackItemFromTop( -1 )->item.asRecover.base ); + hb_stackSetRecoverBase( hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.base ); hb_stackDec(); /* 1) Leave the value returned from BREAK */ @@ -8621,7 +8672,7 @@ void hb_xvmSeqAlways( void ) /* 2) recovery state */ pItem = hb_stackAllocItem(); /* mark type as NIL - it's not real item */ - pItem->type = HB_IT_NIL; + pItem->type = HB_IT_RECOVER; /* address of RECOVER or END opcode - not used in C code */ pItem->item.asRecover.recover = NULL; /* store current RECOVER base */ @@ -8644,6 +8695,10 @@ BOOL hb_xvmAlwaysBegin( void ) /* remove all items placed on the stack after BEGIN code */ hb_stackRemove( hb_stackGetRecoverBase() ); +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "hb_xvmAlwaysBegin", NULL, NULL ); +#endif /* store and reset action */ hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.request = hb_stackGetActionRequest(); hb_stackSetActionRequest( 0 ); @@ -8663,6 +8718,11 @@ BOOL hb_xvmAlwaysEnd( void ) /* remove all items placed on the stack after ALWAYSBEGIN code */ hb_stackRemove( hb_stackGetRecoverBase() ); + +#if defined( _HB_RECOVER_DEBUG ) + if( hb_stackItemFromTop( HB_RECOVER_STATE )->type != HB_IT_RECOVER ) + hb_errInternal( HB_EI_ERRUNRECOV, "hb_xvmAlwaysEnd", NULL, NULL ); +#endif /* restore previous recovery base address */ hb_stackSetRecoverBase( hb_stackItemFromTop( HB_RECOVER_STATE )->item.asRecover.base ); uiCurrAction = hb_stackGetActionRequest();