cap truncates a deep type's field VALUES to :any so the inter-procedural fixpoint stays finite, but it rebuilt the struct via mk-struct and dropped the record :type tag along the way. The tag is identity — independent of field depth — so a record stored in a deep container (a Sphere in a world vector, a material on a hit) degraded to a plain struct, and devirtualization (jolt-41m) and record? folding silently stopped firing on it. Preserve :type alongside :shape when capping. Verified: a protocol call on a record read out of a vector now devirtualizes (the call node gets :devirt-type, which needs the receiver's record type). Sound — the tag stays accurate; only field values below the depth cap are truncated. No measurable wall-clock change on its own (jolt's protocol dispatch is already cheap), but it restores the record fast path / devirt / record?-folding on records-in-containers, and unblocks downstream work that keys off record types. |
||
|---|---|---|
| .. | ||
| bench | ||
| clojure-stdlib/clojure | ||
| integration | ||
| spec | ||
| support | ||
| unit | ||