From af16c7e60e28eca95117dbee34f4c537015d1d43 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Wed, 17 Nov 1999 10:05:58 +0000 Subject: [PATCH] 19991117-10:51 GMT+1 Victor Szel --- harbour/ChangeLog | 7 +++++++ harbour/source/compiler/expropt.c | 24 ++++++++++++------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 3f64f66372..2bcdae4d25 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,10 @@ +19991117-10:51 GMT+1 Victor Szel + * source/compiler/expropt.c + ! Fixed the compile-time calculation of numeric operations with results + larger than LONG. + % Compile-time calculation of numeric operations - Removed doubled + calculation code. + 19991117-03:15 GMT+1 Victor Szel * source/vm/hvm.c ! Added error substitution to hb_vmForTest(), now some more RTL_TESTs pass. diff --git a/harbour/source/compiler/expropt.c b/harbour/source/compiler/expropt.c index 09c6de5188..69cb0c1ead 100644 --- a/harbour/source/compiler/expropt.c +++ b/harbour/source/compiler/expropt.c @@ -3911,11 +3911,11 @@ static HB_EXPR_FUNC( hb_compExprUsePlus ) { case HB_ET_LONG: { - double dVal = pLeft->value.asNum.lVal + pRight->value.asNum.lVal; + double dVal = ( double ) pLeft->value.asNum.lVal + ( double ) pRight->value.asNum.lVal; - if( ( double )LONG_MIN <= dVal && dVal <= ( double )LONG_MAX ) + if( ( double ) LONG_MIN <= dVal && dVal <= ( double ) LONG_MAX ) { - pSelf->value.asNum.lVal = pLeft->value.asNum.lVal + pRight->value.asNum.lVal; + pSelf->value.asNum.lVal = ( long ) dVal; pSelf->value.asNum.bDec = 0; pSelf->value.asNum.NumType = HB_ET_LONG; } @@ -4058,11 +4058,11 @@ static HB_EXPR_FUNC( hb_compExprUseMinus ) { case HB_ET_LONG: { - double dVal = pLeft->value.asNum.lVal - pRight->value.asNum.lVal; + double dVal = ( double ) pLeft->value.asNum.lVal - ( double ) pRight->value.asNum.lVal; - if( ( double )LONG_MIN <= dVal && dVal <= ( double )LONG_MAX ) + if( ( double ) LONG_MIN <= dVal && dVal <= ( double ) LONG_MAX ) { - pSelf->value.asNum.lVal = pLeft->value.asNum.lVal - pRight->value.asNum.lVal; + pSelf->value.asNum.lVal = ( long ) dVal; pSelf->value.asNum.bDec = 0; pSelf->value.asNum.NumType = HB_ET_LONG; } @@ -4185,11 +4185,11 @@ static HB_EXPR_FUNC( hb_compExprUseMult ) { case HB_ET_LONG: { - double dVal = pLeft->value.asNum.lVal * pRight->value.asNum.lVal; + double dVal = ( double ) pLeft->value.asNum.lVal * ( double ) pRight->value.asNum.lVal; - if( ( double )LONG_MIN <= dVal && dVal <= ( double )LONG_MAX ) + if( ( double ) LONG_MIN <= dVal && dVal <= ( double ) LONG_MAX ) { - pSelf->value.asNum.lVal = pLeft->value.asNum.lVal * pRight->value.asNum.lVal; + pSelf->value.asNum.lVal = ( long ) dVal; pSelf->value.asNum.bDec = 0; pSelf->value.asNum.NumType = HB_ET_LONG; } @@ -4306,12 +4306,12 @@ static HB_EXPR_FUNC( hb_compExprUseDiv ) case HB_ET_LONG: { if( pRight->value.asNum.lVal ) - dVal = ( double )pLeft->value.asNum.lVal / ( double )pRight->value.asNum.lVal; + dVal = ( double ) pLeft->value.asNum.lVal / ( double ) pRight->value.asNum.lVal; if( fmod( dVal, 1.0 ) == 0.0 ) { /* Return integer results as long */ - pSelf->value.asNum.lVal = dVal; + pSelf->value.asNum.lVal = ( long ) dVal; pSelf->value.asNum.bDec = 0; pSelf->value.asNum.NumType = HB_ET_LONG; } @@ -4444,7 +4444,7 @@ static HB_EXPR_FUNC( hb_compExprUseMod ) else break; /* QUESTION: should we generate a warning or error here */ - if( ( double )LONG_MIN <= dVal && dVal <= ( double )LONG_MAX ) + if( ( double ) LONG_MIN <= dVal && dVal <= ( double ) LONG_MAX ) { pSelf->value.asNum.lVal = ( long ) dVal; pSelf->value.asNum.bDec = 0;