summaryrefslogtreecommitdiff
path: root/src/clj
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-04-05 17:52:55 -0400
committerRich Hickey <richhickey@gmail.com>2010-04-05 17:52:55 -0400
commit54ab7bd6b6b2894923cc0a9333a5ea39738ae4f6 (patch)
tree104648a9f77038a96b4622181e7694e7988aa3ac /src/clj
parentc733148ba0fb3ff7bbab133f5375422972e62d08 (diff)
use reify for ILookupThunk impls in deftype
Diffstat (limited to 'src/clj')
-rw-r--r--src/clj/clojure/core_deftype.clj16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/clj/clojure/core_deftype.clj b/src/clj/clojure/core_deftype.clj
index d8027302..8e13902a 100644
--- a/src/clj/clojure/core_deftype.clj
+++ b/src/clj/clojure/core_deftype.clj
@@ -149,13 +149,15 @@
(get ~'__extmap k# else#)))
`(getLookupThunk [~'this k#]
(case k#
- ~@(mapcat
- (fn [fld]
- (let [cstr (str (clojure.core/name classname) "$__lookup__" (clojure.core/name fld))]
- [(keyword fld)
- `(-> ~cstr (Class/forName) (.newInstance))]))
- base-fields)
- nil)))]
+ ~@(let [gtarget (gensym)
+ hinted-target (with-meta gtarget {:tag tagname})]
+ (mapcat
+ (fn [fld]
+ [(keyword fld)
+ `(reify clojure.lang.ILookupThunk
+ (get [_ ~gtarget] (. ~hinted-target ~fld)))])
+ base-fields))
+ nil)))]
[i m]))
(idynamictype [[i m]]
[(conj i 'clojure.lang.IDynamicType)