|
151 | 151 | ;; stacks table, one get, 4 keywords: 9 without dedup |
152 | 152 | (is (= 6 (count (re-seq #"c\d+=C\[" preamble))) preamble)))))) |
153 | 153 |
|
| 154 | +(deftest jit-keyword-call-parity-test |
| 155 | + (testing "(:k coll) and (:k coll default) agree with the interpreter" |
| 156 | + (doseq [kw [":a" ":missing" ":a/b"] |
| 157 | + coll ["{:a 1}" "{}" "nil" "[1 2]" "\"s\"" "#{:a}" "(list 1)" |
| 158 | + "(js-obj \"a\" 1)" "1" ":a" "(sorted-map :a 1)"] |
| 159 | + dflt [nil ":dflt"]] |
| 160 | + (let [src (str "((fn [c] (" kw " c" (when dflt (str " " dflt)) ")) " coll ")") |
| 161 | + [interp jitted] (eval-both src)] |
| 162 | + (is (= interp jitted) src))))) |
| 163 | + |
| 164 | +(deftest jit-keyword-call-compiles-test |
| 165 | + (testing "(:k m) compiles instead of escaping to the interpreter" |
| 166 | + (when (do (jit/enable!) (jit/enabled?)) |
| 167 | + (doseq [src ["(fn [m] (:a m))" "(fn [m] (:a m :dflt))"]] |
| 168 | + (vreset! jit/last-srcs []) |
| 169 | + (vreset! jit/collect-srcs? true) |
| 170 | + ((sci/eval-string* (sci/init {}) src) {:a 1}) |
| 171 | + (vreset! jit/collect-srcs? false) |
| 172 | + (let [js (apply str @jit/last-srcs)] |
| 173 | + (is (not (str/includes? js "H.ev")) (str src " escaped: " js)) |
| 174 | + ;; escape-free means locals mode, no invocation array |
| 175 | + (is (not (str/includes? js "new Array")) (str src " left locals mode: " js))))))) |
| 176 | + |
154 | 177 | (deftest jit-var-mutation-visibility-test |
155 | 178 | ;; BOTH modes cache var derefs keyed on sci.impl.vars/var-epoch, so |
156 | 179 | ;; interp/jit agreement alone can't catch a missed bump — each case |
|
0 commit comments