RFR: 8295537: Debug tracing for resolved java.lang.invoke.CallSite
Jorn Vernee
jvernee at openjdk.org
Tue Oct 25 13:26:57 UTC 2022
On Mon, 24 Oct 2022 22:15:49 GMT, Ioi Lam <iklam at openjdk.org> wrote:
> 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
src/java.base/share/classes/java/lang/invoke/CallSite.java line 179:
> 177: target.type(); // null check
> 178: this.target = target;
> 179: if (MethodHandleStatics.TRACE_CALLSITE) {
This doesn't seem like the right place to put this. Anyone can indirectly extend CallSite, by extending e.g. MutableCallSite, but this code seems to assume that the call is going through `MethodHandleNatives.linkCallSite`? I suggest putting any tracing around that area. Both the target method handle, and the BSM seem to be available at that point in the code as well.
I also note that there's already a `TRACE_METHOD_LINKAGE` flag as well, which does some tracing of call site linking. Maybe that option could be enhanced instead of adding a new one?
src/java.base/share/classes/java/lang/invoke/MethodHandle.java line 1814:
> 1812: return "";
> 1813: }
> 1814: return new String(new char[indentLevel*4]).replace('\0', ' ');
I guess this could be:
Suggestion:
return " ".repeat(indentLevel);
-------------
PR: https://git.openjdk.org/jdk/pull/10842
More information about the core-libs-dev
mailing list