2007-11-23 01:19 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/include/hbvm.h
  * harbour/source/vm/hvm.c
    * make hb_vmPushNumInt() public function

  * harbour/contrib/gtwvg/wvtcore.c
    ! fixed hb_wvt_gtDlgProcMLess() and hb_wvt_gtDlgProcModal()
      - fixed GPF when codeblock are used
      - use hb_vmPushNumInt() instead of hb_vmPushLong() to push
        handles and numbers with potentially unknown size.
        I still suggest to use pointers ITEMs instead of converting
        handles to numbers but I'm leaving such modifications to library
        authors - using hb_vmPushNumInt() is a workaround for striping
        highest 32 bit from handles by hb_vmPushLong() in XP64 
      - use hb_vmRequestReenter() / hb_vmRequestRestore() to avoid crash
        when function/codeblock is executed during HVM has been serving
        an exception (f.e. BREAK/QUIT/RETURN)
This commit is contained in:
Przemyslaw Czerpak
2007-11-23 00:20:02 +00:00
parent fc1a660dca
commit 7f59b345ce
4 changed files with 113 additions and 145 deletions

View File

@@ -8,6 +8,24 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2007-11-23 01:19 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbvm.h
* harbour/source/vm/hvm.c
* make hb_vmPushNumInt() public function
* harbour/contrib/gtwvg/wvtcore.c
! fixed hb_wvt_gtDlgProcMLess() and hb_wvt_gtDlgProcModal()
- fixed GPF when codeblock are used
- use hb_vmPushNumInt() instead of hb_vmPushLong() to push
handles and numbers with potentially unknown size.
I still suggest to use pointers ITEMs instead of converting
handles to numbers but I'm leaving such modifications to library
authors - using hb_vmPushNumInt() is a workaround for striping
highest 32 bit from handles by hb_vmPushLong() in XP64
- use hb_vmRequestReenter() / hb_vmRequestRestore() to avoid crash
when function/codeblock is executed during HVM has been serving
an exception (f.e. BREAK/QUIT/RETURN)
2007-11-22 18:33 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/source/rtl/gtwvt/gtwvt.c
* declared two functions

View File

