diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-03-19 12:10:46 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-03-19 12:10:46 -0400 |
commit | 67864eb0d91867ff03b87d6874be28f1476d27df (patch) | |
tree | 76f8c1ec54f39fbc58584e7530e056d81751204f | |
parent | 109b015af4a0ca873412875b6e7705bec067640e (diff) |
added IObj and metadata propagation support for reify, so #^{:my :meta} (reify ...) works
-rw-r--r-- | src/clj/clojure/core_deftype.clj | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 9 |
2 files changed, 8 insertions, 3 deletions
diff --git a/src/clj/clojure/core_deftype.clj b/src/clj/clojure/core_deftype.clj index 0e721361..1297119a 100644 --- a/src/clj/clojure/core_deftype.clj +++ b/src/clj/clojure/core_deftype.clj @@ -100,7 +100,7 @@ [& opts+specs] (let [[interfaces methods] (parse-opts+specs opts+specs)] - `(reify* ~interfaces ~@methods))) + (with-meta `(reify* ~interfaces ~@methods) (meta &form)))) (defn hash-combine [x y] (clojure.lang.Util/hashCombine x (clojure.lang.Util/hash y))) diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index b484534c..080fc060 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -6010,13 +6010,18 @@ static public class NewInstanceExpr extends ObjExpr{ ISeq rform = RT.next(form); - IPersistentVector interfaces = (IPersistentVector) RT.first(rform); + IPersistentVector interfaces = ((IPersistentVector) RT.first(rform)).cons(Symbol.intern("clojure.lang.IObj")); rform = RT.next(rform); - return build(interfaces, null, null, classname, classname, null, rform); + Expr ret = build(interfaces, null, null, classname, classname, null, rform); + if(frm instanceof IObj && ((IObj) frm).meta() != null) + return new MetaExpr(ret, (MapExpr) MapExpr + .parse(context == C.EVAL ? context : C.EXPRESSION, ((IObj) frm).meta())); + else + return ret; } } |