RFR: 8222852: Reduce String concat combinator tree shapes by folding constants into prependers
Peter Levart
peter.levart at gmail.com
Fri Apr 26 09:08:26 UTC 2019
Hi Claes,
I wonder if it is even possible to create a test that would do something
like the following:
String s = ...
String s2 = s + "const1" + "const2" + s;
...since javac concatenates consecutive constants into a single
constant. So this actually becomes:
String s2 = s + "const1const2" + s;
...in bytecode.
The branch of code in the StringConcatFactory for constant != null:
1591 case TAG_CONST: {
1592 String constantValue = el.getValue();
1593 initialLengthCoder =
(long)mixer(String.class).invoke(initialLengthCoder, constantValue);
1594 // fold sequential constants into one
1595 constant = (constant != null) ? constant +
constantValue : constantValue;
1596 break;
1597 }
...will therefore never actually be executed in programs compiled with
javac. Other bytecode compilers or generators might trigger this though.
So what do you think? Is it important to test this or is it "obviously"
correct?
Regards, Peter
On 4/25/19 2:20 PM, Claes Redestad wrote:
> Hi,
>
> sorry for the delay, got distracted by other things. Switch back:
>
> http://cr.openjdk.java.net/~redestad/8222852/open.01/
>
> Passed a sanity tier1 run.
>
> /Claes
>
> On 2019-04-23 13:27, Aleksey Shipilev wrote:
>> I'd keep the switch in the second loop, like this:
>>
>> for (RecipeElement el : recipe.getElements()) {
>> switch (el.getTag()) {
>> case TAG_ARG:
>> ...
>> break;
>> case TAG_CONST:
>> // Constants are already handled in the code above.
>> break;
>> default:
>> throw new StringConcatException("Unhandled tag: " +
>> el.getTag());
>> }
>> }
More information about the core-libs-dev
mailing list