diff --git a/ChangeLog.txt b/ChangeLog.txt index bd85f180e2..14b3295fdd 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -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 = + operation leaves result on HVM stack. + * optimize 'var = 0', 'var = 1' and 'var = ' + 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 diff --git a/contrib/hbgs/core.c b/contrib/hbgs/core.c index 6ec8ed3463..d4f4f36832 100644 --- a/contrib/hbgs/core.c +++ b/contrib/hbgs/core.c @@ -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 ); } } diff --git a/src/compiler/hbopt.c b/src/compiler/hbopt.c index 80ac67f758..602ebb68f4 100644 --- a/src/compiler/hbopt.c +++ b/src/compiler/hbopt.c @@ -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 ) ) diff --git a/src/rtl/setkey.c b/src/rtl/setkey.c index b1c94a6e62..821548fd1f 100644 --- a/src/rtl/setkey.c +++ b/src/rtl/setkey.c @@ -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; } } }