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
This commit is contained in:
Przemyslaw Czerpak
2009-07-08 18:33:12 +00:00
parent ed74e0f4b1
commit 2532ca9143
4 changed files with 84 additions and 12 deletions

View File

@@ -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.

View File

@@ -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 ) )

View File

@@ -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:

View File

@@ -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();