String concatenation metaprotocol Was: String concatenation tweaks

Remi Forax forax at univ-mlv.fr
Tue Jun 9 07:19:42 UTC 2015


On 06/07/2015 03:53 PM, Peter Levart wrote:
>
>
> On 06/07/2015 03:44 PM, Peter Levart wrote:
>>
>>
>> On 06/05/2015 11:12 AM, Remi Forax wrote:
>>> 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.
>>
>> Hm,
>>
>> You are building a DSL for string concatenation, right? What about 
>> the bootstrap parameters being a single String with all the constant 
>> strings concatenated followed by a sequence of indexes (one for each 
>> variable parameter) pointing into the constant string to where each 
>> of the parameters is to be inserted?
>>
>> Above example would look like:
>>
>> invokedynamic "foobar" (I)Ljava/lang/String; [3]
>>
>> Choosen strategy could use the passed-in constant string itself 
>> (constant pool replacement) as the source of characters when building 
>> the final concatenated string without splitting it.
>>
>> Is the limit of 255 parameters in invokedynamic including bootstrap 
>> arguments or are they separate?
>>
>> Regards, Peter
>
> One thing to watch out is that these could lead to the explosion of 
> shapes. Majority of concatenation expressions do contain at least one 
> constant string and it is rarely equal to some other constant string 
> in an equivalent concatenation expression found somewhere else...
>
> Regards, Peter

Hi Peter,
to answer to your question the limit of 255 parameters is applied twice 
(because at least for the first call through invokedynamic you have two 
calls).
When a bootstrap method is called, you can not pass more than 252 
bootstrap constants, 255 - 3 because the first 3 parameters of the 
bootstrap method are fixed by the spec. Then the invokedynamic call by 
iteself, which is a function pointer call which is also limited to 255 
parameters.

so for the string concatenation, you can not have more than 255 variable 
arguments and 252 constant arguments.

regards,
Rémi


>
>>
>>>
>>> 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
>>>>
>>>>
>>>>
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20150609/d3122d20/attachment.html>


More information about the compiler-dev mailing list