JOLT_WHOLE_PROGRAM (requires direct-linking) defers the per-namespace inference and runs ONE fixpoint over every user unit at once, so param types propagate across namespace boundaries — a non-inlined fn's record params get proven from its callers in another unit, which the per-ns pass can't see. Sound only under the closed-world assumption (no later eval/redefinition) the flag asserts; slow, memory-heavy builds are the documented trade-off (the reason it's opt-in). infer-unit! now takes one ns-name OR a list; infer-program! gathers all recorded user namespaces and runs the existing fixpoint over the union (re-emit was already ns-agnostic — keyed by var-key, callee-first). The evaluator defers + records each unit under the flag; run-main triggers infer-program! after all requires, before -main. Off by default — per-ns behaviour unchanged. Measured: a recursive (non-inlined) cross-ns record reader runs 1.66x faster (8.9s -> 5.3s) — params proven -> bare-index reads. NOTE: small accessor fns are INLINED cross-ns and records carry GLOBAL declared shapes, so most record reads are already proven without this pass; the win is for non-inlined hot fns, and it's the foundation for future whole-program work (devirtualization, unboxing). Adds whole-program-test (subprocess soundness: per-ns and whole-program produce identical results on a cross-ns record program). |
||
|---|---|---|
| .. | ||
| bench | ||
| clojure-stdlib/clojure | ||
| integration | ||
| spec | ||
| support | ||
| unit | ||