From 3f3ad79c2466489408b403cb0a47e0c567ec903e Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 13 May 2009 21:39:35 +0000 Subject: [PATCH] 2009-05-13 23:48 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/source/vm/hvm.c ! fixed vary bad bug: possible complex variable corruption caused by missing hb_itemClear(). % minor optimization --- harbour/ChangeLog | 6 ++++++ harbour/source/vm/hvm.c | 41 +++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index fcac1265ec..0496dd2c61 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,12 @@ past entries belonging to these authors: Viktor Szakats. */ +2009-05-13 23:48 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/vm/hvm.c + ! fixed vary bad bug: possible complex variable corruption caused by + missing hb_itemClear(). + % minor optimization + 2009-05-13 16:47 UTC+0200 Viktor Szakats (harbour.01 syenar hu) * contrib/hbwin/Makefile + contrib/hbwin/legacy.c diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index b7f8c7c967..389e0fd728 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -2859,8 +2859,6 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) static void hb_vmAddInt( HB_ITEM_PTR pResult, LONG lAdd ) { - double dNewVal; - HB_TRACE(HB_TR_DEBUG, ("hb_vmAddInt(%p,%ld)", pResult, lAdd)); if( HB_IS_BYREF( pResult ) ) @@ -2877,22 +2875,24 @@ static void hb_vmAddInt( HB_ITEM_PTR pResult, LONG lAdd ) if( lAdd >= 0 ? lResult >= lVal : lResult < lVal ) { HB_ITEM_PUT_NUMINTRAW( pResult, lResult ); - return; } else { - dNewVal = ( double ) lVal + lAdd; + pResult->type = HB_IT_DOUBLE; + pResult->item.asDouble.value = ( double ) lVal + lAdd;; + pResult->item.asDouble.length = HB_DBL_LENGTH( pResult->item.asDouble.value ); + pResult->item.asDouble.decimal = 0; } } + else if( HB_IS_DOUBLE( pResult ) ) + { + pResult->item.asDouble.value += lAdd; + pResult->item.asDouble.length = HB_DBL_LENGTH( pResult->item.asDouble.value ); + } else if( HB_IS_DATETIME( pResult ) ) { pResult->type &= ~HB_IT_DEFAULT; pResult->item.asDateTime.julian += lAdd; - return; - } - else if( HB_IS_DOUBLE( pResult ) ) - { - dNewVal = pResult->item.asDouble.value + lAdd; } else if( hb_objHasOperator( pResult, HB_OO_OP_PLUS ) ) { @@ -2900,7 +2900,6 @@ static void hb_vmAddInt( HB_ITEM_PTR pResult, LONG lAdd ) hb_vmPushLong( lAdd ); hb_objOperatorCall( HB_OO_OP_PLUS, pResult, pResult, hb_stackItemFromTop( -1 ), NULL ); hb_stackPop(); - return; } else { @@ -2915,17 +2914,7 @@ static void hb_vmAddInt( HB_ITEM_PTR pResult, LONG lAdd ) hb_itemMove( pResult, pSubst ); hb_itemRelease( pSubst ); } - return; } - - if( !HB_IS_DOUBLE( pResult ) ) - { - pResult->type = HB_IT_DOUBLE; - pResult->item.asDouble.decimal = 0; - } - - pResult->item.asDouble.value = dNewVal; - pResult->item.asDouble.length = HB_DBL_LENGTH( dNewVal ); } /* NOTE: Clipper is resetting the number width on a negate. */ @@ -3071,6 +3060,9 @@ 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( HB_IS_COMPLEX( pResult ) ) + hb_itemClear( pResult ); + if( lNumber2 >= 0 ? lResult >= lNumber1 : lResult < lNumber1 ) { HB_ITEM_PUT_NUMINTRAW( pResult, lResult ); @@ -3184,6 +3176,9 @@ 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( HB_IS_COMPLEX( pResult ) ) + hb_itemClear( pResult ); + if( lNumber2 <= 0 ? lResult >= lNumber1 : lResult < lNumber1 ) { HB_ITEM_PUT_NUMINTRAW( pResult, lResult ); @@ -3214,7 +3209,11 @@ static void hb_vmMinus( HB_ITEM_PTR pResult, HB_ITEM_PTR pItem1, HB_ITEM_PTR pIt if( lTime != 0 ) hb_itemPutNDDec( pResult, hb_timeStampPackDT( lJulian, lTime ), HB_TIMEDIFF_DEC ); else + { + if( HB_IS_COMPLEX( pResult ) ) + hb_itemClear( pResult ); HB_ITEM_PUT_NUMINTRAW( pResult, lJulian ); + } } else if( HB_IS_DATETIME( pItem1 ) && HB_IS_NUMERIC( pItem2 ) ) { @@ -3286,6 +3285,8 @@ static void hb_vmMult( HB_ITEM_PTR pResult, HB_ITEM_PTR pItem1, HB_ITEM_PTR pIte { HB_LONG lResult = ( HB_LONG ) pItem1->item.asInteger.value * ( HB_LONG ) pItem2->item.asInteger.value; + if( HB_IS_COMPLEX( pResult ) ) + hb_itemClear( pResult ); HB_ITEM_PUT_NUMINTRAW( pResult, lResult ); } else