add code to avoid embedding functions with metadata on them (which kills perf)

This commit is contained in:
Nathan Marz 2016-09-01 16:59:40 -04:00
parent f8d74d5884
commit e571df5832
2 changed files with 17 additions and 7 deletions

View file

@ -603,14 +603,24 @@
(defn dynamic-var? [v] (defn dynamic-var? [v]
(-> v meta :dynamic)) (-> v meta :dynamic))
(defn direct-nav-obj [o]
(vary-meta o merge {:direct-nav true :original-obj o}))
(defn maybe-direct-nav [obj direct-nav?] (defn maybe-direct-nav [obj direct-nav?]
(if direct-nav? (if direct-nav?
(vary-meta obj assoc :direct-nav true) (direct-nav-obj obj)
obj)) obj))
(defn original-obj [o]
(let [orig (-> o meta :original-obj)]
(if orig
(recur orig)
o)))
(defn direct-nav? [o] (defn direct-nav? [o]
(-> o meta :direct-nav)) (-> o meta :direct-nav))
;; don't do coerce-nav here... save that for resolve-magic-code ;; don't do coerce-nav here... save that for resolve-magic-code
(defn- magic-precompilation* [o] (defn- magic-precompilation* [o]
(cond (sequential? o) (cond (sequential? o)
@ -680,13 +690,13 @@
(cond (instance? DynamicFunction o) (cond (instance? DynamicFunction o)
(let [op (resolve-dynamic-fn-arg-code (:op o)) (let [op (resolve-dynamic-fn-arg-code (:op o))
params (map resolve-dynamic-fn-arg-code (:params o))] params (map resolve-dynamic-fn-arg-code (:params o))]
`(~op ~@params)) `(~(original-obj op) ~@params))
(instance? DynamicVal o) (instance? DynamicVal o)
(:code o) (:code o)
:else :else
o)) (original-obj o)))
(defn resolve-magic-code [o] (defn resolve-magic-code [o]
@ -716,7 +726,8 @@
params (map resolve-dynamic-fn-arg (:params o))] params (map resolve-dynamic-fn-arg (:params o))]
(if (all-static? (conj params op)) (if (all-static? (conj params op))
(coerce-nav (apply op params)) (coerce-nav (apply op params))
(let [code `(~(resolve-dynamic-fn-arg-code op) ~@(map resolve-dynamic-fn-arg-code params))] (let [code `(~(-> op resolve-dynamic-fn-arg-code original-obj)
~@(map resolve-dynamic-fn-arg-code params))]
(if (direct-nav? op) code `(coerce-nav ~code))))) (if (direct-nav? op) code `(coerce-nav ~code)))))
:else :else

View file

@ -14,11 +14,10 @@
(defmacro richnav [params & impls] (defmacro richnav [params & impls]
(if (empty? params) (if (empty? params)
`(reify RichNavigator ~@impls) `(reify RichNavigator ~@impls)
`(vary-meta `(i/direct-nav-obj
(fn ~params (fn ~params
(reify RichNavigator (reify RichNavigator
~@impls)) ~@impls)))))
assoc :direct-nav true)))
(defmacro nav [params & impls] (defmacro nav [params & impls]