# HG changeset patch # User xlu # Date 1245530046 25200 # Node ID a42e2cc2aaa57e98f3062508dde73f47409b135f # Parent 5c9886498f31c3f39984d99dba97a2cbf4c35ec3 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 diff -r 5c9886498f31 -r a42e2cc2aaa5 jdk/src/share/classes/java/math/BigDecimal.java --- a/jdk/src/share/classes/java/math/BigDecimal.java Fri Jun 19 14:39:06 2009 -0700 +++ b/jdk/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(); diff -r 5c9886498f31 -r a42e2cc2aaa5 jdk/test/java/math/BigDecimal/MultiplyTests.java --- a/jdk/test/java/math/BigDecimal/MultiplyTests.java Fri Jun 19 14:39:06 2009 -0700 +++ b/jdk/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; }