Highlights
- #140 SIMD autovectorization restored on pure-accumulator loops.
loop_overhead32→12 ms,math_intensive48→14 ms,accumulate97→24 ms — all matching the v0.5.22 baseline exactly. Perry now beats Rust/C++ 7–8× onloop_overhead, 3× onmath_intensive, 4× onaccumulateagain. - V2.2 on-disk per-module object cache (
.perry-cache/objects/<target>/<key>.o). Warm-cache builds are ~29% faster; the real win isperry dev's watch-loop hot path where only the edited module recompiles.
Fixes
- #140 Scope the i32 shadow slot to locals actually used as array indices and refine the #74
asm sideeffectbarrier to skip bodies with outer-scope writes — the two changes that had knocked the LLVM vectorizer off pure-accumulator reductions between v0.5.91 and v0.5.162 (v0.5.164, 83f05ff) - #136
sendToClient(handle, msg)andcloseClient(handle)named imports from'ws'were silently no-ops — the receiver-less native dispatch table was missing entries (v0.5.162, d81acb5) - #135
--target webhangs whenbreak/continueis nested insideif/else/switch/try...catchinside a loop — WASM emitter was hardcodingBr(1)instead of consultingbreak_depth/loop_depth(v0.5.161, bf0a171) - PR #138 Windows vswhere discovery now requires VC tools (thanks @NicoAvanzDev) (9033dd4, 76f30c8)
- winget submission now syncs the
WINGET_PATuser's fork at runtime instead of hardcoding PerryTS's (v0.5.159, 58534df)
Features
- V2.2 per-module on-disk object cache closing #131, building on PR #132 — opt-outs via
--no-cache/PERRY_NO_CACHE=1; newperry cache info/perry cache cleansubcommands;PERRY_DEV_VERBOSE=1prints hit/miss ratios (v0.5.160, 1a12afe, 50d09ed)
Infrastructure
- Cache-key audit hardening: hashed codegen env vars by value (not presence),
.perry-cache/added to.gitignore, BSD-grep-portable smoke test regex (v0.5.160, 1a12afe) codegen-cache verbose outputaligned with the #131 spec (de514d5)