Mercurial > hg > openjdk > jdk7 > jdk
changeset 1309:28d4c9f5c9e9
6850606: Regression from JDK 1.6.0_12
Summary: The returned result from multiply should be constructed by using valueOf to take care of the INFLATED case.
Reviewed-by: darcy
author | xlu |
---|---|
date | Sat, 20 Jun 2009 13:34:06 -0700 |
parents | 77367060d119 |
children | b0b249933c37 |
files | src/share/classes/java/math/BigDecimal.java test/java/math/BigDecimal/MultiplyTests.java |
diffstat | 2 files changed, 15 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/math/BigDecimal.java Fri Jun 19 14:39:06 2009 -0700 +++ b/src/share/classes/java/math/BigDecimal.java Sat Jun 20 13:34:06 2009 -0700 @@ -1101,7 +1101,7 @@ // See "Hacker's Delight" section 2-12 for explanation of // the overflow test. if ( (((sum ^ xs) & (sum ^ ys))) >= 0L) // not overflowed - return new BigDecimal(null, sum, rscale, 0); + return BigDecimal.valueOf(sum, rscale); } if (fst == null) fst = BigInteger.valueOf(xs); @@ -1311,9 +1311,9 @@ * would occur since division is expensive on most CPUs. */ long product = x * y; - int prec = this.precision() + multiplicand.precision(); + long prec = this.precision() + multiplicand.precision(); if (prec < 19 || (prec < 21 && (y == 0 || product / y == x))) - return new BigDecimal(null, product, productScale, 0); + return BigDecimal.valueOf(product, productScale); return new BigDecimal(BigInteger.valueOf(x).multiply(y), INFLATED, productScale, 0); } @@ -1584,7 +1584,7 @@ return (preferredScale >= 0 && preferredScale < ZERO_SCALED_BY.length) ? ZERO_SCALED_BY[preferredScale] : - new BigDecimal(null, 0, preferredScale, 1); + BigDecimal.valueOf(0, preferredScale); else { this.inflate(); divisor.inflate();
--- a/test/java/math/BigDecimal/MultiplyTests.java Fri Jun 19 14:39:06 2009 -0700 +++ b/test/java/math/BigDecimal/MultiplyTests.java Sat Jun 20 13:34:06 2009 -0700 @@ -23,7 +23,7 @@ /* * @test - * @bug 1234567 + * @bug 6850606 * @summary Test BigDecimal.multiply(BigDecimal) * @author xlu */ @@ -72,6 +72,16 @@ } } } + + BigDecimal x = BigDecimal.valueOf(8L, 1); + BigDecimal xPower = BigDecimal.valueOf(-1L); + try { + for (int i = 0; i < 100; i++) { + xPower = xPower.multiply(x); + } + } catch (Exception ex) { + failures++; + } return failures; }