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:
Przemysław Czerpak
2017-03-20 12:28:11 +01:00
parent d58d0f4ca3
commit 5008371567
4 changed files with 157 additions and 89 deletions

View File

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

View File

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

View File

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

View File

@@ -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;
}
}
}