Skip to content

Commit 2bccb4a

Browse files
slipsetbronsa
authored andcommitted
TANAL-130 Avoid calling update-ns-map when not needed
`update-ns-map` is a fairly expensive function to call, and it's unnecessary to call it for macros which are known to not alter a namespace.
1 parent 5b54be3 commit 2bccb4a

File tree

1 file changed

+51
-1
lines changed
  • src/main/clojure/clojure/tools/analyzer

1 file changed

+51
-1
lines changed

src/main/clojure/clojure/tools/analyzer/jvm.clj

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,55 @@
4848
(:import (clojure.lang IObj RT Compiler Var)
4949
java.net.URL))
5050

51+
(def ns-safe-macro
52+
"Clojure macros that are known to not alter namespaces"
53+
#{#'clojure.core/->
54+
#'clojure.core/->>
55+
#'clojure.core/..
56+
#'clojure.core/and
57+
#'clojure.core/as->
58+
#'clojure.core/assert
59+
#'clojure.core/case
60+
#'clojure.core/cond
61+
#'clojure.core/cond->
62+
#'clojure.core/cond->>
63+
#'clojure.core/condp
64+
#'clojure.core/defn
65+
#'clojure.core/defn-
66+
#'clojure.core/delay
67+
#'clojure.core/doseq
68+
#'clojure.core/dosync
69+
#'clojure.core/dotimes
70+
#'clojure.core/doto
71+
#'clojure.core/fn
72+
#'clojure.core/for
73+
#'clojure.core/future
74+
#'clojure.core/if-let
75+
#'clojure.core/if-not
76+
#'clojure.core/lazy-seq
77+
#'clojure.core/let
78+
#'clojure.core/letfn
79+
#'clojure.core/loop
80+
#'clojure.core/or
81+
#'clojure.core/reify
82+
#'clojure.core/some->
83+
#'clojure.core/some->>
84+
#'clojure.core/sync
85+
#'clojure.core/time
86+
#'clojure.core/vswap!
87+
#'clojure.core/when
88+
#'clojure.core/when-let
89+
#'clojure.core/when-not
90+
#'clojure.core/while
91+
#'clojure.core/with-open
92+
#'clojure.core/with-out-str
93+
#'clojure.test/are
94+
#'clojure.test/deftest
95+
#'clojure.test/deftest-
96+
#'clojure.test/is
97+
#'clojure.test/testing
98+
#'clojure.test/try-expr})
99+
51100
(def specials
52101
"Set of the special forms for clojure in the JVM"
53102
(into ana/specials
@@ -147,7 +196,8 @@
147196

148197
macro?
149198
(let [res (apply v form (:locals env) (rest form))] ; (m &form &env & args)
150-
(update-ns-map!)
199+
(when-not (ns-safe-macro v)
200+
(update-ns-map!))
151201
(if (obj? res)
152202
(vary-meta res merge (meta form))
153203
res))

0 commit comments

Comments
 (0)