String concatenation metaprotocol Was: String concatenation tweaks
Remi Forax
forax at univ-mlv.fr
Fri Jun 5 09:12:29 UTC 2015
Aleksey,
there is something that the current translation doesn't do,
with by example, "foo" + a + "bar", javac know that "foo" and "bar" are
constants but doesn't propagate this information to the bootstrap
method, the invokedynamic call will use 3 arguments instead of one ; the
only the value of 'a' can changed and the two others can be sent as
bootstrap constants.
This would help the dynamic part because calculating the length of "foo"
and "bar" will be done once in the bootstrap method instead of being
done each time. In the example below, if 'a' is a primitive type, it can
be a huge win because the total length of the buffer becomes a constant.
All we need for that is to define a way to describe how the arguments of
the call and the bootstrap arguments are interleaved. Let say we use a
String with 'A' for classical argument and 'B' for a bootstrap argument,
in that case "foo" + a + "bar" interleaving is "BAB", so the
corresponding bytecode is
iload 0 // load a
invokedynamic "BAB" (I)Ljava/lang/String ["foo", "bar"]
And 'null' is a special case because it's a compiler constant but it can
not be encoded as a constant pool constant,
the best IMO is to consider that instead of trying to encode 'null',
it's better to encode "null" as a String.
cheers,
Rémi
On 05/21/2015 02:15 PM, Aleksey Shipilev wrote:
> On 05/15/2015 01:06 AM, Aleksey Shipilev wrote:
>> It actually does not seem that scary. javac changes seem minimal,
>> because they basically mirror [1] what is already done for current
>> String concat and lambda desugaring.
>>
>> JDK side of changes is not too scary as well [2], and it readily lends
>> itself to different implementation strategies, including precomputing
>> the argument lengths. I realized too late it does not check for argument
>> nullity properly, but this is a proof-of-concept patch anyway.
> Updated patches:
> http://cr.openjdk.java.net/~shade/scratch/string-concat-indy/
>
> INNER_SIZED strategy is enabled by default for everything except
> java.base. This, and a few other touchups make the patched JDK to build
> cleanly, and pass the most java/lang and java/util jtreg tests (there
> are seem to be some failures in Indify-based tests).
>
> Thanks,
> -Aleksey
>
>
>
More information about the compiler-dev
mailing list