2006-09-04 11:40 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/include/hbexprc.c
    ! fixed bug in wrong integer negating, f.e.:
         proc main(); local i:=0; i-=-32768; ? i; return
    ! fixed PCODE generated for +=, -=, /=, *= expressions when right side
      of expression is undefined variable - it's possible that it will be
      field and we will have RT error. It fixes tt4.prg example form TODO
      file.

  * harbour/TODO
    - removed tt4.prg example from TOFIX

  * harbour/source/vm/classes.c
    ! fixed supercast message validation

  * harbour/source/vm/hvm.c
    ! fixed very bad typo in hb_vmMinus() which can cause wrong
      results when on 64-bit integer overflow
This commit is contained in:
Przemyslaw Czerpak
2006-09-04 09:40:43 +00:00
parent 7e6acbd5ff
commit a55606d726
5 changed files with 52 additions and 56 deletions

View File

@@ -8,6 +8,25 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
+ added support for executing functions with <symItem>:EXEC()
registered dynamically after creating <symItem>
* harbour/source/vm/hvm.c
* minor modification
2006-09-04 18:10 UTC+0100 Viktor Szakats (viktor.szakats syenar.hu)
* harbour/source/rtl/tlabel.prg
* harbour/source/rtl/treport.prg
! Made the logic multiplatform where it's decided whether to
add a default extension to the loaded filename.
C:\PATH.A\MYFILE didn't get the default extension while
C:\PATH\MYFILE did.
2006-09-04 11:40 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/include/hbexprc.c
! fixed bug in wrong integer negating, f.e.:
proc main(); local i:=0; i-=-32768; ? i; return
! fixed PCODE generated for +=, -=, /=, *= expressions when right side
of expression is undefined variable - it's possible that it will be
field and we will have RT error. It fixes tt4.prg example form TODO
file.

View File

