invokeExact_MT000_LFL_V is a static method and its first declared argument type 
is java.lang.Object, not MethodHandle. So aload_0 will load a reference with 
static type of Object, hence making a checkcast necessary to cast it to a 
MethodHandle.

HTH,
  Attila.

> On 2018. Apr 9., at 21:49, Ioi Lam <ioi....@oracle.com> wrote:
> 
> I am looking at the code generated by MethodHandleNatives.linkMethod:
> 
> (note the output was edited for brevity)
> 
> $ cat HelloMH.java
> import java.lang.invoke.*;
> 
> public class HelloMH {
>     public static void main(String ...args) throws Throwable {
>         MethodHandles.Lookup lookup = MethodHandles.lookup();
>         MethodType mt = MethodType.methodType(void.class, float.class);
>         MethodHandle mh = lookup.findStatic(HelloMH.class, "callme", mt);
>         mh.invokeExact(4.0f);
>     }
> 
>     private static void callme(float x) {
>         System.out.println("Hello MH.invoke: " + x);
>         Thread.dumpStack();
>     }
> }
> 
> $ javac HelloMH.java
> 
> $ java -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true \
>     -XX:+UnlockDiagnosticVMOptions -XX:+ShowHiddenFrames -cp . HelloMH
> [...]
> Hello MH.invoke: 4.0
> java.lang.Exception: Stack trace
>     at java.base/java.lang.Thread.dumpStack(Thread.java:1434)
>     at HelloMH.callme(HelloMH.java:13)
>     at java.base/java.lang.invoke.LambdaForm$DM.invokeStatic_LF_V()
>     at java.base/java.lang.invoke.LambdaForm$MH.invokeExact_MT_LFL_V()
>     at HelloMH.main(HelloMH.java:8)
> 
> 
> $ javap -c 'DUMP_CLASS_FILES/java/lang/invoke/LambdaForm$MH.class'
> final class java.lang.invoke.LambdaForm$MH {
>   static void invokeExact_MT000_LFL_V(java.lang.Object, float, 
> java.lang.Object);
>     Code:
>        0: aload_0
>        1: checkcast     #14    // class java/lang/invoke/MethodHandle
>        4: dup
>        ...
> 
> 
> Why is the checkcast necessary here?
> 
> I thought the verifier would ensure that local#0 must of type MethodHandle.
> 
> Is this checkcast needed only for reflective invocation of 
> MethodHandle.invokeExact()?
> 
> Thanks
> - Ioi
> 
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev@openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to