diff --git a/ChangeLog.txt b/ChangeLog.txt index 8a3d7b78cc..9cf20181c2 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,25 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2014-12-05 01:33 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * src/common/hbffind.c + * src/common/hbfsapi.c + * src/rtl/filebuf.c + * src/rtl/fssize.c + * contrib/hbmzip/mzip.c + * contrib/xhb/filestat.c + ! typo in comment - thanks to Viktor + + * include/hbexprb.c + * small code reorganization + + * include/hbvmpub.h + * src/vm/hvm.c + % use HB_VM_PUSHNIL() macro + ! generate RTE for code like: + LOCAL aVar[ 10, -1 ] + (Cl*pper compatible) + 2014-12-05 00:13 UTC+0100 Viktor Szakats (vszakats users.noreply.github.com) * src/common/hbver.c * synced copyright with fork to be in sync with merged sources diff --git a/contrib/hbmzip/mzip.c b/contrib/hbmzip/mzip.c index e91dda6c92..cc3380c932 100644 --- a/contrib/hbmzip/mzip.c +++ b/contrib/hbmzip/mzip.c @@ -97,7 +97,7 @@ #if defined( __USE_LARGEFILE64 ) /* * The macro: __USE_LARGEFILE64 is set when _LARGEFILE64_SOURCE is - * define and effectively enables lseek64/flock64/ftruncate64 functions + * defined and effectively enables lseek64/flock64/ftruncate64 functions * on 32bit machines. */ #define HB_USE_LARGEFILE64 diff --git a/contrib/xhb/filestat.c b/contrib/xhb/filestat.c index 925268eea0..fc3768f18e 100644 --- a/contrib/xhb/filestat.c +++ b/contrib/xhb/filestat.c @@ -74,7 +74,7 @@ #if defined( __USE_LARGEFILE64 ) /* * The macro: __USE_LARGEFILE64 is set when _LARGEFILE64_SOURCE is - * define and effectively enables lseek64/flock64/ftruncate64 functions + * defined and effectively enables lseek64/flock64/ftruncate64 functions * on 32bit machines. */ #define HB_USE_LARGEFILE64 diff --git a/include/hbexprb.c b/include/hbexprb.c index 3ea168783d..1cfee8f1c9 100644 --- a/include/hbexprb.c +++ b/include/hbexprb.c @@ -2109,14 +2109,22 @@ static HB_EXPR_FUNC( hb_compExprUseFunCall ) HB_BOOL fArgsList = HB_FALSE; HB_USHORT usCount = 0; + /* NOTE: pParms will be NULL in 'DO procname' (if there is + * no WITH keyword) + */ + if( pSelf->value.asFunCall.pParms ) + { + usCount = ( HB_USHORT ) hb_compExprParamListCheck( HB_COMP_PARAM, pSelf->value.asFunCall.pParms ); + fArgsList = pSelf->value.asFunCall.pParms->ExprType == HB_ET_MACROARGLIST; + } + if( pSelf->value.asFunCall.pFunName->ExprType == HB_ET_FUNNAME ) { - if( pSelf->value.asFunCall.pFunName->value.asSymbol.funcid == HB_F_ARRAYTOPARAMS ) + if( ! fArgsList ) { - usCount = ( HB_USHORT ) hb_compExprParamListCheck( HB_COMP_PARAM, pSelf->value.asFunCall.pParms ); - if( usCount == 1 && - ( pSelf->value.asFunCall.pFunName->value.asSymbol.flags & HB_FN_MULTIARG ) != 0 && - pSelf->value.asFunCall.pParms->ExprType != HB_ET_MACROARGLIST ) + if( pSelf->value.asFunCall.pFunName->value.asSymbol.funcid == HB_F_ARRAYTOPARAMS && + usCount == 1 && + ( pSelf->value.asFunCall.pFunName->value.asSymbol.flags & HB_FN_MULTIARG ) != 0 ) { HB_EXPR_USE( pSelf->value.asFunCall.pParms, HB_EA_PUSH_PCODE ); HB_GEN_FUNC1( PCode1, HB_P_PUSHAPARAMS ); @@ -2132,16 +2140,8 @@ static HB_EXPR_FUNC( hb_compExprUseFunCall ) HB_GEN_FUNC1( PCode1, HB_P_PUSHNIL ); } - /* NOTE: pParms will be NULL in 'DO procname' (if there is - * no WITH keyword) - */ - if( pSelf->value.asFunCall.pParms ) - { - usCount = ( HB_USHORT ) hb_compExprParamListCheck( HB_COMP_PARAM, pSelf->value.asFunCall.pParms ); - fArgsList = pSelf->value.asFunCall.pParms->ExprType == HB_ET_MACROARGLIST; - if( usCount ) - HB_EXPR_USE( pSelf->value.asFunCall.pParms, HB_EA_PUSH_PCODE ); - } + if( usCount ) + HB_EXPR_USE( pSelf->value.asFunCall.pParms, HB_EA_PUSH_PCODE ); if( fArgsList ) { diff --git a/include/hbvmpub.h b/include/hbvmpub.h index 9f2111bd4e..298092af7e 100644 --- a/include/hbvmpub.h +++ b/include/hbvmpub.h @@ -66,6 +66,7 @@ struct _HB_SYMB; # define HB_ITEM_TYPE( p ) ( HB_ITEM_TYPERAW( p ) & ~ HB_IT_DEFAULT ) # define HB_OBJ_CLASS( p ) ( ( p )->item.asArray.value->uiClass ) # define HB_ARRAY_OBJ( p ) ( ( p )->item.asArray.value->uiClass != 0 ) +# define HB_VM_PUSHNIL() do { hb_stackAllocItem()->type = HB_IT_NIL; } while( 0 ) # define HB_ITEM_GET_NUMINTRAW( p ) ( HB_IS_INTEGER( p ) ? \ ( HB_MAXINT ) (p)->item.asInteger.value : \ diff --git a/src/common/hbffind.c b/src/common/hbffind.c index ecf8e4aa87..2dfcb05589 100644 --- a/src/common/hbffind.c +++ b/src/common/hbffind.c @@ -178,7 +178,7 @@ #if defined( __USE_LARGEFILE64 ) /* * The macro: __USE_LARGEFILE64 is set when _LARGEFILE64_SOURCE is - * define and effectively enables lseek64/flock64/ftruncate64 functions + * defined and effectively enables lseek64/flock64/ftruncate64 functions * on 32bit machines. */ #define HB_USE_LARGEFILE64 diff --git a/src/common/hbfsapi.c b/src/common/hbfsapi.c index bff4c06b09..034118ec29 100644 --- a/src/common/hbfsapi.c +++ b/src/common/hbfsapi.c @@ -81,7 +81,7 @@ #if defined( __USE_LARGEFILE64 ) /* * The macro: __USE_LARGEFILE64 is set when _LARGEFILE64_SOURCE is - * define and effectively enables lseek64/flock64/ftruncate64 functions + * defined and effectively enables lseek64/flock64/ftruncate64 functions * on 32bit machines. */ #define HB_USE_LARGEFILE64 diff --git a/src/rtl/filebuf.c b/src/rtl/filebuf.c index e937fc56a5..81074c93ef 100644 --- a/src/rtl/filebuf.c +++ b/src/rtl/filebuf.c @@ -70,7 +70,7 @@ #if defined( __USE_LARGEFILE64 ) /* * The macro: __USE_LARGEFILE64 is set when _LARGEFILE64_SOURCE is - * define and effectively enables lseek64/flock64/ftruncate64 functions + * defined and effectively enables lseek64/flock64/ftruncate64 functions * on 32bit machines. */ #define HB_USE_LARGEFILE64 diff --git a/src/rtl/fssize.c b/src/rtl/fssize.c index ea7d872def..7c031c1134 100644 --- a/src/rtl/fssize.c +++ b/src/rtl/fssize.c @@ -64,7 +64,7 @@ #if defined( __USE_LARGEFILE64 ) /* * The macro: __USE_LARGEFILE64 is set when _LARGEFILE64_SOURCE is - * define and effectively enables lseek64/flock64/ftruncate64 functions + * defined and effectively enables lseek64/flock64/ftruncate64 functions * on 32bit machines. */ #define HB_USE_LARGEFILE64 diff --git a/src/vm/hvm.c b/src/vm/hvm.c index 1a584b592f..3edd0c6f1b 100644 --- a/src/vm/hvm.c +++ b/src/vm/hvm.c @@ -4578,7 +4578,7 @@ void hb_vmEnumRelease( PHB_ITEM pBase, PHB_ITEM pValue ) hb_objHasOperator( pBase, HB_OO_OP_ENUMSTOP ) ) { hb_stackPushReturn(); - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_objOperatorCall( HB_OO_OP_ENUMSTOP, hb_stackItemFromTop( -1 ), pBase, NULL, NULL ); hb_stackPop(); @@ -4714,7 +4714,7 @@ static void hb_vmEnumStart( int nVars, int nDescend ) { pEnum->item.asEnum.offset = 0; pEnum->item.asEnum.valuePtr = hb_itemNew( NULL ); - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushLogical( nDescend == 0 ); hb_objOperatorCall( HB_OO_OP_ENUMSTART, hb_stackItemFromTop( -2 ), pBase, pEnumRef, hb_stackItemFromTop( -1 ) ); @@ -4796,7 +4796,7 @@ static void hb_vmEnumNext( void ) hb_objHasOperator( pBase, HB_OO_OP_ENUMSKIP ) ) { ++pEnum->item.asEnum.offset; - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushLogical( HB_FALSE ); hb_objOperatorCall( HB_OO_OP_ENUMSKIP, hb_stackItemFromTop( -2 ), pBase, pEnumRef, hb_stackItemFromTop( -1 ) ); @@ -4876,7 +4876,7 @@ static void hb_vmEnumPrev( void ) hb_objHasOperator( pBase, HB_OO_OP_ENUMSKIP ) ) { --pEnum->item.asEnum.offset; - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushLogical( HB_TRUE ); hb_objOperatorCall( HB_OO_OP_ENUMSKIP, hb_stackItemFromTop( -2 ), pBase, pEnumRef, hb_stackItemFromTop( -1 ) ); @@ -5451,10 +5451,10 @@ static void hb_vmArrayGen( HB_SIZE nElements ) /* generates an nElements Array a /* This function creates an array item using 'uiDimension' as an index * to retrieve the number of elements from the stack */ -static void hb_vmArrayNew( PHB_ITEM pArray, HB_USHORT uiDimension ) +static HB_BOOL hb_vmArrayNew( PHB_ITEM pArray, HB_USHORT uiDimension ) { HB_STACK_TLS_PRELOAD - HB_SIZE nElements; + HB_ISIZ nElements; PHB_ITEM pDim; HB_TRACE( HB_TR_DEBUG, ( "hb_vmArrayNew(%p, %hu)", pArray, uiDimension ) ); @@ -5463,11 +5463,11 @@ static void hb_vmArrayNew( PHB_ITEM pArray, HB_USHORT uiDimension ) /* use the proper type of number of elements */ if( HB_IS_INTEGER( pDim ) ) - nElements = ( HB_SIZE ) pDim->item.asInteger.value; + nElements = ( HB_ISIZ ) pDim->item.asInteger.value; else if( HB_IS_LONG( pDim ) ) - nElements = ( HB_SIZE ) pDim->item.asLong.value; + nElements = ( HB_ISIZ ) pDim->item.asLong.value; else if( HB_IS_DOUBLE( pDim ) ) - nElements = ( HB_SIZE ) pDim->item.asDouble.value; + nElements = ( HB_ISIZ ) pDim->item.asDouble.value; else /* NOTE: Clipper creates empty array if non-numeric value is * specified as dimension and stops further processing. @@ -5475,16 +5475,23 @@ static void hb_vmArrayNew( PHB_ITEM pArray, HB_USHORT uiDimension ) */ nElements = 0; - /* create an array */ - hb_arrayNew( pArray, nElements ); - - if( --uiDimension ) + if( nElements >= 0 ) { - /* call self recursively to create next dimensions - */ - while( nElements-- ) - hb_vmArrayNew( pArray->item.asArray.value->pItems + nElements, uiDimension ); + /* create an array */ + hb_arrayNew( pArray, nElements ); + + if( --uiDimension ) + { + /* call self recursively to create next dimensions */ + while( nElements-- ) + if( ! hb_vmArrayNew( pArray->item.asArray.value->pItems + nElements, uiDimension ) ) + return HB_FALSE; + } + return HB_TRUE; } + + hb_errRT_BASE( EG_BOUND, 1131, NULL, hb_langDGetErrorDesc( EG_ARRDIMENSION ), 0 ); + return HB_FALSE; } static void hb_vmArrayDim( HB_USHORT uiDimensions ) /* generates an uiDimensions Array and initialize those dimensions from the stack values */ @@ -5498,9 +5505,7 @@ static void hb_vmArrayDim( HB_USHORT uiDimensions ) /* generates an uiDimensions hb_itemMove( hb_stackItemFromTop( ( int ) ( -1 - uiDimensions ) ), hb_stackItemFromTop( -1 ) ); do - { hb_stackPop(); - } while( --uiDimensions ); } @@ -5580,7 +5585,7 @@ static void hb_vmMacroPushIndex( void ) hb_itemRelease( pIndexArray ); } else if( nIndexes == 0 ) - hb_vmPushNil(); /* It will force RT error later in array push or pop */ + HB_VM_PUSHNIL(); /* It will force RT error later in array push or pop */ } /* @@ -6266,7 +6271,7 @@ static void hb_vmDebugEntry( int nMode, int nLine, const char * szName, int nInd { case HB_DBG_MODULENAME: hb_vmPushDynSym( s_pDynsDbgEntry ); - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushInteger( HB_DBG_MODULENAME ); hb_vmPushString( szName, strlen( szName ) ); hb_vmProc( 2 ); @@ -6274,7 +6279,7 @@ static void hb_vmDebugEntry( int nMode, int nLine, const char * szName, int nInd case HB_DBG_LOCALNAME: hb_vmPushDynSym( s_pDynsDbgEntry ); - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushInteger( HB_DBG_LOCALNAME ); hb_vmPushInteger( nIndex ); hb_vmPushString( szName, strlen( szName ) ); @@ -6283,7 +6288,7 @@ static void hb_vmDebugEntry( int nMode, int nLine, const char * szName, int nInd case HB_DBG_STATICNAME: hb_vmPushDynSym( s_pDynsDbgEntry ); - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushInteger( HB_DBG_STATICNAME ); hb_vmPush( pFrame ); /* current static frame */ hb_vmPushInteger( nIndex ); /* variable index */ @@ -6293,7 +6298,7 @@ static void hb_vmDebugEntry( int nMode, int nLine, const char * szName, int nInd case HB_DBG_SHOWLINE: hb_vmPushDynSym( s_pDynsDbgEntry ); - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushInteger( HB_DBG_SHOWLINE ); hb_vmPushInteger( nLine ); hb_vmProc( 2 ); @@ -6302,7 +6307,7 @@ static void hb_vmDebugEntry( int nMode, int nLine, const char * szName, int nInd case HB_DBG_ENDPROC: hb_stackPushReturn(); /* saves the previous returned value */ hb_vmPushDynSym( s_pDynsDbgEntry ); - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushInteger( HB_DBG_ENDPROC ); hb_vmProc( 1 ); hb_stackPopReturn(); /* restores the previous returned value */ @@ -6311,14 +6316,14 @@ static void hb_vmDebugEntry( int nMode, int nLine, const char * szName, int nInd case HB_DBG_GETENTRY: /* Try to get C dbgEntry() function pointer */ hb_vmPushDynSym( s_pDynsDbgEntry ); - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushInteger( HB_DBG_GETENTRY ); hb_vmProc( 1 ); break; case HB_DBG_VMQUIT: hb_vmPushDynSym( s_pDynsDbgEntry ); - hb_vmPushNil(); + HB_VM_PUSHNIL(); hb_vmPushInteger( HB_DBG_VMQUIT ); hb_vmPushInteger( nIndex ); hb_vmProc( 2 ); @@ -6432,7 +6437,7 @@ static void hb_vmFrame( HB_USHORT usLocals, unsigned char ucParams ) { iTotal -= pBase->item.asSymbol.paramcnt; while( --iTotal >= 0 ) - hb_vmPushNil(); + HB_VM_PUSHNIL(); } #else pBase->item.asSymbol.paramdeclcnt = ucParams; @@ -6442,14 +6447,8 @@ static void hb_vmFrame( HB_USHORT usLocals, unsigned char ucParams ) iTotal = 0; iTotal += usLocals; - if( iTotal ) - { - do - { - hb_vmPushNil(); - } - while( --iTotal > 0 ); - } + while( --iTotal >= 0 ) + HB_VM_PUSHNIL(); #endif } @@ -6470,14 +6469,8 @@ static void hb_vmVFrame( HB_USHORT usLocals, unsigned char ucParams ) iTotal = 0; iTotal += usLocals; - if( iTotal ) - { - do - { - hb_vmPushNil(); - } - while( --iTotal > 0 ); - } + while( --iTotal >= 0 ) + HB_VM_PUSHNIL(); } static void hb_vmSFrame( PHB_SYMB pSym ) /* sets the statics frame for a function */