Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8295537

Enhance TRACE_METHOD_LINKAGE to show the target MethodHandle

XMLWordPrintable

    • Icon: Enhancement Enhancement
    • Resolution: Fixed
    • Icon: P4 P4
    • 20
    • None
    • core-libs
    • None

      Improve the handling of the java.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE property to print out the full graph of MethodHandles that are used at a CallSite. This helps us understand how invokedynamic call sites are resolved. For example:

      public class StrConcat {
          static String hello = "Hello";
          static String world = "World";
          public static void main(String args[]) {
              System.out.println(hello + world);
              System.out.println(hello + "World");
          }
      }

      $ java -Djava.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE=true -cp . StrConcat
      linkCallSite StrConcat.main(StrConcat.java:5) java.lang.invoke.StringConcatFactory.makeConcatWithConstants(Lookup,String,MethodType,String,Object[])CallSite/invokeStatic makeConcatWithConstants(String,String)String/BSA1=
      linkMethod java.lang.invoke.MethodHandle.invokeExact(Lookup,String,MethodType,String,Object[])CallSite/5
      linkMethod => java.lang.invoke.Invokers$Holder.invokeExact_MT(Object,Object,Object,Object,Object,Object,Object)Object/invokeStatic + (Lookup,String,MethodType,String,Object[])CallSite
      linkCallSite target class => java.lang.invoke.BoundMethodHandle$Species_L
      linkCallSite target => (String,String)String : BMH.reinvoke000_LLL_L=Lambda(a0:L/SpeciesData[L => Species_L],a1:L,a2:L)=>{
          t3:L=Species_L.argL0(a0:L);
          t4:L=MethodHandle.invokeBasic(t3:L,a1:L,a2:L);t4:L}
      & BMH=[
        0: MethodHandle = {(Object,Object)String : DMH.invokeStatic000_LLL_L=Lambda(a0:L,a1:L,a2:L)=>{
              t3:L=DirectMethodHandle.internalMemberName(a0:L);
              t4:L=MethodHandle.linkToStatic(a1:L,a2:L,t3:L);t4:L}
          & DMH.MN=java.lang.StringConcatHelper.simpleConcat(Object,Object)String/invokeStatic
        }
      ]
      linkCallSite linkage => java.lang.invoke.Invokers$Holder.linkToTargetMethod(Object,Object,Object)Object/invokeStatic + MethodHandle(String,String)String
      HelloWorld
      linkCallSite StrConcat.main(StrConcat.java:6) java.lang.invoke.StringConcatFactory.makeConcatWithConstants(Lookup,String,MethodType,String,Object[])CallSite/invokeStatic makeConcatWithConstants(String)String/BSA1=World
      linkCallSite target class => java.lang.invoke.BoundMethodHandle$Species_LL
      linkCallSite target => (String)String : invoke000_LL_L=Lambda(a0:L/SpeciesData[LL => BoundMethodHandle$Species_LL],a1:L)=>{
          t2:L=BoundMethodHandle$Species_LL.argL1(a0:L);
          t3:L=BoundMethodHandle$Species_LL.argL0(a0:L);
          t4:L=MethodHandle.invokeBasic(t3:L,a1:L,t2:L);t4:L}
      & BMH=[
        0: MethodHandle = {(Object,Object)String : DMH.invokeStatic000_LLL_L=Lambda(a0:L,a1:L,a2:L)=>{
              t3:L=DirectMethodHandle.internalMemberName(a0:L);
              t4:L=MethodHandle.linkToStatic(a1:L,a2:L,t3:L);t4:L}
          & DMH.MN=java.lang.StringConcatHelper.simpleConcat(Object,Object)String/invokeStatic
        }
        1: ( World )
      ]
      linkCallSite linkage => java.lang.invoke.Invokers$Holder.linkToTargetMethod(Object,Object)Object/invokeStatic + MethodHandle(String)String
      HelloWorld

      ********************************************************************

      By human parsing, we can see that the first call site at StrConcat.java:5 is resolved to:

          MethodHandle mh = a0.argL0; // DirectMethodHandle of simpleConcat(Object,Object)
          invoke mh with (a1, a2); // a1 = StrConcat.hello; a2 = StrConcat.world
          return the result of the mh invocation

      The second callsite is similar, except the second argument to the simpleConcat() call is taken from a0.argL1 (the constant "World").

        1. eclipse-ide-log.txt
          525 kB
        2. lambda-expression.txt
          6 kB
        3. pattern-matching-switch.txt
          5 kB
        4. str-concat.txt
          8 kB

            iklam Ioi Lam
            iklam Ioi Lam
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated:
              Resolved: