Twenty-one new workloads against Bellard's QuickJS
A diagnostic expansion suite of 21 workloads, run with the hostile suite against QuickJS, found where Zipp's interpreter still loses; Proxy traps, private names, Unicode strings, number formatting and eval were the first fixes.
The canonical suites cover 35 workloads. 37da4030 adds bench/expansion/, a separate, versioned series of 21 deterministic workloads for what they do not reach: regex compilation, string building and Unicode scanning, small JSON messages, Proxy and accessors, objects as dictionaries, private class members, generators, a DataView codec, new Function and eval, and more. Every case prints byte-identical output on Node 24, Zipp and QuickJS at three sizes, and the harness records process cycles and peak memory and reports each row with a bootstrap interval. The first record (46f8cafe) needed a correction the same day: its build came from an ad-hoc profile-guided recipe trained on the rows it measured, so a638d95a added the canonical, held-out recipe's numbers as the ones to quote. Against QuickJS those are 0.674× its time on real13, 0.666× on micro5 and 0.834× on hostile17, and 1.199× on the expansion suite at its medium size, where QuickJS was faster on 14 of the 21 workloads.
The weaknesses the record ranked became the next commits, each checked against Node and timed against QuickJS: dictionary deletes and key probes (c6b1354a); Proxy traps that built descriptor objects on every call (9eed4926; a forwarding store's get, set and has traps in 154 ms instead of 336, QuickJS 40); private names resolved once per access site (33e3d1be); positions in long non-ASCII strings found in bounded time and case maps done in one pass (93850fc6, cccb86d1), which took the Unicode scanning workload from 374 to 176 ms against QuickJS's 192; a repeated declaration-free direct eval re-run instead of compiled again (44abf49c; 27 ms instead of 165, QuickJS 65); toFixed and its siblings rounded exactly without guard digits (07b09f9c); and yield* stepping a generator directly (86088292). 0ecf155e fixed a real bug found on the way: a class member with a computed key had no private brand chain, so it accepted another evaluation's private names where it must throw a TypeError.