--- old/src/java.base/share/classes/java/math/BigInteger.java 2019-08-22 10:35:32.000000000 -0700 +++ new/src/java.base/share/classes/java/math/BigInteger.java 2019-08-22 10:35:31.000000000 -0700 @@ -3960,6 +3960,19 @@ return sb.toString(); } + private static void padWithZeros(StringBuilder buf, int len, int digits) { + if (digits > 0 && len < digits) { + int m = digits - len; + while (m >= NUM_ZEROS) { + buf.append(ZEROS); + m -= NUM_ZEROS; + } + if (m > 0) { + buf.append(ZEROS, 0, m); + } + } + } + /** * This method is used to perform toString when arguments are small. * A negative sign will be prepended if and only if {@code this < 0}. @@ -3973,6 +3986,7 @@ private void smallToString(int radix, StringBuilder buf, int digits) { if (signum == 0) { buf.append('0'); + padWithZeros(buf, 1, digits); return; } @@ -4006,19 +4020,8 @@ String s = Long.toString(digitGroups[numGroups-1], radix); // Pad with internal zeros if necessary. - if (digits > 0) { - int len = s.length() + (numGroups - 1)*digitsPerLong[radix]; - if (len < digits) { - int m = digits - len; - while (m >= NUM_ZEROS) { - buf.append(zeros); - m -= NUM_ZEROS; - } - if (m > 0) { - buf.append(zeros, 0, m); - } - } - } + padWithZeros(buf, s.length() + (numGroups - 1)*digitsPerLong[radix], + digits); // Put first digit group into result buffer buf.append(s); @@ -4029,7 +4032,7 @@ s = Long.toString(digitGroups[i], radix); int numLeadingZeros = digitsPerLong[radix] - s.length(); if (numLeadingZeros != 0) { - buf.append(zeros, 0, numLeadingZeros); + buf.append(ZEROS, 0, numLeadingZeros); } buf.append(s); } @@ -4114,11 +4117,11 @@ return cacheLine[exponent]; } - /* Size of zeros string. */ + /* Size of ZEROS string. */ private static int NUM_ZEROS = 63; - /* zero is a string of NUM_ZEROS consecutive zeros. */ - private static final String zeros = "0".repeat(NUM_ZEROS); + /* ZEROS is a string of NUM_ZEROS consecutive zeros. */ + private static final String ZEROS = "0".repeat(NUM_ZEROS); /** * Returns the decimal String representation of this BigInteger. --- old/test/jdk/java/math/BigInteger/BigIntegerTest.java 2019-08-22 10:35:33.000000000 -0700 +++ new/test/jdk/java/math/BigInteger/BigIntegerTest.java 2019-08-22 10:35:32.000000000 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ * @library /test/lib * @build jdk.test.lib.RandomFactory * @run main BigIntegerTest - * @bug 4181191 4161971 4227146 4194389 4823171 4624738 4812225 4837946 4026465 8074460 8078672 8032027 + * @bug 4181191 4161971 4227146 4194389 4823171 4624738 4812225 4837946 4026465 8074460 8078672 8032027 8229845 * @summary tests methods in BigInteger (use -Dseed=X to set PRNG seed) * @run main/timeout=400 BigIntegerTest * @author madbot @@ -836,6 +836,16 @@ } } + // Check value with many trailing zeros. + String val = "123456789" + "0".repeat(200); + BigInteger b = new BigInteger(val); + String s = b.toString(); + if (!val.equals(s)) { + System.err.format("Expected length %d but got %d%n", + val.length(), s.length()); + failCount++; + } + report("String Conversion", failCount); }