On Mon, 24 Oct 2022 22:15:49 GMT, Ioi Lam <ik...@openjdk.org> wrote: > 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 > > > More complex examples are in the JBS bug report > - https://bugs.openjdk.org/secure/attachment/101202/eclipse-ide-log.txt > - https://bugs.openjdk.org/secure/attachment/101203/lambda-expression.txt > - > https://bugs.openjdk.org/secure/attachment/101205/pattern-matching-switch.txt > - https://bugs.openjdk.org/secure/attachment/101204/str-concat.txt
This pull request has now been integrated. Changeset: fd668dc4 Author: Ioi Lam <ik...@openjdk.org> URL: https://git.openjdk.org/jdk/commit/fd668dc44f54274518d2bb46c5e22318a872c02e Stats: 75 lines in 5 files changed: 61 ins; 0 del; 14 mod 8295537: Enhance TRACE_METHOD_LINKAGE to show the target MethodHandle Reviewed-by: jvernee, redestad, mchung ------------- PR: https://git.openjdk.org/jdk/pull/10842