The Great Startup Problem
Vladimir Ivanov
vladimir.x.ivanov at oracle.com
Mon Sep 1 07:07:59 UTC 2014
Jochen,
The stack traces you provide are so long due to LambdaForm
interpretation. Most of the stack frames are the following:
java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
We are aware about it and plan to improve the situation in 8u40.
The idea is to precompile (to bytecode) the every element of method
handle chain when indy call site is bound. It allows to skip LF
interpretation and hence reduce worst case stack usage.
Stack usage won't be constant though. Each compiled LF being executed
consumes 1 stack frame, so for a method handle chain of N elements, it's
invocation consumes ~N stack frames.
Is it acceptable and solves the problem for you?
We discussed an idea to generate custom bytecodes (single method) for
the whole method handle chain (and have only 1 extra stack frame per MH
invocation), but it defeats memory footprint reduction we are trying to
archieve with LambdaForm sharing.
Best regards,
Vladimir Ivanov
On 8/29/14, 11:19 PM, Jochen Theodorou wrote:
> Am 29.08.2014 19:28, schrieb Mark Roos:
>> Hi Jochen,
>> you wrote:
>> I also see potential for cases in which the MethodHandle gets
>> overly
>> complex. In Groovy we have for example up to N+1 guards for a
>> method
>> call with N arguments plus a catchException part and a
>> switchpoint. Most
>> of them ending up in selecting the method new. I could imagine
>> things
>> getting even more complicated.
>>
>> I was wondering how deep your GWT chains get and how complex the
>> inserted LambdaForms are.
>> I put two examples of my stack traces the first where it succeeds at the
>> first GWT the second is where
>> the second GWT is taken. I get about 7 extra frames per GWT.
>>
>> I still seems to me that a different PIC choice other than chained GWTs
>> would get rid of a lot of
>> the extra frames. Though again my profiling shows 97% of call sites for
>> me are 3 or less GWTs
>> and 75% are monomorphic. So except when I have recursive like calls it
>> may not be so big
>> in practice. (tails calls anyone?)
>
> Prepare for some really long traces....
>
> Last time I had 10+ frames, but ok, let me check again, maybe something
> changed... but I have to use 8u5, since 8u11 and 8u20 are broken for us.
> I will use this program:
>
> def foo(x) {
> x.each {println it}
> }
> foo([]) /* 1 */
> foo([]) /* 2 */
> foo("") /* 3 */
> foo("") /* 4 */
>
> And meassure for the each method from the callsite in foo.
>
> So in case 1 we visit the callsite the first time, thus this one is
> especially long, since we have the dynamic invocation of the target handle:
>
>> at
>> org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1645)
>>
>> at org.codehaus.groovy.runtime.dgm$153.doMethodInvoke(Unknown
>> Source:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.168366.invokeSpecial_LLLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLLL_L(LambdaForm.java:1118)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$MH.1209702763.invokeExact_MT(LambdaForm$MH:-1)
>>
>> at
>> java.lang.invoke.MethodHandleImpl$GuardWithCatch.invoke_L2(MethodHandleImpl.java:638)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.168366.invokeSpecial_LLLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLLL_L(LambdaForm.java:1118)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLL_L(LambdaForm.java:1113)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLL_L(LambdaForm.java:1113)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLL_L(LambdaForm.java:1113)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.1378084334.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$MH.1028780142.invokeExact_MT(LambdaForm$MH:-1)
>>
>> at
>> org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:215)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.1238959340.invokeStatic_LLLILLLLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.776700275.invokeSpecial_LLLLILLLLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NFI.1702940637.invoke_LLLLILLLLL_L(LambdaForm$NFI:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.1378084334.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_L_L(LambdaForm.java:1103)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$MH.1782580546.linkToCallSite(LambdaForm$MH:-1)
>>
>> at test.foo(test.groovy:1882)
>
> that makes then 21 stack frames to get from the call site to my method
> selection method in IndyInterface, where the resulting handle is called
> and produces another 78 stack frames.
>
> In case 2 we use the cached handle:
>
>> at
>> org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1645)
>>
>> at org.codehaus.groovy.runtime.dgm$153.doMethodInvoke(Unknown
>> Source:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.168366.invokeSpecial_LLLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLLL_L(LambdaForm.java:1118)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$MH.1209702763.invokeExact_MT(LambdaForm$MH:-1)
>>
>> at
>> java.lang.invoke.MethodHandleImpl$GuardWithCatch.invoke_L2(MethodHandleImpl.java:638)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.168366.invokeSpecial_LLLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLLL_L(LambdaForm.java:1118)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LL_L(LambdaForm.java:1108)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLL_L(LambdaForm.java:1113)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLL_L(LambdaForm.java:1113)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1205406622.invokeSpecial_LLL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLL_L(LambdaForm.java:1113)
>>
>> at
>> java.lang.invoke.LambdaForm$DMH.963110412.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.479397964.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$MH.1782580546.linkToCallSite(LambdaForm$MH:-1)
>>
>> at test.foo(test.groovy:1882)
>
> makes 55 frames. In case 3 we have a cache miss and it is 34 frames to
> get to selectMethod again and 50+ frames from there.... I think I better
> stop here.
>
> My first few frames are exactly like what you have:
>
>> rtPbc.r938.invoke(Object printInspectStringOn:indent::4)
>> java.lang.invoke.LambdaForm$DMH/1323468230.invokeStatic_LLL_L(LambdaForm$DMH)
>>
>> java.lang.invoke.LambdaForm$DMH/38997010.invokeSpecial_LLLL_L(LambdaForm$DMH)
>>
>> java.lang.invoke.LambdaForm$NamedFunction.invoke_LLLL_L(LambdaForm.java:1118)
>>
>> java.lang.invoke.LambdaForm$DMH/1555093762.invokeStatic_LL_L(LambdaForm$DMH)
>>
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> java.lang.invoke.LambdaForm$LFI/580024961.interpret_L(LambdaForm$LFI)
>> java.lang.invoke.LambdaForm$MH/425918570.linkToCallSite(LambdaForm$MH)
>> rtPbc.r728.invoke(Object printInspectorString:113)
>
> only that it does not stop there by far.
>
> I assume, your amount of frames is what you get when you are able to set
> the handle directly in the bootstrap method. We cannot, we have to use
> runtime types in most cases.
>
> Since I have already 21 frames to get there kind of (my method selection
> method actually) I think I should show what is involved for that.
>
> basically I install this handle mh
>
>> MethodHandle mh =
>> MethodHandles.insertArguments(SELECT_METHOD, 0, mc, sender, name,
>> callID, safeNavigation, thisCall, spreadCall, /*dummy receiver:*/ 1);
>> mh = mh.asCollector(Object[].class,
>> type.parameterCount()).
>> asType(type);
>
> on a MutableCallSite. There are a lot of parameters there, though we
> need those.. mc is the callsite, sender is the class the call originates
> from, name, the name of the method, callID defines the type of the call,
> which is one of property get, property set, cast, normal method call.
> safeNavigation is a flag to skip the method call in case the receiver is
> null, thisCall if the call is made using "this" as receiver, spreadCall
> if for example the receiver is a list and the call is supposed to be
> invoked on all the elements of the list. These are all meta information
> we provide through the callsite already. The normal method call
> arguments are gobbled up in the asCollector part and given as an
> Object[] to the method selection. Oh yes... the receiver is a dummy, to
> bypass that limitation of not being able to call anything on null. The
> real receiver is then the first argument.
>
> Maybe I am doing something wrong, but should the few lines I posted
> really produce that many frames already? Maybe the situation would
> already improve if I would make callID, safeNavigation, thisCall,
> spreadCall into one int
>
> ah... to show an example where things are much better... when I do 1+1,
> I can safe on guards:
>
>> at org.codehaus.groovy.vmplugin.v7.IndyMath.plus(IndyMath.java:147)
>> at
>> java.lang.invoke.LambdaForm$DMH.1332668132.invokeStatic_II_I(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NFI.447212746.invoke_II_I(LambdaForm$NFI:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1259652483.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.1769190683.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.447981768.invokeSpecial_LII_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NFI.306612792.invoke_LII_L(LambdaForm$NFI:-1)
>> at
>> java.lang.invoke.LambdaForm$DMH.1259652483.invokeStatic_LL_L(LambdaForm$DMH:-1)
>>
>> at
>> java.lang.invoke.LambdaForm$NamedFunction.invokeWithArguments(LambdaForm.java:1147)
>>
>> at java.lang.invoke.LambdaForm.interpretName(LambdaForm.java:625)
>> at
>> java.lang.invoke.LambdaForm.interpretWithArguments(LambdaForm.java:604)
>> at
>> java.lang.invoke.LambdaForm$LFI.1769190683.interpret_L(LambdaForm$LFI:-1)
>> at
>> java.lang.invoke.LambdaForm$MH.1125736023.linkToCallSite(LambdaForm$MH:-1)
>>
>> at test.foo(test.groovy:1882)
>
> That's 15 frames. But it is rare that I can do things like that
>
>
> bye Jochen
>
More information about the mlvm-dev
mailing list