diff options
-rw-r--r-- | src/clj/clojure/core_deftype.clj | 4 | ||||
-rw-r--r-- | src/clj/clojure/genclass.clj | 20 |
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)])) |