|
254 | 254 |
|
255 | 255 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; instrument ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
256 | 256 |
|
257 | | -(def ^:private fn-spec-roles [:args :ret :fn]) |
258 | | - |
259 | 257 | (defn- expect |
260 | 258 | "Returns nil if v conforms to spec, else throws ex-info with explain-data." |
261 | 259 | [spec v] |
|
268 | 266 | (.-sym x) |
269 | 267 | x)) |
270 | 268 |
|
271 | | -(defn- fn-specs? |
272 | | - "Fn-specs must include at least :args or :ret specs." |
| 269 | +(defn- fn-spec? |
| 270 | + "Fn-spec must include at least :args or :ret specs." |
273 | 271 | [m] |
274 | 272 | (c/or (:args m) (:ret m))) |
275 | 273 |
|
276 | | -(defn- fn-spec-sym |
277 | | - [sym role] |
278 | | - (symbol (str sym "$" (name role)))) |
279 | | - |
280 | | -(defn fn-specs |
281 | | - "Returns :args/:ret/:fn map of specs for var or symbol v." |
| 274 | +(defn fn-spec |
| 275 | + "Returns fspec of specs for var or symbol v, or nil." |
282 | 276 | [v] |
283 | | - (let [s (->sym v) |
284 | | - reg (registry)] |
285 | | - (reduce |
286 | | - (fn [m role] |
287 | | - (assoc m role (get reg (fn-spec-sym s role)))) |
288 | | - {} |
289 | | - fn-spec-roles))) |
| 277 | + (get (registry) (->sym v))) |
290 | 278 |
|
291 | 279 | (defn- spec-checking-fn |
292 | 280 | [v f] |
|
304 | 292 | [& args] |
305 | 293 | (if *instrument-enabled* |
306 | 294 | (s/with-instrument-disabled |
307 | | - (let [specs (fn-specs v)] |
| 295 | + (let [specs (fn-spec v)] |
308 | 296 | (let [cargs (when (:args specs) (conform! v :args (:args specs) args args)) |
309 | 297 | ret (binding [*instrument-enabled* true] |
310 | 298 | (apply f args)) |
|
317 | 305 |
|
318 | 306 | (defn- macroexpand-check |
319 | 307 | [v args] |
320 | | - (let [specs (fn-specs v)] |
| 308 | + (let [specs (fn-spec v)] |
321 | 309 | (when-let [arg-spec (:args specs)] |
322 | 310 | (when (= ::invalid (conform arg-spec args)) |
323 | 311 | (let [ed (assoc (explain-data* arg-spec [:args] |
|
328 | 316 | "Call to " (->sym v) " did not conform to spec:\n" |
329 | 317 | (with-out-str (explain-out ed)))))))))) |
330 | 318 |
|
331 | | -(defn- no-fn-specs |
| 319 | +(defn- no-fn-spec |
332 | 320 | [v specs] |
333 | 321 | (ex-info (str "Fn at " (pr-str v) " is not spec'ed.") |
334 | 322 | {:var v :specs specs})) |
|
339 | 327 |
|
340 | 328 | (defn instrument* |
341 | 329 | [v] |
342 | | - (let [specs (fn-specs v)] |
343 | | - (if (fn-specs? specs) |
| 330 | + (let [spec (fn-spec v)] |
| 331 | + (if (fn-spec? spec) |
344 | 332 | (locking instrumented-vars |
345 | 333 | (let [{:keys [raw wrapped]} (get @instrumented-vars v) |
346 | 334 | current @v] |
347 | 335 | (when-not (= wrapped current) |
348 | 336 | (let [checked (spec-checking-fn v current)] |
349 | 337 | (swap! instrumented-vars assoc v {:raw current :wrapped checked}) |
350 | 338 | checked)))) |
351 | | - (throw (no-fn-specs v specs))))) |
| 339 | + (throw (no-fn-spec v spec))))) |
352 | 340 |
|
353 | 341 | (defn unstrument* |
354 | 342 | [v] |
|
0 commit comments