[nop] Refactor deftype freezer

This commit is contained in:
Peter Taoussanis 2024-03-19 22:14:32 +01:00
parent f749e07eed
commit af928ed6a4

View file

@ -1094,22 +1094,25 @@
(-freeze-without-meta! (into {} x) out))) (-freeze-without-meta! (into {} x) out)))
(let [munge-cached (enc/fmemoize munge)] (let [munged-name (enc/fmemoize #(munge (name %)))
get-basis
(do #_enc/fmemoize ; Small perf benefit not worth the loss of dynamism
(fn [^java.lang.Class aclass]
(let [basis-method (.getMethod aclass "getBasis" nil)]
(.invoke basis-method nil nil))))]
(freezer IType nil true (freezer IType nil true
(let [aclass (class x) (let [aclass (class x)
class-name (.getName aclass)] class-name (.getName aclass)]
(write-id out id-type) (write-id out id-type)
(write-str out class-name) (write-str out class-name)
;; Could cache basis generation for given class-name with generalized (-run!
;; `-cache-proxy` or something like it, but probably not worth the extra complexity. (fn [b]
(let [basis-method (.getMethod aclass "getBasis" nil) (let [^Field cfield (.getField aclass (munged-name b))]
basis (.invoke basis-method nil nil)] (-freeze-without-meta! (.get cfield x) out)))
(-run! (get-basis aclass)))))
(fn [b]
(let [^Field cfield (.getField aclass (munge-cached (name b)))] (comment (do (deftype T1 [x]) (.invoke (.getMethod (class (T1. :x)) "getBasis" nil) nil nil)))
(let [fvalue (.get cfield x)]
(-freeze-without-meta! fvalue out))))
basis)))))
(enc/compile-if java.time.Instant (enc/compile-if java.time.Instant
(freezer java.time.Instant id-time-instant true (freezer java.time.Instant id-time-instant true