- Web platform globals —
Float16Arrayfamily,crypto.getRandomValues,URLSearchParams,requestAnimationFrame/queueMicrotask, byte codecs; modules can self-drive their own animation clock - The immutable-update idiom compiles to allocation-free packed records —
ps[i] = { … }over a single-schema array lowers to raw i32 cells (C's layout, no boxing); immutable leads the whole WASM field (c-wasm 1.79×, Rust 2.32×, V8 2.64× behind) &&-cond loop versioning — data-dependent bounds like the LZ match scan (src[j+len] === src[ip+len]) take the checked-free fast arm; lz now beats C→wasm- Hash lane — every Set/Map/dictionary carries a compact i32 probe lane (16 hash checks per cache line vs 2–3 at the old entry stride); miss chains stop sweeping the table
- Interpreter/VM dispatch compiles to C's shape — zero selects, zero
trunc_sat, one bounds branch + raw i32 register load (−49% on M4) - Interval-walk while-body fixpoint — heapsort,
medianUs, and codec loops prove their bounds through 2-round widening + short-circuit refinement; sort beats C→wasm rfft/cepstrumvectorize — mirror-lanev128stores on symmetric fills, span-aligned vector bounds; cepstrum beats V8- Cross-function static typed lengths — a callee proves its receiver's
.lengthfrom the frame that allocated it - Structural property resolution requires the full closed world — a cross-schema
.propread/write no longer touches a foreign slot - Loop-bound + checked-read soundness — a bound written mid-body keeps its reads checked;
s += a[i]of an out-of-bounds element is NaN, JS-exact - Boolean identity survives the closure ABI — every boxed result position round-trips
true/false - WASI reactor self-arms — every exported function honors the
_initializeonce-guard, so raw embedders that skip it never run unseeded - watr 5.7.4 — checked-read collapse family; the interpreter
reg[a] !== 0compare distributes into its arms (raw i32, no NaN materialization) - Geometric mean across the corpus: JZ leads — C 1.85×, AssemblyScript 1.99×, V8 2.14× slower
Full Changelog: v0.9.1...v0.9.2