Skip to content

Commit d59be28

Browse files
committed
Store protocol-impls as metadata, remove raw-protocol-impls parallel iteration
1 parent 7e1044d commit d59be28

File tree

1 file changed

+11
-27
lines changed

1 file changed

+11
-27
lines changed

src/sci/impl/deftype.cljc

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -124,17 +124,17 @@
124124
(defn ^:private standard-scitype-path
125125
"Standard SciType path for deftype — protocol-only implementations."
126126
[ctx form rec-type record-name factory-fn-sym fields field-set
127-
protocol-impls raw-protocol-impls error-hint]
127+
protocol-impls error-hint]
128128
(let [protocol-impls
129129
(mapcat
130-
(fn [[protocol-name & impls] expr]
130+
(fn [[protocol-name & impls]]
131131
(let [impls (group-by first impls)
132132
protocol (@utils/eval-resolve-state ctx (:bindings ctx) protocol-name)
133133
_ (when-not protocol
134134
(utils/throw-error-with-location
135135
(str "Protocol not found: " protocol-name)
136-
expr))
137-
_ (assert-no-jvm-interface protocol protocol-name expr error-hint)
136+
form))
137+
_ (assert-no-jvm-interface protocol protocol-name form error-hint)
138138
protocol (if (utils/var? protocol) @protocol protocol)
139139
protocol-ns (:ns protocol)
140140
pns (cond protocol-ns (str (types/getName protocol-ns))
@@ -176,8 +176,7 @@
176176
field-set)))
177177
`(defmethod ~(fq-meth-name method-name) ~rec-type ~@bodies))))
178178
impls)))
179-
protocol-impls
180-
raw-protocol-impls)]
179+
protocol-impls)]
181180
(emit-deftype rec-type record-name factory-fn-sym
182181
`(defn ~factory-fn-sym [& args#]
183182
(sci.impl.deftype/->type-impl '~rec-type ~rec-type (var ~record-name) (zipmap ~(list 'quote fields) args#)))
@@ -186,16 +185,15 @@
186185
(defn deftype-macro
187186
"Macro expansion for deftype. Emits a deftype* form like JVM Clojure.
188187
Protocol names are collected into the :implements vector, methods follow."
189-
[[_fname & _ :as _form] _ record-name fields & raw-protocol-impls]
188+
[[_fname] _ record-name fields & raw-protocol-impls]
190189
(let [ns-name (utils/current-ns-name)
191190
tagged-name (symbol (str ns-name) (str record-name))
192191
class-name (symbol (str (munge ns-name) "." record-name))
193192
protocol-impls (utils/split-when symbol? raw-protocol-impls)
194193
interfaces (mapv first protocol-impls)
195-
method-counts (mapv #(count (rest %)) protocol-impls)
196194
methods (mapcat rest protocol-impls)]
197195
(list* 'deftype* tagged-name class-name fields
198-
:implements (with-meta interfaces {:method-counts method-counts})
196+
:implements (with-meta interfaces {:protocol-impls protocol-impls})
199197
methods)))
200198

201199
(defn analyze-deftype*
@@ -207,20 +205,7 @@
207205
rec-type class-name
208206
factory-fn-str (str "->" record-name)
209207
factory-fn-sym (symbol factory-fn-str)
210-
;; Reconstruct protocol-impls grouping from method-counts metadata.
211-
method-counts (:method-counts (meta interfaces))
212-
protocol-impls
213-
(let [all-methods (vec methods)]
214-
(loop [ifaces (seq interfaces)
215-
counts (seq method-counts)
216-
offset 0
217-
result []]
218-
(if ifaces
219-
(let [cnt (first counts)
220-
impls (subvec all-methods offset (+ offset cnt))]
221-
(recur (next ifaces) (next counts) (+ offset cnt)
222-
(conj result (into [(first ifaces)] impls))))
223-
result)))
208+
protocol-impls (:protocol-impls (meta interfaces))
224209
field-set (set fields)
225210
result
226211
#?(:clj
@@ -281,11 +266,11 @@
281266
:fields (hash-map ~@field-entries)
282267
:protocols ~protocols-form}))))
283268
(standard-scitype-path ctx form rec-type record-name factory-fn-sym
284-
fields field-set protocol-impls protocol-impls error-hint)))
269+
fields field-set protocol-impls error-hint)))
285270
:cljs
286271
(let [protocol-impls
287272
(mapcat
288-
(fn [[protocol-name & impls] expr]
273+
(fn [[protocol-name & impls]]
289274
(let [impls (group-by first impls)
290275
protocol (@utils/eval-resolve-state ctx (:bindings ctx) protocol-name)
291276
protocol (or protocol
@@ -296,7 +281,7 @@
296281
_ (when-not protocol
297282
(utils/throw-error-with-location
298283
(str "Protocol not found: " protocol-name)
299-
expr))
284+
form))
300285
protocol (if (utils/var? protocol) @protocol protocol)
301286
protocol-var (:var protocol)
302287
_ (when protocol-var
@@ -346,7 +331,6 @@
346331
field-set)))
347332
`(defmethod ~(fq-meth-name method-name) ~rec-type ~@bodies)))))
348333
impls)))
349-
protocol-impls
350334
protocol-impls)]
351335
(emit-deftype rec-type record-name factory-fn-sym
352336
`(defn ~factory-fn-sym [& args#]

0 commit comments

Comments
 (0)