diff options
author | Paul Stadig <paul@stadig.name> | 2011-01-08 08:15:38 -0500 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2011-03-11 11:15:54 -0500 |
commit | 6dec807840a42c948f03670f72eeb5ef90d806ea (patch) | |
tree | 707814198683ccf0d1bc8f1b2d5609712f547117 | |
parent | 2bc1c1403ac8e4f2ab0db1ac9c3a5082c1ffc6fa (diff) |
Do not hold onto head when invoking multi-methods
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r-- | src/jvm/clojure/lang/AFn.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/MultiFn.java | 268 |
2 files changed, 238 insertions, 34 deletions
diff --git a/src/jvm/clojure/lang/AFn.java b/src/jvm/clojure/lang/AFn.java index 26d2a56f..11a17305 100644 --- a/src/jvm/clojure/lang/AFn.java +++ b/src/jvm/clojure/lang/AFn.java @@ -158,9 +158,7 @@ static public Object applyToHelper(IFn ifn, ISeq arglist) throws Exception{ arglist = null; return ifn.invoke(); case 1: - Object a1 = arglist.first(); - arglist = null; - return ifn.invoke(a1); + return ifn.invoke(Util.ret1(arglist.first(),arglist = null)); case 2: return ifn.invoke(arglist.first() , Util.ret1((arglist = arglist.next()).first(),arglist = null) diff --git a/src/jvm/clojure/lang/MultiFn.java b/src/jvm/clojure/lang/MultiFn.java index 62f48329..c4891654 100644 --- a/src/jvm/clojure/lang/MultiFn.java +++ b/src/jvm/clojure/lang/MultiFn.java @@ -160,69 +160,149 @@ public Object invoke() throws Exception{ } public Object invoke(Object arg1) throws Exception{ - return getFn(dispatchFn.invoke(arg1)).invoke(arg1); + return getFn(dispatchFn.invoke(arg1)).invoke(Util.ret1(arg1,arg1=null)); } public Object invoke(Object arg1, Object arg2) throws Exception{ - return getFn(dispatchFn.invoke(arg1, arg2)).invoke(arg1, arg2); + return getFn(dispatchFn.invoke(arg1, arg2)). + invoke(Util.ret1(arg1,arg1=null), Util.ret1(arg2,arg2=null)); } public Object invoke(Object arg1, Object arg2, Object arg3) throws Exception{ - return getFn(dispatchFn.invoke(arg1, arg2, arg3)).invoke(arg1, arg2, arg3); + return getFn(dispatchFn.invoke(arg1, arg2, arg3)). + invoke(Util.ret1(arg1,arg1=null), Util.ret1(arg2,arg2=null), Util.ret1(arg3,arg3=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4) throws Exception{ - return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4)).invoke(arg1, arg2, arg3, arg4); + return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4)). + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) throws Exception{ - return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5)).invoke(arg1, arg2, arg3, arg4, arg5); + return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5)). + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6) throws Exception{ - return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6)).invoke(arg1, arg2, arg3, arg4, arg5, arg6); + return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6)). + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7) throws Exception{ - return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7)) - .invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7); + return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7)). + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8) throws Exception{ return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9) throws Exception{ return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9, Object arg10) throws Exception{ return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9, Object arg10, Object arg11) throws Exception{ return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9, Object arg10, Object arg11, Object arg12) throws Exception{ return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13) throws Exception{ return getFn(dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null), + Util.ret1(arg13,arg13=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, @@ -230,7 +310,20 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object throws Exception{ return getFn( dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null), + Util.ret1(arg13,arg13=null), + Util.ret1(arg14,arg14=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, @@ -238,8 +331,22 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object Object arg15) throws Exception{ return getFn( dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, - arg15)) - .invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15); + arg15)). + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null), + Util.ret1(arg13,arg13=null), + Util.ret1(arg14,arg14=null), + Util.ret1(arg15,arg15=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, @@ -247,9 +354,23 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object Object arg15, Object arg16) throws Exception{ return getFn( dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, - arg15, arg16)) - .invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, - arg15, arg16); + arg15, arg16)). + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null), + Util.ret1(arg13,arg13=null), + Util.ret1(arg14,arg14=null), + Util.ret1(arg15,arg15=null), + Util.ret1(arg16,arg16=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, @@ -257,9 +378,24 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object Object arg15, Object arg16, Object arg17) throws Exception{ return getFn( dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, - arg15, arg16, arg17)) - .invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, - arg15, arg16, arg17); + arg15, arg16, arg17)). + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null), + Util.ret1(arg13,arg13=null), + Util.ret1(arg14,arg14=null), + Util.ret1(arg15,arg15=null), + Util.ret1(arg16,arg16=null), + Util.ret1(arg17,arg17=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, @@ -268,8 +404,24 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object return getFn( dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, - arg15, arg16, arg17, arg18); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null), + Util.ret1(arg13,arg13=null), + Util.ret1(arg14,arg14=null), + Util.ret1(arg15,arg15=null), + Util.ret1(arg16,arg16=null), + Util.ret1(arg17,arg17=null), + Util.ret1(arg18,arg18=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, @@ -278,8 +430,25 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object return getFn( dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, - arg15, arg16, arg17, arg18, arg19); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null), + Util.ret1(arg13,arg13=null), + Util.ret1(arg14,arg14=null), + Util.ret1(arg15,arg15=null), + Util.ret1(arg16,arg16=null), + Util.ret1(arg17,arg17=null), + Util.ret1(arg18,arg18=null), + Util.ret1(arg19,arg19=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, @@ -289,8 +458,26 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object return getFn( dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, - arg15, arg16, arg17, arg18, arg19, arg20); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null), + Util.ret1(arg13,arg13=null), + Util.ret1(arg14,arg14=null), + Util.ret1(arg15,arg15=null), + Util.ret1(arg16,arg16=null), + Util.ret1(arg17,arg17=null), + Util.ret1(arg18,arg18=null), + Util.ret1(arg19,arg19=null), + Util.ret1(arg20,arg20=null)); } public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7, @@ -300,8 +487,27 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object return getFn( dispatchFn.invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20, args)). - invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, - arg15, arg16, arg17, arg18, arg19, arg20, args); + invoke(Util.ret1(arg1,arg1=null), + Util.ret1(arg2,arg2=null), + Util.ret1(arg3,arg3=null), + Util.ret1(arg4,arg4=null), + Util.ret1(arg5,arg5=null), + Util.ret1(arg6,arg6=null), + Util.ret1(arg7,arg7=null), + Util.ret1(arg8,arg8=null), + Util.ret1(arg9,arg9=null), + Util.ret1(arg10,arg10=null), + Util.ret1(arg11,arg11=null), + Util.ret1(arg12,arg12=null), + Util.ret1(arg13,arg13=null), + Util.ret1(arg14,arg14=null), + Util.ret1(arg15,arg15=null), + Util.ret1(arg16,arg16=null), + Util.ret1(arg17,arg17=null), + Util.ret1(arg18,arg18=null), + Util.ret1(arg19,arg19=null), + Util.ret1(arg20,arg20=null), + args); } public IPersistentMap getMethodTable() { |