|
71 | 71 | (param-bind [param] |
72 | 72 | `[~param (^:ana/no-resolve first ~restarg) |
73 | 73 | ~restarg (^:ana/no-resolve next ~restarg)]) |
74 | | - (apply-to [] |
| 74 | + (_apply-to [] |
75 | 75 | (if (< 1 (count sig)) |
76 | 76 | (let [params (repeatedly (dec (count sig)) gensym)] |
77 | 77 | (with-meta |
|
100 | 100 | ~(dec (count sig)))]) |
101 | 101 | #_(js-inline-comment " @this {Function} ") |
102 | 102 | ;; dissoc :top-fn so this helper gets ignored in cljs.analyzer/parse 'set! |
103 | | - (set! (. ~(vary-meta sym dissoc :top-fn) ~'-cljs$lang$applyTo) |
| 103 | + #_(set! (. ~(vary-meta sym dissoc :top-fn) ~'-cljs$lang$applyTo) |
104 | 104 | ~(apply-to))))))) |
105 | 105 |
|
106 | | -(defn- multi-arity-fn [name meta fdecl emit-var?] |
| 106 | +(defn- multi-arity-fn [name meta fdecl _emit-var?] |
107 | 107 | (let [name (munge (or name (gensym "f")))] |
108 | | - (letfn [(dest-args [c] |
109 | | - (map (fn [n] (core-unchecked-get (core-js-arguments) n)) |
| 108 | + (letfn [(dest-args [args-sym c] |
| 109 | + (map (fn [n] `(aget ~args-sym ~n)) |
110 | 110 | (range c))) |
111 | | - (fixed-arity [rname sig] |
| 111 | + (fixed-arity [rname args-sym sig] |
112 | 112 | (let [c (count sig)] |
113 | 113 | [c `(. ;; prevent resolving rname, for REPL mode |
114 | 114 | ~(list 'js* (str rname)) |
115 | 115 | (~(symbol |
116 | 116 | (str "cljs$core$IFn$_invoke$arity$" c)) |
117 | | - ~@(dest-args c)))])) |
118 | | - (fn-method [name [sig & body :as method]] |
| 117 | + ~@(dest-args args-sym c)))])) |
| 118 | + (fn-method [name [sig & _body :as method]] |
119 | 119 | (if |
120 | 120 | (some '#{&} sig) |
121 | 121 | (variadic-fn* name method false) |
|
137 | 137 | varsig? #(boolean (some '#{&} %)) |
138 | 138 | {sigs false var-sigs true} (group-by varsig? arglists) |
139 | 139 | variadic? (pos? (count var-sigs)) |
140 | | - variadic-params (if variadic? |
141 | | - (cond-> (remove '#{&} (first var-sigs)) |
142 | | - true count |
143 | | - macro? (- 2)) |
144 | | - 0) |
145 | 140 | maxfa (apply max |
146 | 141 | (concat |
147 | 142 | (map count sigs) |
148 | 143 | [(- (count (first var-sigs)) 2)])) |
149 | 144 | mfa (cond-> maxfa macro? (- 2)) |
150 | | - ;; problematic |
151 | | - ;; _ (prn (doall (map meta arglists))) |
152 | 145 | meta (assoc meta |
153 | 146 | :top-fn |
154 | 147 | {:variadic? variadic? |
|
158 | 151 | :arglists (cond-> arglists #_#_macro? elide-implicit-macro-args) |
159 | 152 | :arglists-meta (doall (map clojure.core/meta arglists))} |
160 | 153 | :squint.compiler/no-rename true) |
161 | | - args-sym (gensym "args") |
162 | | - param-counts (map count arglists) |
163 | 154 | name (with-meta name meta) |
164 | | - args-arr (gensym "args-arr")] |
165 | | - #_(when (< 1 (count var-sigs)) |
166 | | - (ana/warning :multiple-variadic-overloads {} {:name name})) |
167 | | - #_(when (and (pos? variadic-params) |
168 | | - (not (== variadic-params (+ 1 mfa)))) |
169 | | - (ana/warning :variadic-max-arity {} {:name name})) |
170 | | - #_(when (not= (distinct param-counts) param-counts) |
171 | | - (ana/warning :overload-arity {} {:name name})) |
| 155 | + args-sym (gensym "args")] |
172 | 156 | `(let [~name |
173 | | - (fn [~'var_args] |
174 | | - (case (.-length ~(core-js-arguments)) |
175 | | - ~@(mapcat #(fixed-arity rname %) sigs) |
| 157 | + (fn [~(symbol (str "..." args-sym))] |
| 158 | + (case (.-length ~args-sym) |
| 159 | + ~@(mapcat #(fixed-arity rname args-sym %) sigs) |
176 | 160 | ~(if variadic? |
177 | | - `(let [~args-arr [] #_(array)] |
178 | | - ~(core-copy-arguments args-arr) |
179 | | - (let [argseq# (when (< ~maxfa (.-length ~args-arr)) |
180 | | - (.slice ~args-arr ~maxfa) #_(new #_:ana/no-resolve cljs.core/IndexedSeq |
181 | | - 0 nil))] |
182 | | - (. |
183 | | - ;; prevent resolving rname, for REPL mode |
184 | | - ~(list 'js* (str rname)) |
185 | | - (~'cljs$core$IFn$_invoke$arity$variadic |
186 | | - ~@(dest-args maxfa) |
187 | | - argseq#)))) |
| 161 | + `(let [argseq# (when (< ~maxfa (.-length ~args-sym)) |
| 162 | + (.slice ~args-sym ~maxfa) #_(new #_:ana/no-resolve cljs.core/IndexedSeq |
| 163 | + 0 nil))] |
| 164 | + (. |
| 165 | + ;; prevent resolving rname, for REPL mode |
| 166 | + ~(list 'js* (str rname)) |
| 167 | + (~'cljs$core$IFn$_invoke$arity$variadic |
| 168 | + ~@(dest-args args-sym maxfa) |
| 169 | + argseq#))) |
188 | 170 | (if (:macro meta) |
189 | 171 | `(throw (js/Error. |
190 | | - (str "Invalid arity: " (- (alength ~(core-js-arguments)) 2)))) |
| 172 | + (str "Invalid arity: " (- (.-length ~args-sym) 2)))) |
191 | 173 | `(throw (js/Error. |
192 | | - (str "Invalid arity: " (alength ~(core-js-arguments)))))))))] |
| 174 | + (str "Invalid arity: " (.-length ~args-sym))))))))] |
193 | 175 | ~@(map #(fn-method name %) fdecl) |
194 | 176 | ;; optimization properties |
195 | 177 | (set! (. (cljs.core/js* ~name) ~'-cljs$lang$maxFixedArity) ~maxfa) |
|
0 commit comments