RFR: 8295537: Debug tracing for resolved java.lang.invoke.CallSite

Ioi Lam iklam at openjdk.org
Mon Oct 24 22:29:33 UTC 2022


I've added a `java.lang.invoke.MethodHandle.TRACE_CALLSITE` property to show 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_CALLSITE=true -cp . StrConcat
======== CallSite: StrConcat.main(StrConcat.java:5)
BSM = java.base/java.lang.invoke.StringConcatFactory.makeConcatWithConstants(StringConcatFactory.java:354)
target class = java.lang.invoke.BoundMethodHandle$Species_L
target = (String,String)String : BMH.reinvoke=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.invokeStatic=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
  }
]
HelloWorld
======== CallSite: StrConcat.main(StrConcat.java:6)
BSM = java.base/java.lang.invoke.StringConcatFactory.makeConcatWithConstants(StringConcatFactory.java:354)
target class = java.lang.invoke.BoundMethodHandle$Species_LL
target = (String)String : invoke=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.invokeStatic=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 )
]
HelloWorld


More complex examples are in the JBS bug report
- https://bugs.openjdk.org/secure/attachment/101170/eclipse-ide-log.txt
- https://bugs.openjdk.org/secure/attachment/101168/lambda-expression.txt
- https://bugs.openjdk.org/secure/attachment/101174/pattern-matching-switch.txt
- https://bugs.openjdk.org/secure/attachment/101169/str-concat.txt

-------------

Commit messages:
 - also print the BSM
 - cleaned up code; added comments; avoid using indy inside TRACE_CALLSITE; avoid interleaving output
 - 8295537: Debug tracing for resolved dynamic call sites

Changes: https://git.openjdk.org/jdk/pull/10842/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=10842&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8295537
  Stats: 127 lines in 6 files changed: 114 ins; 0 del; 13 mod
  Patch: https://git.openjdk.org/jdk/pull/10842.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/10842/head:pull/10842

PR: https://git.openjdk.org/jdk/pull/10842


More information about the core-libs-dev mailing list