diff -r d382dacfd73f -r 62b289bb87c7 rt/emul/mini/src/main/java/java/lang/Integer.java --- a/rt/emul/mini/src/main/java/java/lang/Integer.java Tue Feb 26 16:54:16 2013 +0100 +++ b/rt/emul/mini/src/main/java/java/lang/Integer.java Tue Jul 07 07:46:52 2015 +0200 @@ -442,71 +442,17 @@ * @exception NumberFormatException if the {@code String} * does not contain a parsable {@code int}. */ + public static int parseInt(String s, int radix) + throws NumberFormatException { + double val = parseInt0(s, radix); + if (Double.isNaN(val) || s.contains(".")) { + throw new NumberFormatException("For input string: \"" + s + '\"'); + } + return (int)val; + } + @JavaScriptBody(args={"s", "radix"}, body="return parseInt(s,radix);") - public static int parseInt(String s, int radix) - throws NumberFormatException - { - /* - * WARNING: This method may be invoked early during VM initialization - * before IntegerCache is initialized. Care must be taken to not use - * the valueOf method. - */ - - if (s == null) { - throw new NumberFormatException("null"); - } - - if (radix < Character.MIN_RADIX) { - throw new NumberFormatException("radix " + radix + - " less than Character.MIN_RADIX"); - } - - if (radix > Character.MAX_RADIX) { - throw new NumberFormatException("radix " + radix + - " greater than Character.MAX_RADIX"); - } - - int result = 0; - boolean negative = false; - int i = 0, len = s.length(); - int limit = -Integer.MAX_VALUE; - int multmin; - int digit; - - if (len > 0) { - char firstChar = s.charAt(0); - if (firstChar < '0') { // Possible leading "+" or "-" - if (firstChar == '-') { - negative = true; - limit = Integer.MIN_VALUE; - } else if (firstChar != '+') - throw NumberFormatException.forInputString(s); - - if (len == 1) // Cannot have lone "+" or "-" - throw NumberFormatException.forInputString(s); - i++; - } - multmin = limit / radix; - while (i < len) { - // Accumulating negatively avoids surprises near MAX_VALUE - digit = Character.digit(s.charAt(i++),radix); - if (digit < 0) { - throw NumberFormatException.forInputString(s); - } - if (result < multmin) { - throw NumberFormatException.forInputString(s); - } - result *= radix; - if (result < limit + digit) { - throw NumberFormatException.forInputString(s); - } - result -= digit; - } - } else { - throw NumberFormatException.forInputString(s); - } - return negative ? result : -result; - } + private static native double parseInt0(String s, int radix); /** * Parses the string argument as a signed decimal integer. The