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