2017-03-20 12:28 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* contrib/hbgs/core.c
! fixed to build with new GS versions - fix borrowed from Viktor's
branch
* src/rtl/setkey.c
+ in hb_SetKey() and hb_SetKeyCheck() if extended keycode is passed
and does not have associated action check also for actions bound
with corresponding standard keycode
! honor user parameters passed by reference to hb_SetKeyCheck()
! fixed hardcoded 4 parameter limit in hb_SetKeyCheck()
* src/compiler/hbopt.c
! fixed 'assigned but not used' warning detection - it should not
mark initial HB_P_PUSHLOCALREF PCODE as used when next <op>=
operation leaves result on HVM stack.
* optimize 'var <op>= 0', 'var <op>= 1' and 'var <op>= <timestamp>'
operations
* small cleanup
This commit is contained in:
@@ -10,6 +10,26 @@
|
||||
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
|
||||
*/
|
||||
|
||||
2017-03-20 12:28 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
|
||||
* contrib/hbgs/core.c
|
||||
! fixed to build with new GS versions - fix borrowed from Viktor's
|
||||
branch
|
||||
|
||||
* src/rtl/setkey.c
|
||||
+ in hb_SetKey() and hb_SetKeyCheck() if extended keycode is passed
|
||||
and does not have associated action check also for actions bound
|
||||
with corresponding standard keycode
|
||||
! honor user parameters passed by reference to hb_SetKeyCheck()
|
||||
! fixed hardcoded 4 parameter limit in hb_SetKeyCheck()
|
||||
|
||||
* src/compiler/hbopt.c
|
||||
! fixed 'assigned but not used' warning detection - it should not
|
||||
mark initial HB_P_PUSHLOCALREF PCODE as used when next <op>=
|
||||
operation leaves result on HVM stack.
|
||||
* optimize 'var <op>= 0', 'var <op>= 1' and 'var <op>= <timestamp>'
|
||||
operations
|
||||
* small cleanup
|
||||
|
||||
2017-03-20 00:58 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
|
||||
* src/compile/hbopt.c
|
||||
! fixed 'assigned but not used' error detection for 'var op= val' code
|
||||
|
||||
@@ -55,6 +55,11 @@
|
||||
#include "ierrors.h"
|
||||
#include "iapi.h"
|
||||
|
||||
/* Workaround to build with pre-9.18 versions */
|
||||
#if defined( e_Quit )
|
||||
#define gs_error_Quit e_Quit
|
||||
#endif
|
||||
|
||||
HB_FUNC( HB_GS )
|
||||
{
|
||||
HB_BOOL bResult = HB_FALSE;
|
||||
@@ -82,12 +87,12 @@ HB_FUNC( HB_GS )
|
||||
code = gsapi_init_with_args( minst, gsargc, gsargv );
|
||||
code1 = gsapi_exit( minst );
|
||||
|
||||
if( code == 0 || code == e_Quit )
|
||||
if( code == 0 || code == gs_error_Quit )
|
||||
code = code1;
|
||||
|
||||
gsapi_delete_instance( minst );
|
||||
|
||||
bResult = ( code == 0 || code == e_Quit );
|
||||
bResult = ( code == 0 || code == gs_error_Quit );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1111,7 +1111,8 @@ static void hb_compPCodeEnumScanLocals( PHB_HFUNC pFunc, PHB_OPT_LOCAL pLocals )
|
||||
HB_BYTE bCodeNext = pFunc->pCode[ nPosNext ];
|
||||
HB_BYTE bCodeNext2 = pFunc->pCode[ nPosNext + hb_compPCodeSize( pFunc, nPosNext ) ];
|
||||
|
||||
if( ( bCodeNext == HB_P_PUSHBLOCK ||
|
||||
if( ( bCodeNext == HB_P_PUSHTIMESTAMP ||
|
||||
bCodeNext == HB_P_PUSHBLOCK ||
|
||||
bCodeNext == HB_P_PUSHBLOCKSHORT ||
|
||||
bCodeNext == HB_P_PUSHFIELD ||
|
||||
bCodeNext == HB_P_PUSHBYTE ||
|
||||
@@ -1127,6 +1128,8 @@ static void hb_compPCodeEnumScanLocals( PHB_HFUNC pFunc, PHB_OPT_LOCAL pLocals )
|
||||
bCodeNext == HB_P_PUSHSTR ||
|
||||
bCodeNext == HB_P_PUSHSTRSHORT ||
|
||||
bCodeNext == HB_P_PUSHVARIABLE ||
|
||||
bCodeNext == HB_P_ONE ||
|
||||
bCodeNext == HB_P_ZERO ||
|
||||
bCodeNext == HB_P_PUSHLONGLONG ||
|
||||
bCodeNext == HB_P_PUSHDATE ||
|
||||
bCodeNext == HB_P_PUSHSTRHIDDEN ||
|
||||
@@ -1137,16 +1140,16 @@ static void hb_compPCodeEnumScanLocals( PHB_HFUNC pFunc, PHB_OPT_LOCAL pLocals )
|
||||
bCodeNext2 == HB_P_MINUSEQPOP ||
|
||||
bCodeNext2 == HB_P_MULTEQPOP ||
|
||||
bCodeNext2 == HB_P_DIVEQPOP ||
|
||||
bCodeNext2 == HB_P_MODEQPOP ||
|
||||
bCodeNext2 == HB_P_EXPEQPOP ||
|
||||
bCodeNext2 == HB_P_DECEQPOP ||
|
||||
bCodeNext2 == HB_P_INCEQPOP ||
|
||||
bCodeNext2 == HB_P_PLUSEQ ||
|
||||
bCodeNext2 == HB_P_MINUSEQ ||
|
||||
bCodeNext2 == HB_P_MULTEQ ||
|
||||
bCodeNext2 == HB_P_DIVEQ ||
|
||||
bCodeNext2 == HB_P_MODEQPOP ||
|
||||
bCodeNext2 == HB_P_EXPEQPOP ||
|
||||
bCodeNext2 == HB_P_MODEQ ||
|
||||
bCodeNext2 == HB_P_EXPEQ ||
|
||||
bCodeNext2 == HB_P_DECEQPOP ||
|
||||
bCodeNext2 == HB_P_INCEQPOP ||
|
||||
bCodeNext2 == HB_P_DECEQ ||
|
||||
bCodeNext2 == HB_P_INCEQ ) )
|
||||
{
|
||||
@@ -1372,71 +1375,80 @@ static void hb_compPCodeEnumAssignedUnused( HB_COMP_DECL, PHB_HFUNC pFunc, PHB_O
|
||||
|
||||
while( nPos < pFunc->nPCodePos )
|
||||
{
|
||||
HB_BOOL fCheck;
|
||||
int iCheck = 0;
|
||||
|
||||
/* skip pop NIL (var := NIL), to allow force garbage collection */
|
||||
fCheck = ( pFunc->pCode[ nPos ] == HB_P_POPLOCAL ||
|
||||
pFunc->pCode[ nPos ] == HB_P_POPLOCALNEAR ) &&
|
||||
! ( nPos > 0 && pFunc->pCode[ nLastPos ] == HB_P_PUSHNIL );
|
||||
|
||||
if( ! fCheck && ( pFunc->pCode[ nPos ] == HB_P_LOCALDEC ||
|
||||
pFunc->pCode[ nPos ] == HB_P_LOCALINC ||
|
||||
pFunc->pCode[ nPos ] == HB_P_LOCALADDINT ||
|
||||
pFunc->pCode[ nPos ] == HB_P_LOCALNEARADDINT ) )
|
||||
if( pFunc->pCode[ nPos ] == HB_P_POPLOCAL ||
|
||||
pFunc->pCode[ nPos ] == HB_P_POPLOCALNEAR )
|
||||
{
|
||||
fCheck = HB_TRUE;
|
||||
/* skip pop NIL (var := NIL), to allow force garbage collection */
|
||||
if( nPos == 0 || pFunc->pCode[ nLastPos ] != HB_P_PUSHNIL )
|
||||
iCheck = 1;
|
||||
}
|
||||
|
||||
if( ! fCheck && pFunc->pCode[ nPos ] == HB_P_PUSHLOCALREF )
|
||||
else if( pFunc->pCode[ nPos ] == HB_P_LOCALDEC ||
|
||||
pFunc->pCode[ nPos ] == HB_P_LOCALINC ||
|
||||
pFunc->pCode[ nPos ] == HB_P_LOCALADDINT ||
|
||||
pFunc->pCode[ nPos ] == HB_P_LOCALNEARADDINT )
|
||||
{
|
||||
iCheck = 1;
|
||||
}
|
||||
else if( pFunc->pCode[ nPos ] == HB_P_PUSHLOCALREF )
|
||||
{
|
||||
HB_SIZE nPosNext = nPos + hb_compPCodeSize( pFunc, nPos );
|
||||
HB_BYTE bCodeNext = pFunc->pCode[ nPosNext ];
|
||||
HB_BYTE bCodeNext2 = pFunc->pCode[ nPosNext + hb_compPCodeSize( pFunc, nPosNext ) ];
|
||||
|
||||
if( ( bCodeNext == HB_P_PUSHBLOCK ||
|
||||
bCodeNext == HB_P_PUSHBLOCKSHORT ||
|
||||
bCodeNext == HB_P_PUSHFIELD ||
|
||||
bCodeNext == HB_P_PUSHBYTE ||
|
||||
bCodeNext == HB_P_PUSHINT ||
|
||||
bCodeNext == HB_P_PUSHLOCAL ||
|
||||
bCodeNext == HB_P_PUSHLOCALNEAR ||
|
||||
bCodeNext == HB_P_PUSHLONG ||
|
||||
bCodeNext == HB_P_PUSHMEMVAR ||
|
||||
bCodeNext == HB_P_PUSHNIL ||
|
||||
bCodeNext == HB_P_PUSHDOUBLE ||
|
||||
bCodeNext == HB_P_PUSHSELF ||
|
||||
bCodeNext == HB_P_PUSHSTATIC ||
|
||||
bCodeNext == HB_P_PUSHSTR ||
|
||||
bCodeNext == HB_P_PUSHSTRSHORT ||
|
||||
bCodeNext == HB_P_PUSHVARIABLE ||
|
||||
bCodeNext == HB_P_PUSHLONGLONG ||
|
||||
bCodeNext == HB_P_PUSHDATE ||
|
||||
bCodeNext == HB_P_PUSHSTRHIDDEN ||
|
||||
bCodeNext == HB_P_PUSHBLOCKLARGE ||
|
||||
bCodeNext == HB_P_PUSHSTRLARGE ||
|
||||
bCodeNext == HB_P_LOCALINCPUSH ) &&
|
||||
( bCodeNext2 == HB_P_PLUSEQPOP ||
|
||||
bCodeNext2 == HB_P_MINUSEQPOP ||
|
||||
bCodeNext2 == HB_P_MULTEQPOP ||
|
||||
bCodeNext2 == HB_P_DIVEQPOP ||
|
||||
bCodeNext2 == HB_P_PLUSEQ ||
|
||||
bCodeNext2 == HB_P_MINUSEQ ||
|
||||
bCodeNext2 == HB_P_MULTEQ ||
|
||||
bCodeNext2 == HB_P_DIVEQ ||
|
||||
bCodeNext2 == HB_P_MODEQPOP ||
|
||||
bCodeNext2 == HB_P_EXPEQPOP ||
|
||||
bCodeNext2 == HB_P_MODEQ ||
|
||||
bCodeNext2 == HB_P_EXPEQ ||
|
||||
bCodeNext2 == HB_P_DECEQPOP ||
|
||||
bCodeNext2 == HB_P_INCEQPOP ||
|
||||
bCodeNext2 == HB_P_DECEQ ||
|
||||
bCodeNext2 == HB_P_INCEQ ) )
|
||||
switch( pFunc->pCode[ nPosNext ] )
|
||||
{
|
||||
fCheck = HB_TRUE;
|
||||
case HB_P_PUSHTIMESTAMP:
|
||||
case HB_P_PUSHBLOCK:
|
||||
case HB_P_PUSHBLOCKSHORT:
|
||||
case HB_P_PUSHFIELD:
|
||||
case HB_P_PUSHBYTE:
|
||||
case HB_P_PUSHINT:
|
||||
case HB_P_PUSHLOCAL:
|
||||
case HB_P_PUSHLOCALNEAR:
|
||||
case HB_P_PUSHLONG:
|
||||
case HB_P_PUSHMEMVAR:
|
||||
case HB_P_PUSHNIL:
|
||||
case HB_P_PUSHDOUBLE:
|
||||
case HB_P_PUSHSELF:
|
||||
case HB_P_PUSHSTATIC:
|
||||
case HB_P_PUSHSTR:
|
||||
case HB_P_PUSHSTRSHORT:
|
||||
case HB_P_PUSHVARIABLE:
|
||||
case HB_P_ONE:
|
||||
case HB_P_ZERO:
|
||||
case HB_P_PUSHLONGLONG:
|
||||
case HB_P_PUSHDATE:
|
||||
case HB_P_PUSHSTRHIDDEN:
|
||||
case HB_P_PUSHBLOCKLARGE:
|
||||
case HB_P_PUSHSTRLARGE:
|
||||
case HB_P_LOCALINCPUSH:
|
||||
switch( pFunc->pCode[ nPosNext + hb_compPCodeSize( pFunc, nPosNext ) ] )
|
||||
{
|
||||
case HB_P_PLUSEQPOP:
|
||||
case HB_P_MINUSEQPOP:
|
||||
case HB_P_MULTEQPOP:
|
||||
case HB_P_DIVEQPOP:
|
||||
case HB_P_MODEQPOP:
|
||||
case HB_P_EXPEQPOP:
|
||||
case HB_P_DECEQPOP:
|
||||
case HB_P_INCEQPOP:
|
||||
iCheck = 1;
|
||||
break;
|
||||
case HB_P_PLUSEQ:
|
||||
case HB_P_MINUSEQ:
|
||||
case HB_P_MULTEQ:
|
||||
case HB_P_DIVEQ:
|
||||
case HB_P_MODEQ:
|
||||
case HB_P_EXPEQ:
|
||||
case HB_P_DECEQ:
|
||||
case HB_P_INCEQ:
|
||||
iCheck = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( fCheck && ( isLocal = hb_compLocalGetNumber( &pFunc->pCode[ nPos ] ) ) > ( HB_SHORT ) pFunc->wParamCount )
|
||||
if( iCheck != 0 && ( isLocal = hb_compLocalGetNumber( &pFunc->pCode[ nPos ] ) ) > ( HB_SHORT ) pFunc->wParamCount )
|
||||
{
|
||||
PHB_HVAR pVar = pFunc->pLocals;
|
||||
HB_SHORT is;
|
||||
@@ -1452,6 +1464,8 @@ static void hb_compPCodeEnumAssignedUnused( HB_COMP_DECL, PHB_HFUNC pFunc, PHB_O
|
||||
pLocals[ isLocal - 1 ].bFlags != ( OPT_LOCAL_FLAG_PUSH | OPT_LOCAL_FLAG_POPSELF ) )
|
||||
{
|
||||
memset( pMap, 0, pFunc->nPCodePos );
|
||||
if( iCheck == 1 )
|
||||
pMap[ nPos ] = 1;
|
||||
|
||||
if( ! hb_compPCodeTraceAssignedUnused( pFunc, nPos + hb_compPCodeSize( pFunc, nPos ),
|
||||
pMap, isLocal, HB_FALSE ) )
|
||||
|
||||
@@ -90,6 +90,19 @@ static void hb_setkeyRelease( void * cargo )
|
||||
|
||||
static HB_TSD_NEW( s_skData, sizeof( HB_SK_DATA ), NULL, hb_setkeyRelease );
|
||||
|
||||
static HB_BOOL sk_testActive( PHB_ITEM pIsActive, int iKeyCode )
|
||||
{
|
||||
if( pIsActive )
|
||||
{
|
||||
hb_vmPushEvalSym();
|
||||
hb_vmPush( pIsActive );
|
||||
hb_vmPushInteger( iKeyCode );
|
||||
hb_vmSend( 1 );
|
||||
return hb_parldef( -1, HB_TRUE );
|
||||
}
|
||||
return HB_TRUE;
|
||||
}
|
||||
|
||||
static PHB_SETKEY sk_findkey( int iKeyCode, PHB_SETKEY sk_list,
|
||||
PHB_SETKEY * sk_list_end )
|
||||
{
|
||||
@@ -144,9 +157,8 @@ static void sk_add( PHB_SETKEY * sk_list_ptr, HB_BOOL bReturn,
|
||||
|
||||
hb_itemRelease( sk_list_tmp->pAction );
|
||||
if( sk_list_tmp->pIsActive )
|
||||
{
|
||||
hb_itemRelease( sk_list_tmp->pIsActive );
|
||||
}
|
||||
|
||||
/* Set the new values or free the entry */
|
||||
|
||||
if( pAction )
|
||||
@@ -175,9 +187,9 @@ static void sk_add( PHB_SETKEY * sk_list_ptr, HB_BOOL bReturn,
|
||||
|
||||
HB_FUNC( SETKEY )
|
||||
{
|
||||
PHB_ITEM pKeyCode = hb_param( 1, HB_IT_NUMERIC );
|
||||
int iKeyCode = hb_parni( 1 );
|
||||
|
||||
if( pKeyCode )
|
||||
if( iKeyCode != 0 )
|
||||
{
|
||||
PHB_SK_DATA sk_data = ( PHB_SK_DATA ) hb_stackGetTSD( &s_skData );
|
||||
|
||||
@@ -187,7 +199,7 @@ HB_FUNC( SETKEY )
|
||||
PHB_SETKEY sk_list_tmp, sk_list_end;
|
||||
|
||||
/* sk_list_end is not used in this context */
|
||||
sk_list_tmp = sk_findkey( hb_itemGetNI( pKeyCode ), sk_data->sk_list, &sk_list_end );
|
||||
sk_list_tmp = sk_findkey( iKeyCode, sk_data->sk_list, &sk_list_end );
|
||||
|
||||
if( sk_list_tmp )
|
||||
hb_itemReturn( sk_list_tmp->pAction );
|
||||
@@ -195,7 +207,7 @@ HB_FUNC( SETKEY )
|
||||
else
|
||||
{
|
||||
/* Set a SETKEY value */
|
||||
sk_add( &sk_data->sk_list, HB_TRUE, hb_itemGetNI( pKeyCode ),
|
||||
sk_add( &sk_data->sk_list, HB_TRUE, iKeyCode,
|
||||
hb_param( 2, HB_IT_EVALITEM ), NULL );
|
||||
}
|
||||
}
|
||||
@@ -203,9 +215,9 @@ HB_FUNC( SETKEY )
|
||||
|
||||
HB_FUNC( HB_SETKEY )
|
||||
{
|
||||
PHB_ITEM pKeyCode = hb_param( 1, HB_IT_NUMERIC );
|
||||
int iKeyCode = hb_parni( 1 );
|
||||
|
||||
if( pKeyCode )
|
||||
if( iKeyCode != 0 )
|
||||
{
|
||||
PHB_SK_DATA sk_data = ( PHB_SK_DATA ) hb_stackGetTSD( &s_skData );
|
||||
|
||||
@@ -215,20 +227,28 @@ HB_FUNC( HB_SETKEY )
|
||||
PHB_SETKEY sk_list_tmp, sk_list_end;
|
||||
|
||||
/* sk_list_end is not used in this context */
|
||||
sk_list_tmp = sk_findkey( hb_itemGetNI( pKeyCode ), sk_data->sk_list, &sk_list_end );
|
||||
sk_list_tmp = sk_findkey( iKeyCode, sk_data->sk_list, &sk_list_end );
|
||||
if( sk_list_tmp == NULL )
|
||||
{
|
||||
int iKeyStd = hb_inkeyKeyStd( iKeyCode );
|
||||
|
||||
if( iKeyStd != iKeyCode )
|
||||
{
|
||||
sk_list_tmp = sk_findkey( iKeyStd, sk_data->sk_list, &sk_list_end );
|
||||
iKeyCode = iKeyStd;
|
||||
}
|
||||
}
|
||||
|
||||
if( sk_list_tmp )
|
||||
{
|
||||
PHB_ITEM pIsActiveResults = sk_list_tmp->pIsActive ? hb_vmEvalBlockV( sk_list_tmp->pIsActive, 1, pKeyCode ) : NULL;
|
||||
|
||||
if( pIsActiveResults == NULL || ! HB_IS_LOGICAL( pIsActiveResults ) || hb_itemGetL( pIsActiveResults ) )
|
||||
if( sk_testActive( sk_list_tmp->pIsActive, iKeyCode ) )
|
||||
hb_itemReturn( sk_list_tmp->pAction );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Set a SETKEY value */
|
||||
sk_add( &sk_data->sk_list, HB_TRUE, hb_itemGetNI( pKeyCode ),
|
||||
sk_add( &sk_data->sk_list, HB_TRUE, iKeyCode,
|
||||
hb_param( 2, HB_IT_EVALITEM ), hb_param( 3, HB_IT_EVALITEM ) );
|
||||
}
|
||||
}
|
||||
@@ -331,32 +351,41 @@ HB_FUNC( HB_SETKEYSAVE )
|
||||
|
||||
HB_FUNC( HB_SETKEYCHECK )
|
||||
{
|
||||
PHB_ITEM pKeyCode = hb_param( 1, HB_IT_NUMERIC );
|
||||
HB_BOOL bIsKeySet = HB_FALSE;
|
||||
int iKeyCode = hb_parni( 1 );
|
||||
|
||||
if( pKeyCode )
|
||||
if( iKeyCode != 0 )
|
||||
{
|
||||
PHB_SK_DATA sk_data = ( PHB_SK_DATA ) hb_stackGetTSD( &s_skData );
|
||||
PHB_SETKEY sk_list_tmp, sk_list_end;
|
||||
|
||||
/* sk_list_end is not used in this context */
|
||||
sk_list_tmp = sk_findkey( hb_itemGetNI( pKeyCode ), sk_data->sk_list, &sk_list_end );
|
||||
sk_list_tmp = sk_findkey( iKeyCode, sk_data->sk_list, &sk_list_end );
|
||||
if( sk_list_tmp == NULL )
|
||||
{
|
||||
int iKeyStd = hb_inkeyKeyStd( iKeyCode );
|
||||
|
||||
if( iKeyStd != iKeyCode )
|
||||
{
|
||||
sk_list_tmp = sk_findkey( iKeyStd, sk_data->sk_list, &sk_list_end );
|
||||
iKeyCode = iKeyStd;
|
||||
}
|
||||
}
|
||||
|
||||
if( sk_list_tmp )
|
||||
{
|
||||
PHB_ITEM pIsActiveResults = sk_list_tmp->pIsActive ? hb_vmEvalBlockV( sk_list_tmp->pIsActive, 1, pKeyCode ) : NULL;
|
||||
|
||||
if( pIsActiveResults == NULL || ! HB_IS_LOGICAL( pIsActiveResults ) || hb_itemGetL( pIsActiveResults ) )
|
||||
if( sk_testActive( sk_list_tmp->pIsActive, iKeyCode ) )
|
||||
{
|
||||
bIsKeySet = HB_TRUE;
|
||||
HB_USHORT uiPCount = ( HB_USHORT ) hb_pcount(), uiParam;
|
||||
|
||||
switch( hb_pcount() )
|
||||
{
|
||||
case 1: hb_vmEvalBlockV( sk_list_tmp->pAction, 1, pKeyCode ); break;
|
||||
case 2: hb_vmEvalBlockV( sk_list_tmp->pAction, 2, hb_param( 2, HB_IT_ANY ), pKeyCode ); break;
|
||||
case 3: hb_vmEvalBlockV( sk_list_tmp->pAction, 3, hb_param( 2, HB_IT_ANY ), hb_param( 3, HB_IT_ANY ), pKeyCode ); break;
|
||||
default: hb_vmEvalBlockV( sk_list_tmp->pAction, 4, hb_param( 2, HB_IT_ANY ), hb_param( 3, HB_IT_ANY ), hb_param( 4, HB_IT_ANY ), pKeyCode ); break;
|
||||
}
|
||||
hb_vmPushEvalSym();
|
||||
hb_vmPush( sk_list_tmp->pAction );
|
||||
for( uiParam = 2; uiParam <= uiPCount; ++uiParam )
|
||||
hb_vmPush( hb_stackItemFromBase( uiParam ) );
|
||||
hb_vmPushInteger( iKeyCode );
|
||||
hb_vmSend( uiPCount );
|
||||
|
||||
bIsKeySet = HB_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user