@@ -264,36 +264,4 @@ Detail...: An error in the evaluated macro cause memory leak.
`-
Status...: Open.
***
Assign to: <nobody>
Detail...: When compiled with Harbour and then run it gives BASE/1003
Variable not exist: NUM1 with CA-Clipper it works as it
recognize NUM1 as FIELD.
--tt4.prg--
PROC MAIN()
LOCAL nRecs, nTotal
DBCREATE( "TEST", { { "NUM1", "N", 5, 0 } } )
USE TEST
FOR nRecs := 1 TO 10
APPEND BLANK
REPLACE NUM1 WITH RECN()
NEXT nRecs
nTotal := 0
GO TOP
WHILE .NOT. EOF()
nTotal += NUM1 // It fail here
SKIP
ENDDO
QOUT( nTotal )
RETURN
-----------
bld_b32 tt4 /n
tt4
Status...: Open.
=======================================================================

View File

@@ -173,7 +173,8 @@ void hb_compExprPushOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
{
int iScope = hb_compVariableScope( pSelf->value.asOperator.pLeft->value.asSymbol );
if( ! ( iScope == HB_VS_LOCAL_FIELD || iScope == HB_VS_GLOBAL_FIELD ) )
if( iScope != HB_VS_LOCAL_FIELD && iScope != HB_VS_GLOBAL_FIELD &&
iScope != HB_VS_UNDECLARED )
{
HB_EXPRTYPE iType = pSelf->value.asOperator.pRight->ExprType;
@@ -186,18 +187,21 @@ void hb_compExprPushOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
if( iLocal < 256 && hb_compExprIsInteger( pSelf->value.asOperator.pRight ) )
{
int iIncrement = ( short ) pSelf->value.asOperator.pRight->value.asNum.lVal;
short iIncrement = ( short ) pSelf->value.asOperator.pRight->value.asNum.lVal;
if( bOpEq == HB_P_MINUS )
if( bOpEq != HB_P_MINUS || iIncrement >= -INT16_MAX )
{
iIncrement = -iIncrement;
if( bOpEq == HB_P_MINUS )
{
iIncrement = -iIncrement;
}
hb_compGenPCode4( HB_P_LOCALNEARADDINT, ( BYTE ) iLocal, HB_LOBYTE( iIncrement ), HB_HIBYTE( iIncrement ), ( BOOL ) 0 );
HB_EXPR_USE( pSelf->value.asOperator.pLeft, HB_EA_PUSH_PCODE );
return;
}
hb_compGenPCode4( HB_P_LOCALNEARADDINT, ( BYTE ) iLocal, HB_LOBYTE( iIncrement ), HB_HIBYTE( iIncrement ), ( BOOL ) 0 );
HB_EXPR_USE( pSelf->value.asOperator.pLeft, HB_EA_PUSH_PCODE );
return;
}
}
/* NOTE: direct type change */
@@ -227,7 +231,8 @@ void hb_compExprPushOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
{
int iScope = hb_compVariableScope( pSelf->value.asOperator.pRight->value.asSymbol );
if( ! ( iScope == HB_VS_LOCAL_FIELD || iScope == HB_VS_GLOBAL_FIELD ) )
if( iScope != HB_VS_LOCAL_FIELD && iScope != HB_VS_GLOBAL_FIELD &&
iScope != HB_VS_UNDECLARED )
{
/* NOTE: direct type change */
pSelf->value.asOperator.pLeft->ExprType = HB_ET_VARREF;
@@ -306,7 +311,8 @@ void hb_compExprUseOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
{
int iScope = hb_compVariableScope( pSelf->value.asOperator.pLeft->value.asSymbol );
if( ! ( iScope == HB_VS_LOCAL_FIELD || iScope == HB_VS_GLOBAL_FIELD ) )
if( iScope != HB_VS_LOCAL_FIELD && iScope != HB_VS_GLOBAL_FIELD &&
iScope != HB_VS_UNDECLARED )
{
HB_EXPRTYPE iType = pSelf->value.asOperator.pRight->ExprType, iOldType;
@@ -321,14 +327,16 @@ void hb_compExprUseOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
{
short iIncrement = ( short ) pSelf->value.asOperator.pRight->value.asNum.lVal;
if( bOpEq == HB_P_MINUS )
if( bOpEq != HB_P_MINUS || iIncrement >= -INT16_MAX )
{
iIncrement = -iIncrement;
if( bOpEq == HB_P_MINUS )
{
iIncrement = -iIncrement;
}
hb_compGenPCode4( HB_P_LOCALNEARADDINT, ( BYTE ) iLocal, HB_LOBYTE( iIncrement ), HB_HIBYTE( iIncrement ), ( BOOL ) 0 );
return;
}
hb_compGenPCode4( HB_P_LOCALNEARADDINT, ( BYTE ) iLocal, HB_LOBYTE( iIncrement ), HB_HIBYTE( iIncrement ), ( BOOL ) 0 );
return;
}
}
/* NOTE: direct type change */
@@ -360,7 +368,8 @@ void hb_compExprUseOperEq( HB_EXPR_PTR pSelf, BYTE bOpEq )
{
int iScope = hb_compVariableScope( pSelf->value.asOperator.pRight->value.asSymbol );
if( ! ( iScope == HB_VS_LOCAL_FIELD || iScope == HB_VS_GLOBAL_FIELD ) )
if( iScope != HB_VS_LOCAL_FIELD && iScope != HB_VS_GLOBAL_FIELD &&
iScope != HB_VS_UNDECLARED )
{
/* NOTE: direct type change */
iOldType = pSelf->value.asOperator.pLeft->ExprType;

View File

@@ -1530,7 +1530,7 @@ HB_FUNC( __CLSADDMSG )
uiIndex = ( USHORT ) hb_parni( 3 );
uiSprClass = ( USHORT ) hb_parni( 5 );
fOK = uiSprClass && uiSprClass <= s_uiClasses &&
uiIndex < pClass->uiDatas;
(uiIndex == 0 || uiIndex < pClass->uiDatas);
break;
case HB_OO_MSG_DATA:

View File

@@ -1961,7 +1961,7 @@ static void hb_vmNegate( void )
if( HB_IS_INTEGER( pItem ) )
{
#if -HB_INT_MAX > HB_INT_MIN
if ( pItem->item.asInteger.value < -HB_INT_MAX )
if( pItem->item.asInteger.value < -HB_INT_MAX )
{
#if HB_LONG_MAX > HB_INT_MAX
HB_LONG lValue = ( HB_LONG ) pItem->item.asInteger.value;
@@ -1985,7 +1985,7 @@ static void hb_vmNegate( void )
else if( HB_IS_LONG( pItem ) )
{
#if -HB_LONG_MAX > HB_LONG_MIN
if ( pItem->item.asLong.value < -HB_LONG_MAX )
if( pItem->item.asLong.value < -HB_LONG_MAX )
{
double dValue = ( double ) pItem->item.asLong.value;
pItem->type = HB_IT_DOUBLE;
@@ -2027,7 +2027,7 @@ static void hb_vmPlus( HB_ITEM_PTR pResult, HB_ITEM_PTR pItem1, HB_ITEM_PTR pIte
HB_LONG lNumber2 = HB_ITEM_GET_NUMINTRAW( pItem2 );
HB_LONG lResult = lNumber1 + lNumber2;
if ( lNumber2 >= 0 ? lResult >= lNumber1 : lResult < lNumber1 )
if( lNumber2 >= 0 ? lResult >= lNumber1 : lResult < lNumber1 )
{
hb_itemPutNInt( pResult, lResult );
}
@@ -2120,7 +2120,7 @@ static void hb_vmMinus( HB_ITEM_PTR pResult, HB_ITEM_PTR pItem1, HB_ITEM_PTR pIt
HB_LONG lNumber2 = HB_ITEM_GET_NUMINTRAW( pItem2 );
HB_LONG lResult = lNumber1 - lNumber2;
if ( lNumber2 >= 0 ? lResult >= lNumber1 : lResult < lNumber1 )
if( lNumber2 <= 0 ? lResult >= lNumber1 : lResult < lNumber1 )
{
hb_itemPutNInt( pResult, lResult );
}