summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-04-26 13:50:56 -0400
committerRich Hickey <richhickey@gmail.com>2010-04-26 13:50:56 -0400
commitdb3466e80b74b3a640b11ab287daca1e5b7d12b4 (patch)
tree23b01ce1f27a11326c5a47c627059ca42f8995f7
parent29dcb68be1eb9e2bfbe5bc627a1f1d6b3e0b7a29 (diff)
support type and parameter annotations in definterface
-rw-r--r--src/clj/clojure/core_deftype.clj4
-rw-r--r--src/clj/clojure/genclass.clj20
2 files changed, 14 insertions, 10 deletions
diff --git a/src/clj/clojure/core_deftype.clj b/src/clj/clojure/core_deftype.clj
index 84657847..63c310ef 100644
--- a/src/clj/clojure/core_deftype.clj
+++ b/src/clj/clojure/core_deftype.clj
@@ -20,8 +20,8 @@
[name & sigs]
(let [tag (fn [x] (or (:tag (meta x)) Object))
psig (fn [[name [& args]]]
- (vector name (vec (map tag args)) (tag name)))
- cname (symbol (str (namespace-munge *ns*) "." name))]
+ (vector name (vec (map tag args)) (tag name) (map meta args)))
+ cname (with-meta (symbol (str (namespace-munge *ns*) "." name)) (meta name))]
`(do (gen-interface :name ~cname :methods ~(vec (map psig sigs)))
(import ~cname))))
diff --git a/src/clj/clojure/genclass.clj b/src/clj/clojure/genclass.clj
index cdd02c5e..a6f14e82 100644
--- a/src/clj/clojure/genclass.clj
+++ b/src/clj/clojure/genclass.clj
@@ -622,14 +622,18 @@
(when (seq extends)
(into-array (map #(.getInternalName (asm-type %)) extends))))
(add-annotations cv (meta name))
- (doseq [[mname pclasses rclass] methods]
- (. cv visitMethod (+ Opcodes/ACC_PUBLIC Opcodes/ACC_ABSTRACT)
- (str mname)
- (Type/getMethodDescriptor (asm-type rclass)
- (if pclasses
- (into-array Type (map asm-type pclasses))
- (make-array Type 0)))
- nil nil))
+ (doseq [[mname pclasses rclass pmetas] methods]
+ (let [mv (. cv visitMethod (+ Opcodes/ACC_PUBLIC Opcodes/ACC_ABSTRACT)
+ (str mname)
+ (Type/getMethodDescriptor (asm-type rclass)
+ (if pclasses
+ (into-array Type (map asm-type pclasses))
+ (make-array Type 0)))
+ nil nil)]
+ (add-annotations mv (meta mname))
+ (dotimes [i (count pmetas)]
+ (add-annotations mv (nth pmetas i) i))
+ (. mv visitEnd)))
(. cv visitEnd)
[iname (. cv toByteArray)]))