On Thu, 12 Aug 2021 21:26:08 GMT, SkateScout 
<github.com+919349+skatesc...@openjdk.org> wrote:

> Hi,
> i check Long.java line 1301...1311 and i am not sure if this code is really 
> good.
> 
>     1. If negative  is false the whole part ends with two times the same 
> substring and this implies the same error.
> 
>     2. If negative is true and we get an error than we can throw the error 
> without an second parse step or we can use the substring from the first round.
> 
>     3. Also as mentioned above the parseLong(text,radix) should be changed to 
> parseLong(seq, beginIndex, endIndex, radix)
>        this would avoid at least in the positive case the substring at all.
> 
>     4. The same points are with Integer as well.
>        try {
>        result = parseLong(nm.substring(index), radix);
>        result = negative ? -result : result;
>        } catch (NumberFormatException e) {
>        // If number is Long.MIN_VALUE, we'll end up here. The next line
>        // handles this case, and causes any genuine format error to be
>        // rethrown.
>        String constant = negative ? ("-" + nm.substring(index))
>        : nm.substring(index);
>        result = parseLong(constant, radix);
>        }

The pre-existing logic here is iffy, but I think it is correct. 

For Integer: If negative is true, then parsing "2147483648" (Integer.MAX_VALUE 
+ 1) would throw, be reparsed as "-2147483648" and then be accepted as 
Integer.MIN_VALUE. This is the only case that should be non-exceptional, but it 
should also be exceedingly rare in practice. For negative values it improves 
the error messages a bit to add the "-" and reparse. 

Improving the catch clauses with `parseLong(CharSequence, int, int, int)` and 
adding an `if (!negative) throw e` case to the catch could theoretically 
improve performance of parsing the MIN_VALUE edge case and repeated decoding of 
malformed positive numbers, but these are rare or exceptional cases where we 
should favor simplicity over optimal performance

-------------

PR: https://git.openjdk.java.net/jdk/pull/5068

Reply via email to