Skip to content

Commit c98e9a7

Browse files
ducky427dnolen
authored andcommitted
Use a js array to create collections in cljs.reader
1 parent 73e9929 commit c98e9a7

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

src/main/cljs/cljs/reader.cljs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -224,18 +224,22 @@ nil if the end of stream has been reached")
224224

225225
(defn read-delimited-list
226226
[delim rdr recursive?]
227-
(loop [a (transient [])]
227+
(loop [a (array)]
228228
(let [ch (read-past whitespace? rdr)]
229229
(when-not ch (reader-error rdr "EOF while reading"))
230230
(if (identical? delim ch)
231-
(persistent! a)
231+
a
232232
(if-let [macrofn (macros ch)]
233233
(let [mret (macrofn rdr ch)]
234-
(recur (if (identical? mret rdr) a (conj! a mret))))
234+
(recur (if (identical? mret rdr) a (do
235+
(.push a mret)
236+
a))))
235237
(do
236238
(unread rdr ch)
237239
(let [o (read rdr true nil recursive?)]
238-
(recur (if (identical? o rdr) a (conj! a o))))))))))
240+
(recur (if (identical? o rdr) a (do
241+
(.push a o)
242+
a))))))))))
239243

240244
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
241245
;; data structure readers
@@ -263,23 +267,27 @@ nil if the end of stream has been reached")
263267

264268
(defn read-list
265269
[rdr _]
266-
(apply list (read-delimited-list ")" rdr true)))
270+
(let [arr (read-delimited-list ")" rdr true)]
271+
(loop [i (alength arr) ^not-native r ()]
272+
(if (> i 0)
273+
(recur (dec i) (-conj r (aget arr (dec i))))
274+
r))))
267275

268276
(def read-comment skip-line)
269277

270278
(defn read-vector
271279
[rdr _]
272-
(read-delimited-list "]" rdr true))
280+
(vec (read-delimited-list "]" rdr true)))
273281

274282
(defn read-map
275283
[rdr _]
276284
(let [l (read-delimited-list "}" rdr true)
277-
c (count l)]
285+
c (alength l)]
278286
(when (odd? c)
279287
(reader-error rdr "Map literal must contain an even number of forms"))
280288
(if (<= c (* 2 (.-HASHMAP-THRESHOLD PersistentArrayMap)))
281-
(apply array-map l)
282-
(apply hash-map l))))
289+
(.fromArray PersistentArrayMap l true true)
290+
(.fromArray PersistentHashMap l true))))
283291

284292
(defn read-number
285293
[reader initch]
@@ -398,7 +406,7 @@ nil if the end of stream has been reached")
398406

399407
(defn read-set
400408
[rdr _]
401-
(set (read-delimited-list "}" rdr true)))
409+
(.fromArray PersistentHashSet (read-delimited-list "}" rdr true) true))
402410

403411
(defn read-regex
404412
[rdr ch]

0 commit comments

Comments
 (0)