RFR 8233920: MethodHandles::tryFinally generates illegal bytecode for long/double return types

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Wed Nov 13 10:28:32 UTC 2019


> http://cr.openjdk.java.net/~jvernee/8233920/webrev.03/

I like how the patch shapes. Looks good.

In addition, you can encapsulate the following code into a helper method:

           if (isNonVoid) {
-             mv.visitInsn(Opcodes.POP);
+             if (isDoubleWord) {
+                 mv.visitInsn(Opcodes.POP2);
+             } else {
+                 mv.visitInsn(Opcodes.POP);
+             }
           }


     if (isNonVoid) {
       BasicType basicReturnType = BasicType.basicType(returnType);
       emitPopInsn(basicReturnType);
     }

     private void emitPopInsn(BasicType type) {
       mv.visitVarInsn(popInsnOpcode(type));
     }

     private int popInsnOpcode(BasicType type) {
        switch (type) {
          case I_TYPE: return Opcodes.POP;
          case J_TYPE: return Opcodes.POP2;
          case F_TYPE: return Opcodes.POP;
          case D_TYPE: return Opcodes.POP2;
          case L_TYPE: return Opcodes.POP;
          default:
            throw new InternalError("unknown type: " + type);
     }

Best regards,
Vladimir Ivanov

> As long as Claes is okay with it, I think we should go for that one 
> since the code/doc is simpler. I can file an RFE for examining the 
> performance of different code shapes.
> 
> Thanks,
> Jorn
> 
> On 12/11/2019 16:35, Claes Redestad wrote:
>> Interesting, and you might be right. However I think it'd be better to
>> file a follow-up to examine this (pre-existing) behavior than to 
>> expand the scope of this bug fix.
>>
>> /Claes
>>
>> On 2019-11-12 16:08, Remi Forax wrote:
>>> Hi Jorn, Claes,
>>> Is it not better to always store in a local variable, like javac 
>>> does, instead of doing the double SWAP if there is a return value of 
>>> size 1 ?
>>>
>>> Rémi
>>>
>>> ----- Mail original -----
>>>> De: "Jorn Vernee" <jorn.vernee at oracle.com>
>>>> À: "Claes Redestad" <claes.redestad at oracle.com>, "core-libs-dev" 
>>>> <core-libs-dev at openjdk.java.net>
>>>> Envoyé: Mardi 12 Novembre 2019 15:56:06
>>>> Objet: Re: RFR 8233920: MethodHandles::tryFinally generates illegal 
>>>> bytecode for long/double return types
>>>
>>>> Hi Claes,
>>>>
>>>> Thanks for the comments!
>>>>
>>>> Updated webrev: http://cr.openjdk.java.net/~jvernee/8233920/webrev.02/
>>>>
>>>> Also, thanks for sponsoring.
>>>>
>>>> Jorn
>>>>
>>>> On 12/11/2019 15:30, Claes Redestad wrote:
>>>>> Hi Jorn,
>>>>>
>>>>> good catch!
>>>>>
>>>>> Some minor stylistic concerns:
>>>>>
>>>>> "* = depends on whether the return type is a category 2 type, which
>>>>> takes up 2 stack slots."
>>>>>
>>>>> While long/double are known to use two stack slots, "category 2 type"
>>>>> isn't used much outside the specification. I'd either simplify to
>>>>> "* = depends on whether the return type takes up 1 or 2 stack slots."
>>>>> or add a reference to the definition of type categories.
>>>>>
>>>>> Similarly I think:
>>>>>
>>>>> boolean returnsCat2Type = returnType == long.class || returnType ==
>>>>> double.class;
>>>>>
>>>>> could be simplified as:
>>>>>
>>>>> boolean isDoubleWord = basicReturnType.isDoubleWord(); //
>>>>> returnsDoubleWord?
>>>>>
>>>>> In the test, is it possible to narrow the expected exception to the
>>>>> exact type being thrown (T1?) rather than Throwable?
>>>>>
>>>>> I can sponsor the patch.
>>>>>
>>>>> /Claes
>>>>>
>>>>> On 2019-11-12 12:09, Jorn Vernee wrote:
>>>>>> Hi,
>>>>>>
>>>>>> Please review the following patch that fixes handling of long/double
>>>>>> returns for the tryFinally MethodHandle combinator.
>>>>>>
>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8233920
>>>>>> Webrev: http://cr.openjdk.java.net/~jvernee/8233920/webrev.01/
>>>>>> (Testing=tier1)
>>>>>>
>>>>>> FWIW, I also added some missing close tags to the javadoc in the
>>>>>> InvokerBytecodeGenerator class (IntelliJ was warning about this).
>>>>>>
>>>>>> As a heads-up; I'm not a committer on the jdk project, so a sponsor
>>>>>> would be needed to push this.
>>>>>>
>>>>>> Thanks,
>>>>>> Jorn


More information about the core-libs-dev mailing list