On Jun 26, 2014, at 6:53 PM, Claes Redestad <claes.redes...@oracle.com> wrote:

> On 06/25/2014 06:43 PM, Paul Sandoz wrote:
>> On Jun 19, 2014, at 7:39 PM, Claes Redestad <claes.redes...@oracle.com> 
>> wrote:
>>> Hi,
>>> 
>>> an updated webrev with reworked, public methods is available here:
>>> http://cr.openjdk.java.net/~redestad/8041972/webrev.8/
>>> 
>>> Reviews are yet again appreciated!
>>> 
>> I think "if (s == null)" or "Objects.requireNonNull(s)" is preferable to 
>> s.getClass(). (I am informed by those more knowledgeable than i that the 
>> latter also has poorer performance in the client compiler.)
> 
> Agreed. Using s.getClass() was necessitated to retain performance using 
> default compiler (-XX:+TieredCompilation) in the microbenchmarks I've been 
> using, and going back to testing with C1 (via means of 
> -XX:TieredStartAtLevel=1-3), it's apparent that the patch can cause a 
> regression with the client compiler that I hadn't checked.It even looks like 
> C2 alone (-XX:-TieredCompilation) suffers slightly.
> 
> Changing to Objects.requireNonNull doesn't seem to make things better, 
> though. Rather the regression seem to be due to C1 (and in some ways even C2) 
> not dealing very well with the increased degrees of freedoms in the new 
> methods, so I'm currently considering splitting apart the implementations to 
> keep the old implementations of parseX(String[, int]) untouched while 
> duplicating some code to build the new methods. Ugly, but I guess it's 
> anecessary evil here.
> 

Ok.  Perhaps it might be possible to place the specifics of constraint checking 
in public methods, but they defer to a general private method that can assume 
it's arguments are safe (or such arguments are checked by other method calls 
e.g. CS.charAt)


>> Related to the above, it might be preferable to retain the existing 
>> semantics of throwing NumberFormatException on a null string value, since 
>> someone might switch between parseInt(String ) and parseInt(String, int, 
>> int, int) and the null will then slip through the catch of 
>> NumberFormatException.
> 
> Consider Integer.parseInt(s.substring(1)) and Integer.parseInt(s, 10, 1): the 
> first would throw NullPointerException currently if s == null, while the 
> latter instead would start throwing NumberFormatException. I think we should 
> favor throwing a NPE here. I'd argue that the risk that someone changes to 
> any of the range-based alternatives when they aren't replacing a call to 
> substring or similar are slim to none.
> 

A good point.


>> 
>> You could just use IndexOutOfBoundsException for the case of beginIndex < 0 
>> and beginIndex >= endIndex and endIndex > s.length(), as is similarly the 
>> case for String.substring. Again, like previously, switching between 
>> parseInt(String, int, int) parseInt(String, int, int, int) requires no 
>> additional catching. You might want to add a comment in the code that some 
>> IndexOutOfBoundsException exceptions are implicit via calls to s.charAt (i 
>> did a double take before realizing :-) ).
> 
> Fair points. I could argue String.substring(int, int), 
> StringBuilder.append(CharSequence, int, int)etc are wrong, but I guess that 
> might be a losing battle. :-)
> 

Right, if we were starting again it might be different but i think consistency 
is important.


>> 
>> Integer.requireNonEmpty could be a static package private method on String 
>> (or perhaps even static public, it seems useful), plus i would not bother 
>> with the static import in this case.
> 
> The requireNonEmpty throws NumberFormatException to keep compatibility with 
> the old methods, so it wouldn't make much sense to add that to String.

Doh! what was i thinking. If it stays perhaps place it as a package private 
method on Number.


> If I split the parseX(String... and parseX(CharSequence... implementations as 
> I intend to, this method will be redundant though.
> 

Ok.

Paul.

Reply via email to