summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2009-03-16 20:13:43 +0000
committerRich Hickey <richhickey@gmail.com>2009-03-16 20:13:43 +0000
commit63a0c31264186f4072a98bb1b9bf98dea17c8e35 (patch)
treee43033cdcf58efd99fc2581c76a4f0f1567c53ac
parent33e1d5b6f463c1f3c098a78f053048f0df2646ca (diff)
limit proxy to 18 args
-rw-r--r--src/clj/clojure/core_proxy.clj55
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))))]