RFR: 8186500: StringConcatFactory.makeConcatWithConstants throws AssertionError when recipe contains non-String constants

Claes Redestad claes.redestad at oracle.com
Wed Aug 23 16:26:22 UTC 2017


On 08/23/2017 06:08 PM, Aleksey Shipilev wrote:
> On 08/23/2017 01:52 PM, Claes Redestad wrote:
>> What I wasn't sure about is *when* the String.valueOf should happen, but as
>> makeConcatWithConstants specify "If necessary, the factory would call toString to
>> perform a one-time String conversion" then I think we could (should?) do this at
>> our earliest convenience, which might even be in the RecipeElement construction:
> Yes, I don't see why not.
>
>> http://cr.openjdk.java.net/~redestad/8186500/jdk.02/
> Hm!
>
>   *) Seems that due to cnst being an (autoboxed) reference, isPrimitive is always false on this path?

Ouch...

>   332             Object value = Objects.requireNonNull(cnst);
>   333             if (!value.getClass().isPrimitive()) {
>   334                 this.value = String.valueOf(cnst);
>   335             } else {
>   336                 this.value = value;
>   337             }
>
> ...so that value is always String after this?

Right. Which works, and I'm not sure we really lose much this way. 
Nothing on the
code generated by javac, only theoretical performance points on other 
code. Keep
it simple for now and just do String.valueOf in RecipeElement always?

> ...and that avoids String conversion on RecipeElement.getValue() paths completely?

We could still do String.valueOf on the other end to make sure (as this
is a no-op on Strings):

http://cr.openjdk.java.net/~redestad/8186500/jdk.03

Thanks!

/Claes


More information about the core-libs-dev mailing list