diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-06-06 09:26:28 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-06-06 09:26:28 -0400 |
commit | 2ac93197e356af3c826ca895b5a538ad08c5715a (patch) | |
tree | 572ccab5686fab849b4dcfeb46be083c1e2b6f1e | |
parent | 3353eeafb5aab2e465fb953f3f50ac7bc60c2e0a (diff) |
prevent dynamic classes from being flushed before use
-rw-r--r-- | src/clj/clojure/core_deftype.clj | 9 | ||||
-rw-r--r-- | src/clj/clojure/core_proxy.clj | 2 |
2 files changed, 7 insertions, 4 deletions
diff --git a/src/clj/clojure/core_deftype.clj b/src/clj/clojure/core_deftype.clj index 4ca47637..d0ae7c39 100644 --- a/src/clj/clojure/core_deftype.clj +++ b/src/clj/clojure/core_deftype.clj @@ -23,8 +23,9 @@ psig (fn [[name [& args]]] (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)))) + `(let [] + (gen-interface :name ~cname :methods ~(vec (map psig sigs))) + (import ~cname)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;; reify/deftype ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -294,7 +295,7 @@ tag (keyword (str *ns*) (str name)) hinted-fields fields fields (vec (map #(with-meta % nil) fields))] - `(do + `(let [] ~(emit-defrecord name gname (vec hinted-fields) (vec interfaces) methods) (defmethod print-method ~classname [o# w#] ((var print-defrecord) o# w#)) @@ -386,7 +387,7 @@ tag (keyword (str *ns*) (str name)) hinted-fields fields fields (vec (map #(with-meta % nil) fields))] - `(do + `(let [] ~(emit-deftype* name gname (vec hinted-fields) (vec interfaces) methods) (import ~classname)))) diff --git a/src/clj/clojure/core_proxy.clj b/src/clj/clojure/core_proxy.clj index c88b1fe3..dc3514de 100644 --- a/src/clj/clojure/core_proxy.clj +++ b/src/clj/clojure/core_proxy.clj @@ -331,6 +331,8 @@ (clojure.lang.Compiler/writeClassFile cname bytecode))) pc-effect (apply get-proxy-class bases) pname (proxy-name super interfaces)] + ;remember the class to prevent it from disappearing before use + (intern *ns* (symbol pname) pc-effect) `(let [;pc# (get-proxy-class ~@class-and-interfaces) p# (new ~(symbol pname) ~@args)] ;(construct-proxy pc# ~@args)] (init-proxy p# |