From 97dbba8320f5f13bb0237db0d8e40503dcd9b15c Mon Sep 17 00:00:00 2001 From: davidnolen Date: Thu, 5 Jun 2025 20:28:27 -0400 Subject: [PATCH 1/9] just use empty list --- src/main/cljs/cljs/core.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/cljs/cljs/core.cljs b/src/main/cljs/cljs/core.cljs index 3e789b6dc..1a3a67d9f 100644 --- a/src/main/cljs/cljs/core.cljs +++ b/src/main/cljs/cljs/core.cljs @@ -1648,7 +1648,7 @@ reduces them without incurring seq initialization" (-first [_] (aget arr i)) (-rest [_] (if (< (inc i) (alength arr)) (IndexedSeq. arr (inc i) nil) - (list))) + ())) INext (-next [_] (if (< (inc i) (alength arr)) From d3059d3a0716f7eff33609d17a2c477c7f32920c Mon Sep 17 00:00:00 2001 From: davidnolen Date: Thu, 5 Jun 2025 20:31:00 -0400 Subject: [PATCH 2/9] just invoke toString on StringBuffer --- src/main/cljs/cljs/core.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/cljs/cljs/core.cljs b/src/main/cljs/cljs/core.cljs index 1a3a67d9f..444683cb6 100644 --- a/src/main/cljs/cljs/core.cljs +++ b/src/main/cljs/cljs/core.cljs @@ -909,7 +909,7 @@ writer (StringBufferWriter. sb)] (-pr-writer obj writer (pr-opts)) (-flush writer) - (str sb))) + (.toString sb))) ;;;;;;;;;;;;;;;;;;; Murmur3 ;;;;;;;;;;;;;;; From a5f824c01f4f1fe4f06c0d96354163a87bf30a6c Mon Sep 17 00:00:00 2001 From: davidnolen Date: Thu, 5 Jun 2025 20:33:01 -0400 Subject: [PATCH 3/9] inline toString impl for EmptyList --- src/main/cljs/cljs/core.cljs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/cljs/cljs/core.cljs b/src/main/cljs/cljs/core.cljs index 444683cb6..79a8fe96d 100644 --- a/src/main/cljs/cljs/core.cljs +++ b/src/main/cljs/cljs/core.cljs @@ -3206,8 +3206,7 @@ reduces them without incurring seq initialization" (deftype EmptyList [meta] Object - (toString [coll] - (pr-str* coll)) + (toString [coll] "()") (equiv [this other] (-equiv this other)) (indexOf [coll x] From 63fce2437a5e0a8bc45f9aa4c36c9ee602720aa6 Mon Sep 17 00:00:00 2001 From: davidnolen Date: Thu, 5 Jun 2025 21:07:10 -0400 Subject: [PATCH 4/9] - reify should not emit basis static method - reify should set meta to nil if no actual meta --- src/main/clojure/cljs/core.cljc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 8418c5eca..608a39166 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -1365,7 +1365,7 @@ [& impls] (core/let [t (with-meta (gensym - (core/str "t_" + (core/str "t_reify_" (string/replace (core/str (munge ana/*cljs-ns*)) "." "$"))) {:anonymous true}) meta-sym (gensym "meta") @@ -1382,7 +1382,11 @@ IMeta (~'-meta [~this-sym] ~meta-sym) ~@impls)) - (new ~t ~@locals ~(ana/elide-reader-meta (meta &form)))))) + (new ~t ~@locals + ;; if the form meta is empty, emit nil + ~(let [form-meta (ana/elide-reader-meta (meta &form))] + (when-not (empty? form-meta) + form-meta)))))) (core/defmacro specify! "Identical to reify but mutates its first argument." @@ -1799,7 +1803,9 @@ (deftype* ~t ~fields ~pmasks ~(if (seq impls) `(extend-type ~t ~@(dt->et t impls fields)))) - (set! (.-getBasis ~t) (fn [] '[~@fields])) + ;; don't emit static basis method w/ reify + ~@(when-not (.startsWith (name t) "t_reify") + [`(set! (.-getBasis ~t) (fn [] '[~@fields]))]) (set! (.-cljs$lang$type ~t) true) (set! (.-cljs$lang$ctorStr ~t) ~(core/str r)) (set! (.-cljs$lang$ctorPrWriter ~t) (fn [this# writer# opt#] (-write writer# ~(core/str r)))) From fb72b3c06fc7fcd509ea8b2e42599a4766152e18 Mon Sep 17 00:00:00 2001 From: davidnolen Date: Thu, 5 Jun 2025 21:29:11 -0400 Subject: [PATCH 5/9] - fix last commit, core/foo in macros for self-hosted --- src/main/clojure/cljs/core.cljc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 608a39166..651e635c1 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -1384,8 +1384,8 @@ ~@impls)) (new ~t ~@locals ;; if the form meta is empty, emit nil - ~(let [form-meta (ana/elide-reader-meta (meta &form))] - (when-not (empty? form-meta) + ~(core/let [form-meta (ana/elide-reader-meta (meta &form))] + (core/when-not (empty? form-meta) form-meta)))))) (core/defmacro specify! From abaa388370b2a005c01f53a5ef1abba1b2639a1b Mon Sep 17 00:00:00 2001 From: davidnolen Date: Thu, 5 Jun 2025 21:46:00 -0400 Subject: [PATCH 6/9] - can't use .startsWith in bootstrapped --- src/main/clojure/cljs/core.cljc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 651e635c1..4f0e15ae1 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -636,7 +636,7 @@ gfirst (gensym "first__") has-rest (some #{'&} b)] (core/loop [ret (core/let [ret (conj bvec gvec val)] - (if has-rest + (if has-rests (conj ret gseq (core/list `seq gvec)) ret)) n 0 @@ -1804,7 +1804,9 @@ ~(if (seq impls) `(extend-type ~t ~@(dt->et t impls fields)))) ;; don't emit static basis method w/ reify - ~@(when-not (.startsWith (name t) "t_reify") + ;; nor for core types + ~@(when-not (or (string/starts-with? (name t) "t_reify") + (= 'cljs.core (:ns v))) [`(set! (.-getBasis ~t) (fn [] '[~@fields]))]) (set! (.-cljs$lang$type ~t) true) (set! (.-cljs$lang$ctorStr ~t) ~(core/str r)) From 3e995a6696917ca75d52a05b27ad1976c690ee74 Mon Sep 17 00:00:00 2001 From: davidnolen Date: Thu, 5 Jun 2025 21:46:51 -0400 Subject: [PATCH 7/9] - stuff missing in last commit --- src/main/clojure/cljs/core.cljc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 4f0e15ae1..29ea50338 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -1793,12 +1793,13 @@ [t fields & impls] (validate-fields "deftype" t fields) (core/let [env &env - r (:name (cljs.analyzer/resolve-var (dissoc env :locals) t)) + v (cljs.analyzer/resolve-var (dissoc env :locals) t) + r (:name v) [fpps pmasks] (prepare-protocol-masks env impls) protocols (collect-protocols impls env) t (vary-meta t assoc :protocols protocols - :skip-protocol-flag fpps) ] + :skip-protocol-flag fpps)] `(do (deftype* ~t ~fields ~pmasks ~(if (seq impls) From 32e6bcaff86e900b227ca487363cc7121bab57b0 Mon Sep 17 00:00:00 2001 From: davidnolen Date: Thu, 5 Jun 2025 21:48:26 -0400 Subject: [PATCH 8/9] - fix spurious typo --- src/main/clojure/cljs/core.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 29ea50338..78088a9f9 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -636,7 +636,7 @@ gfirst (gensym "first__") has-rest (some #{'&} b)] (core/loop [ret (core/let [ret (conj bvec gvec val)] - (if has-rests + (if has-rest (conj ret gseq (core/list `seq gvec)) ret)) n 0 From 8f3fa4ef1aaf9851b863777422dd9a9c11c8afbb Mon Sep 17 00:00:00 2001 From: davidnolen Date: Fri, 6 Jun 2025 16:37:07 -0400 Subject: [PATCH 9/9] - tweak --- src/main/clojure/cljs/core.cljc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 78088a9f9..1424674a2 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -1806,8 +1806,8 @@ `(extend-type ~t ~@(dt->et t impls fields)))) ;; don't emit static basis method w/ reify ;; nor for core types - ~@(when-not (or (string/starts-with? (name t) "t_reify") - (= 'cljs.core (:ns v))) + ~@(core/when-not (core/or (string/starts-with? (name t) "t_reify") + (= 'cljs.core (:ns v))) [`(set! (.-getBasis ~t) (fn [] '[~@fields]))]) (set! (.-cljs$lang$type ~t) true) (set! (.-cljs$lang$ctorStr ~t) ~(core/str r))