Skip to content

Commit 83866aa

Browse files
committed
CLJS-2894: Optimize source map gen-col counting
1 parent 4f37076 commit 83866aa

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

src/main/clojure/cljs/compiler.cljc

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
[cljs.source-map :as sm]))
3232
#?(:clj (:import java.lang.StringBuilder
3333
[java.io File Writer]
34+
[java.util.concurrent.atomic AtomicLong]
3435
[cljs.tagged_literals JSValue])
3536
:cljs (:import [goog.string StringBuffer])))
3637

@@ -50,6 +51,7 @@
5051
(def ^:dynamic *recompiled* nil)
5152
(def ^:dynamic *inputs* nil)
5253
(def ^:dynamic *source-map-data* nil)
54+
(def ^:dynamic *source-map-data-gen-col* nil)
5355
(def ^:dynamic *lexical-renames* {})
5456

5557
(def cljs-reserved-file-names #{"deps.cljs"})
@@ -183,7 +185,8 @@
183185
(let [{:keys [line column]} env]
184186
(swap! *source-map-data*
185187
(fn [m]
186-
(let [minfo (cond-> {:gcol (:gen-col m)
188+
(let [minfo (cond-> {:gcol #?(:clj (.get ^AtomicLong *source-map-data-gen-col*)
189+
:cljs (:gen-col m))
187190
:gline (:gen-line m)}
188191
(#{:var :local :js-var} (:op ast))
189192
(assoc :name (str (-> ast :info :name))))]
@@ -206,9 +209,10 @@
206209
#?(:clj (seq? a) :cljs (ana/cljs-seq? a)) (apply emits a)
207210
#?(:clj (fn? a) :cljs ^boolean (goog/isFunction a)) (a)
208211
:else (let [^String s (cond-> a (not (string? a)) .toString)]
209-
(when-not (nil? *source-map-data*)
210-
(swap! *source-map-data*
211-
update-in [:gen-col] #(+ % (count s))))
212+
#?(:clj (when-some [^AtomicLong gen-col *source-map-data-gen-col*]
213+
(.addAndGet gen-col (.length s)))
214+
:cljs (when-some [sm-data *source-map-data*]
215+
(swap! sm-data update :gen-col #(+ % (.-length s)))))
212216
#?(:clj (.write ^Writer *out* s)
213217
:cljs (print s))))
214218
nil)
@@ -227,11 +231,12 @@
227231
(defn ^:private _emitln []
228232
(newline)
229233
(when *source-map-data*
234+
#?(:clj (.set ^AtomicLong *source-map-data-gen-col* 0))
230235
(swap! *source-map-data*
231236
(fn [{:keys [gen-line] :as m}]
232237
(assoc m
233238
:gen-line (inc gen-line)
234-
:gen-col 0))))
239+
#?@(:cljs [:gen-col 0])))))
235240
nil)
236241

237242
(defn emitln
@@ -1498,8 +1503,8 @@
14981503
*source-map-data* (when (:source-map opts)
14991504
(atom
15001505
{:source-map (sorted-map)
1501-
:gen-col 0
15021506
:gen-line 0}))
1507+
*source-map-data-gen-col* (AtomicLong.)
15031508
find-ns-starts-with (memoize find-ns-starts-with)]
15041509
(emitln (compiled-by-string opts))
15051510
(with-open [rdr (io/reader src)]
@@ -1538,7 +1543,8 @@
15381543
:name ns-name}))
15391544
(emit ast)
15401545
(recur (rest forms) ns-name deps))))
1541-
(let [sm-data (when *source-map-data* @*source-map-data*)
1546+
(let [sm-data (when *source-map-data* (assoc @*source-map-data*
1547+
:gen-col (.get ^AtomicLong *source-map-data-gen-col*)))
15421548
ret (merge
15431549
{:ns (or ns-name 'cljs.user)
15441550
:macros-ns (:macros-ns opts)

src/main/clojure/cljs/repl.cljc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
(:import [java.io File PushbackReader FileWriter PrintWriter]
2828
[java.net URL]
2929
[java.util Base64]
30+
[java.util.concurrent.atomic AtomicLong]
3031
[clojure.lang IExceptionInfo]
3132
[java.util.regex Pattern]
3233
[com.google.common.base Throwables]))
@@ -530,8 +531,8 @@
530531
(if (:source-map repl-env)
531532
(binding [comp/*source-map-data*
532533
(atom {:source-map (sorted-map)
533-
:gen-col 0
534-
:gen-line 0})]
534+
:gen-line 0})
535+
comp/*source-map-data-gen-col* (AtomicLong.)]
535536
(let [js (comp/emit-str ast)
536537
t (System/currentTimeMillis)]
537538
(str js

0 commit comments

Comments
 (0)