Constant descriptor resolved too soon during constant resolution?
Vicente Romero
vicente.romero at oracle.com
Tue Aug 14 00:23:06 UTC 2018
On 08/10/2018 04:25 PM, Brian Goetz wrote:
> Here's my version, similar but with a different error handling strategy:
>
> @Override public Optional<?extends ConstantDesc<ConstantDesc<T>>>
> describeConstable() {
> ConstantDesc<?>[] args =new ConstantDesc<?>[bootstrapArgs.length +5];
> args[0] =bootstrapMethod.owner().descriptorString();
> args[1] =bootstrapMethod.methodName();
> args[2] =bootstrapMethod.methodType().descriptorString();
> args[3] =constantName;
> args[4] =constantType.descriptorString();
> for (int i=0; i<bootstrapArgs.length; i++)
> args[i+5] = (ConstantDesc<?>)
> ((Constable)bootstrapArgs[i]).describeConstable().orElseThrow();
> return Optional.of(DynamicConstantDesc.of(BSM_DYNAMICCONSTANTDESC,
> ConstantDescs.DEFAULT_NAME,
> CR_DynamicConstantDesc, args));
> }
>
>
> All that said, I'm not sure that we land in the right place here; it
> is probably more work to LDC this DCD from the constant pool than to
> construct a fresh one. Its possible we want some more control knobs
> in Constable to feed back hints into the compiler as to whether or not
> constantizing is likely to be profitable, or perhaps we need to
> revisit the constantBoostrap() protocol for DCD.
>
> So, excellent bug report -- four issues in one!
yep great bug report and analysis too! getting into this after a time out
>
> - Bug -- compiler incorrectly optimizes away static initializer
> - Bug -- DynamicConstantDesc.describeConstable() needs to quote its
> static args
> - API sharp edge -- varargs version of DCD.of(...)
> - Possible API insufficiency -- constant-izing DCD may be an
> anti-optimization
I have pushed fixes to the condy-folding branch for the bugs listed above
Thanks,
Vicente
>
>
> On 8/4/2018 5:36 AM, Jorn Vernee wrote:
>>> Brian told me in an earlier email that `ConstantDesc`s should also be
>>> able to describe themselves, so I think the only missing puzzle piece
>>> here is to add a method to `ConstantDesc` for that:
>>
>> Or I guess a much simpler solution is to cast the descriptors to
>> `Constable`, since any `ConstantDesc` _should_ implement it:
>>
>> ```
>> diff -r 8ba8e64cc9c2
>> src/java.base/share/classes/java/lang/constant/DynamicConstantDesc.java
>> ---
>> a/src/java.base/share/classes/java/lang/constant/DynamicConstantDesc.java
>> Thu Jul 26 22:07:46 2018 +0200
>> +++
>> b/src/java.base/share/classes/java/lang/constant/DynamicConstantDesc.java
>> Sat Aug 04 11:29:34 2018 +0200
>> @@ -364,7 +364,21 @@
>> args[2] = bootstrapMethod.methodType().descriptorString();
>> args[3] = constantName;
>> args[4] = constantType.descriptorString();
>> - System.arraycopy(bootstrapArgs, 0, args, 5,
>> bootstrapArgs.length);
>> +
>> + int i = 5;
>> + for(ConstantDesc<?> bsArg : bootstrapArgs) {
>> + if(bsArg instanceof Constable) { // should always be true
>> + Constable<?> constable = (Constable<?>) bsArg;
>> + Optional<? extends ConstantDesc<?>> descOp =
>> constable.describeConstable();
>> + if(descOp.isPresent()) { // should always have a value
>> + args[i] = descOp.get();
>> + i++;
>> + continue;
>> + }
>> + }
>> + return Optional.empty(); // fallback just in case
>> + }
>> +
>> return
>> Optional.of(DynamicConstantDesc.of(BSM_DYNAMICCONSTANTDESC,
>> ConstantDescs.DEFAULT_NAME,
>> CR_DynamicConstantDesc, args));
>> }
>> ```
>>
>> That patch fixes the bug. It generates this BSMT entry for the
>> `DynamicConstantDesc`:
>>
>> ```
>> 0: #26 REF_invokeStatic
>> java/lang/constant/DynamicConstantDesc.constantBootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/constant/ConstantDesc;)Ljava/lang/constant/DynamicConstantDesc;
>> Method arguments:
>> #27 Ljava/lang/invoke/ConstantBootstraps;
>> #28 invoke
>> #29
>> (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/invoke/MethodHandle;[Ljava/lang/Object;)Ljava/lang/Object;
>> #30 _
>> #31 Ljava/lang/Object;
>> #32 #2:_:Ljava/lang/constant/DirectMethodHandleDesc;
>> #33 Hello,
>> #34 world!
>> ```
>>
>> Which looks right to me. It has a dynamic constant in there to
>> reconstitute the method handle descriptor.
>>
>> Sorry about my earlier email, I was a little too eager to find a
>> solution and was just kind of thinking out loud in the email and
>> probably being a little incoherent.
>>
>> Jorn
>
More information about the amber-dev
mailing list