# HG changeset patch # User Jaroslav Tulach # Date 1436248012 -7200 # Node ID 62b289bb87c7b992e5b6612a7661308e00331ca7 # Parent 4185b8df1cdd7ad12a0687627b39c544a5858ae1 Throwing more of NumberFormatException when parsing numbers diff -r 4185b8df1cdd -r 62b289bb87c7 rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/IntegerArithmeticTest.java --- a/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/IntegerArithmeticTest.java Thu Jun 25 08:45:40 2015 +0200 +++ b/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/IntegerArithmeticTest.java Tue Jul 07 07:46:52 2015 +0200 @@ -148,6 +148,18 @@ @Compare public int negateMinInt() { return neg(Integer.MIN_VALUE); } + + @Compare public int parseNaN() { + return Integer.parseInt("nothing"); + } + + @Compare public int parseAsIntNaN() { + return Integer.parseInt("0.33"); + } + + @Compare public double parseDoubleNaN() { + return Double.parseDouble("nothing"); + } @Compare public int sumTwoDimensions() { int[][] matrix = createMatrix(4, 3); diff -r 4185b8df1cdd -r 62b289bb87c7 rt/emul/mini/src/main/java/java/lang/Double.java --- a/rt/emul/mini/src/main/java/java/lang/Double.java Thu Jun 25 08:45:40 2015 +0200 +++ b/rt/emul/mini/src/main/java/java/lang/Double.java Tue Jul 07 07:46:52 2015 +0200 @@ -538,10 +538,15 @@ * @see java.lang.Double#valueOf(String) * @since 1.2 */ + public static double parseDouble(String s) throws NumberFormatException { + double ret = parseDouble0(s); + if (isNaN(ret)) { + throw new NumberFormatException("For input string: \"" + s + '\"'); + } + return ret; + } @JavaScriptBody(args="s", body="return parseFloat(s);") - public static double parseDouble(String s) throws NumberFormatException { - return 0; - } + private static native double parseDouble0(String s) throws NumberFormatException; /** * Returns {@code true} if the specified number is a diff -r 4185b8df1cdd -r 62b289bb87c7 rt/emul/mini/src/main/java/java/lang/Integer.java --- a/rt/emul/mini/src/main/java/java/lang/Integer.java Thu Jun 25 08:45:40 2015 +0200 +++ 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