src/share/classes/java/lang/Long.java

Print this page
rev 9020 : 8030814: Long.parseUnsignedLong should throw exception on too large input
Summary: Change test for overflow of unsigned long
Reviewed-by: TBD
Contributed-by: Dmitry Nadezhin <dmitry.nadezhin@oracle.com>

@@ -698,11 +698,17 @@
                 int second = Character.digit(s.charAt(len - 1), radix);
                 if (second < 0) {
                     throw new NumberFormatException("Bad digit at end of " + s);
                 }
                 long result = first * radix + second;
-                if (compareUnsigned(result, first) < 0) {
+//                final int GUARD_BIT = 7;
+//                int guard = radix * (int) (first >>> (64 - GUARD_BIT));
+                int guard = radix * (int) (first >>> 57);
+//                if (guard >= (1 << GUARD_BIT) - Character.MAX_RADIX
+//                        && (guard >= (1 << GUARD_BIT) || result >= 0)) {
+                if (guard >= 128 ||
+                        (result >= 0 && guard >= 128 - Character.MAX_RADIX)) {
                     /*
                      * The maximum unsigned value, (2^64)-1, takes at
                      * most one more digit to represent than the
                      * maximum signed value, (2^63)-1.  Therefore,
                      * parsing (len - 1) digits will be appropriately