diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-03-16 20:13:43 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-03-16 20:13:43 +0000 |
commit | 63a0c31264186f4072a98bb1b9bf98dea17c8e35 (patch) | |
tree | e43033cdcf58efd99fc2581c76a4f0f1567c53ac /src | |
parent | 33e1d5b6f463c1f3c098a78f053048f0df2646ca (diff) |
limit proxy to 18 args
Diffstat (limited to 'src')
-rw-r--r-- | src/clj/clojure/core_proxy.clj | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/src/clj/clojure/core_proxy.clj b/src/clj/clojure/core_proxy.clj index 626a6729..b0c23c04 100644 --- a/src/clj/clojure/core_proxy.clj +++ b/src/clj/clojure/core_proxy.clj @@ -61,38 +61,41 @@ end-label (. gen (newLabel)) decl-type (. Type (getType (. meth (getDeclaringClass))))] (. gen (visitCode)) - (. gen (loadThis)) - (. gen (getField ctype fmap imap-type)) - - (. gen (push (. meth (getName)))) + (if (> (count pclasses) 18) + (else-gen gen m) + (do + (. gen (loadThis)) + (. gen (getField ctype fmap imap-type)) + + (. gen (push (. meth (getName)))) ;lookup fn in map - (. gen (invokeStatic rt-type (. Method (getMethod "Object get(Object, Object)")))) - (. gen (dup)) - (. gen (ifNull else-label)) + (. gen (invokeStatic rt-type (. Method (getMethod "Object get(Object, Object)")))) + (. gen (dup)) + (. gen (ifNull else-label)) ;if found - (.checkCast gen ifn-type) - (. gen (loadThis)) + (.checkCast gen ifn-type) + (. gen (loadThis)) ;box args - (dotimes [i (count ptypes)] - (. gen (loadArg i)) - (. clojure.lang.Compiler$HostExpr (emitBoxReturn nil gen (nth pclasses i)))) + (dotimes [i (count ptypes)] + (. gen (loadArg i)) + (. clojure.lang.Compiler$HostExpr (emitBoxReturn nil gen (nth pclasses i)))) ;call fn - (. gen (invokeInterface ifn-type (new Method "invoke" obj-type - (into-array (cons obj-type - (replicate (count ptypes) obj-type)))))) + (. gen (invokeInterface ifn-type (new Method "invoke" obj-type + (into-array (cons obj-type + (replicate (count ptypes) obj-type)))))) ;unbox return - (. gen (unbox rtype)) - (when (= (. rtype (getSort)) (. Type VOID)) - (. gen (pop))) - (. gen (goTo end-label)) - + (. gen (unbox rtype)) + (when (= (. rtype (getSort)) (. Type VOID)) + (. gen (pop))) + (. gen (goTo end-label)) + ;else call supplied alternative generator - (. gen (mark else-label)) - (. gen (pop)) - - (else-gen gen m) - - (. gen (mark end-label)) + (. gen (mark else-label)) + (. gen (pop)) + + (else-gen gen m) + + (. gen (mark end-label)))) (. gen (returnValue)) (. gen (endMethod))))] |