The Great Startup Problem

Jochen Theodorou blackdrag at gmx.org
Fri Aug 29 19:19:27 UTC 2014


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

-- 
Jochen "blackdrag" Theodorou - Groovy Project Tech Lead
blog: http://blackdragsview.blogspot.com/
german groovy discussion newsgroup: de.comp.lang.misc
For Groovy programming sources visit http://groovy-lang.org



More information about the mlvm-dev mailing list