changeset 1307: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;
     }