@@ -122,9 +122,8 @@ HB_FUNC( WVT_CORE )
HB_EXPORT BOOL CALLBACK hb_wvt_gtDlgProcMLess( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
int iIndex, iType;
long int bReturn = FALSE ;
long int lReturn = 0;
PHB_ITEM pFunc = NULL;
PHB_DYNS pDynSym;
iType = (int) NULL;
@@ -145,92 +144,69 @@ HB_EXPORT BOOL CALLBACK hb_wvt_gtDlgProcMLess( HWND hDlg, UINT message, WPARAM w
{
switch ( iType )
{
case 1: // Function Name
{
pDynSym = ( PHB_DYNS ) pFunc;
hb_vmPushState();
hb_vmPushSymbol( hb_dynsymSymbol( pDynSym ) );
hb_vmPushNil();
hb_vmPushLong( ( ULONG ) hDlg );
hb_vmPushLong( ( UINT ) message );
hb_vmPushLong( ( ULONG ) wParam );
hb_vmPushLong( ( ULONG ) lParam );
hb_vmDo( 4 );
//bReturn = hb_itemGetNL( hb_stackReturnItem() );
bReturn = hb_parnl( -1 );
hb_vmPopState();
break;
}
case 2: // Block
{
/* eval the codeblock */
//if ( _s->pFunc[ iIndex ]->type == HB_IT_BLOCK )
if ( hb_itemType( _s->pFunc[ iIndex ] ) == HB_IT_BLOCK )
case 1: /* Function Name */
if( hb_vmRequestReenter() )
{
PHB_ITEM hihDlg, himessage, hiwParam, hilParam;
PHB_ITEM pReturn;
hb_vmPushDynSym( ( PHB_DYNS ) pFunc );
hb_vmPushNil();
hb_vmPushNumInt( ( HB_LONG ) ( HB_PTRDIFF ) hDlg );
hb_vmPushNumInt( message );
hb_vmPushNumInt( wParam );
hb_vmPushNumInt( lParam );
hb_vmDo( 4 );
lReturn = hb_parnl( -1 );
hb_vmRequestRestore();
}
break;
//hihDlg.type = HB_IT_NIL;
hb_itemPutNL( &hihDlg, (ULONG) hDlg );
//himessage.type = HB_IT_NIL;
hb_itemPutNL( &himessage, (ULONG) message );
//hiwParam.type = HB_IT_NIL;
hb_itemPutNL( &hiwParam, (ULONG) wParam );
//hilParam.type = HB_IT_NIL;
hb_itemPutNL( &hilParam, (ULONG) lParam );
pReturn = hb_itemDo( (PHB_ITEM) _s->pFunc[ iIndex ], 4, &hihDlg, &himessage, &hiwParam, &hilParam );
bReturn = hb_itemGetNL( pReturn );
hb_itemRelease( pReturn );
case 2: /* Block */
/* eval the codeblock */
if ( HB_IS_BLOCK( pFunc ) )
{
if( hb_vmRequestReenter() )
{
hb_vmPushEvalSym();
hb_vmPush( _s->pFunc[ iIndex ] );
hb_vmPushNumInt( ( HB_LONG ) ( HB_PTRDIFF ) hDlg );
hb_vmPushNumInt( message );
hb_vmPushNumInt( wParam );
hb_vmPushNumInt( lParam );
hb_vmSend( 4 );
lReturn = hb_parnl( -1 );
hb_vmRequestRestore();
}
}
else
{
//internal error: missing codeblock
/* TODO: internal error: missing codeblock */
}
break;
}
}
}
switch( message )
{
case WM_COMMAND:
{
switch( LOWORD( wParam ) )
{
case IDOK:
{
DestroyWindow( hDlg );
bReturn = TRUE;
}
break;
lReturn = 1;
break;
case IDCANCEL:
{
DestroyWindow( hDlg );
bReturn = FALSE;
}
break;
lReturn = 0;
break;
}
}
break;
break;
case WM_CLOSE:
{
DestroyWindow( hDlg );
bReturn = FALSE;
}
break;
lReturn = 0;
break;
case WM_NCDESTROY:
{
if ( _s->pFunc[ iIndex ] != NULL && _s->iType[ iIndex ] == 2 )
{
hb_itemRelease( ( PHB_ITEM ) _s->pFunc[ iIndex ] );
@@ -238,12 +214,11 @@ HB_EXPORT BOOL CALLBACK hb_wvt_gtDlgProcMLess( HWND hDlg, UINT message, WPARAM w
_s->hDlgModeless[ iIndex ] = NULL;
_s->pFunc[ iIndex ] = NULL;
_s->iType[ iIndex ] = (int) NULL;
bReturn = FALSE;
}
break;
lReturn = 0;
break;
}
return bReturn;
return lReturn;
}
//-------------------------------------------------------------------//
@@ -251,16 +226,15 @@ HB_EXPORT BOOL CALLBACK hb_wvt_gtDlgProcMLess( HWND hDlg, UINT message, WPARAM w
HB_EXPORT BOOL CALLBACK hb_wvt_gtDlgProcModal( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
int iIndex, iType;
long int bReturn = FALSE ;
long int lReturn = 0;
PHB_ITEM pFunc = NULL;
PHB_DYNS pDynSym;
int iFirst = ( int ) lParam;
if ( iFirst > 0 && iFirst <= WVT_DLGMD_MAX )
{
_s->hDlgModal[ iFirst-1 ] = hDlg ;
SendMessage( hDlg, WM_INITDIALOG, 0, 0 );
return ( bReturn );
return lReturn;
}
iType = ( int ) NULL;
@@ -282,105 +256,81 @@ HB_EXPORT BOOL CALLBACK hb_wvt_gtDlgProcModal( HWND hDlg, UINT message, WPARAM w
{
switch ( iType )
{
case 1: // Function Name
{
pDynSym = ( PHB_DYNS ) pFunc;
hb_vmPushState();
hb_vmPushSymbol( hb_dynsymSymbol( pDynSym ) );
hb_vmPushNil();
hb_vmPushLong( ( ULONG ) hDlg );
hb_vmPushLong( ( UINT ) message );
hb_vmPushLong( ( ULONG ) wParam );
hb_vmPushLong( ( ULONG ) lParam );
hb_vmDo( 4 );
//bReturn = hb_itemGetNL( hb_stackReturnItem() );
bReturn = hb_parnl( -1 );
hb_vmPopState();
break;
}
case 2: // Block
{
/* eval the codeblock */
if ( hb_itemType( _s->pFuncModal[ iIndex ] ) == HB_IT_BLOCK )
case 1: /* Function Name */
if( hb_vmRequestReenter() )
{
PHB_ITEM hihDlg, himessage, hiwParam, hilParam;
PHB_ITEM pReturn;
hb_vmPushDynSym( ( PHB_DYNS ) pFunc );
hb_vmPushNil();
hb_vmPushNumInt( ( HB_LONG ) ( HB_PTRDIFF ) hDlg );
hb_vmPushNumInt( message );
hb_vmPushNumInt( wParam );
hb_vmPushNumInt( lParam );
hb_vmDo( 4 );
lReturn = hb_parnl( -1 );
hb_vmRequestRestore();
}
break;
//hihDlg.type = HB_IT_NIL;
hb_itemPutNL( &hihDlg, (ULONG) hDlg );
//himessage.type = HB_IT_NIL;
hb_itemPutNL( &himessage, (ULONG) message );
//hiwParam.type = HB_IT_NIL;
hb_itemPutNL( &hiwParam, (ULONG) wParam );
//hilParam.type = HB_IT_NIL;
hb_itemPutNL( &hilParam, (ULONG) lParam );
pReturn = hb_itemDo( (PHB_ITEM) _s->pFuncModal[ iIndex ], 4, &hihDlg, &himessage, &hiwParam, &hilParam );
bReturn = hb_itemGetNL( pReturn );
hb_itemRelease( pReturn );
case 2: /* Block */
/* eval the codeblock */
if ( HB_IS_BLOCK( pFunc ) )
{
if( hb_vmRequestReenter() )
{
hb_vmPushEvalSym();
hb_vmPush( _s->pFunc[ iIndex ] );
hb_vmPushNumInt( ( HB_LONG ) ( HB_PTRDIFF ) hDlg );
hb_vmPushNumInt( message );
hb_vmPushNumInt( wParam );
hb_vmPushNumInt( lParam );
hb_vmSend( 4 );
lReturn = hb_parnl( -1 );
hb_vmRequestRestore();
}
}
else
{
//internal error: missing codeblock
/* TODO: internal error: missing codeblock */
}
break;
}
}
}
switch( message )
{
case WM_COMMAND:
{
switch( LOWORD( wParam ) )
{
case IDOK:
{
EndDialog( hDlg, IDOK );
bReturn = TRUE;
}
break;
lReturn = 1;
break;
case IDCANCEL:
{
EndDialog( hDlg, IDCANCEL );
bReturn = FALSE;
}
break;
lReturn = 0;
break;
}
}
break;
break;
case WM_CLOSE:
{
EndDialog( hDlg, IDCANCEL );
bReturn = FALSE;
}
break;
lReturn = 0;
break;
case WM_NCDESTROY:
{
if ( _s->pFuncModal[ iIndex ] != NULL && _s->iTypeModal[ iIndex ] == 2 )
{
hb_itemRelease( ( PHB_ITEM ) _s->pFuncModal[ iIndex ] );
}
_s->hDlgModal[ iIndex ] = NULL;
_s->pFuncModal[ iIndex ] = NULL;
_s->iTypeModal[ iIndex ] = ( int ) NULL;
bReturn = FALSE;
}
break;
_s->hDlgModal[ iIndex ] = NULL;
_s->pFuncModal[ iIndex ] = NULL;
_s->iTypeModal[ iIndex ] = ( int ) NULL;
lReturn = 0;
break;
}
return bReturn;
return lReturn;
}
//-------------------------------------------------------------------//

View File

@@ -135,6 +135,7 @@ extern HB_EXPORT void hb_vmPushNumber( double dNumber, int iDec ); /* pushes
extern HB_EXPORT void hb_vmPushInteger( int iNumber ); /* pushes a integer number onto the stack */
extern HB_EXPORT void hb_vmPushLong( long lNumber ); /* pushes a long number onto the stack */
extern HB_EXPORT void hb_vmPushDouble( double lNumber, int iDec ); /* pushes a double number onto the stack */
extern HB_EXPORT void hb_vmPushNumInt( HB_LONG lNumber ); /* pushes a number on to the stack and decides if it is integer or HB_LONG */
extern HB_EXPORT void hb_vmPushLogical( BOOL bValue ); /* pushes a logical value onto the stack */
extern HB_EXPORT void hb_vmPushString( const char * szText, ULONG length ); /* pushes a string on to the stack */
extern HB_EXPORT void hb_vmPushStringPcode( const char * szText, ULONG length ); /* pushes a string from pcode on to the stack */

View File

@@ -193,7 +193,6 @@ static void hb_vmPushIntegerConst( int iNumber ); /* Pushes a int constant (
#else
static void hb_vmPushLongConst( long lNumber ); /* Pushes a long constant (pcode) */
#endif
static void hb_vmPushNumInt( HB_LONG lNumber ); /* pushes a number on to the stack and decides if it is integer or HB_LONG */
static void hb_vmPushNumType( double dNumber, int iDec, int iType1, int iType2 ); /* pushes a number on to the stack and decides if it is integer, long or double */
static void hb_vmPushStatic( USHORT uiStatic ); /* pushes the containts of a static onto the stack */
static void hb_vmPushStaticByRef( USHORT uiStatic ); /* pushes a static by refrence onto the stack */
@@ -5412,14 +5411,6 @@ static int hb_vmCalcIntWidth( HB_LONG lNumber )
return iWidth;
}
static void hb_vmPushNumInt( HB_LONG lNumber )
{
if( HB_LIM_INT( lNumber ) )
hb_vmPushInteger( ( int ) lNumber );
else
hb_vmPushHBLong( lNumber );
}
HB_EXPORT void hb_vmPushInteger( int iNumber )
{
PHB_ITEM pItem = hb_stackAllocItem();
@@ -5497,6 +5488,14 @@ static void hb_vmPushLongLongConst( LONGLONG llNumber )
}
#endif
HB_EXPORT void hb_vmPushNumInt( HB_LONG lNumber )
{
if( HB_LIM_INT( lNumber ) )
hb_vmPushInteger( ( int ) lNumber );
else
hb_vmPushHBLong( lNumber );
}
HB_EXPORT void hb_vmPushDouble( double dNumber, int iDec )
{
PHB_ITEM pItem = hb_stackAllocItem();