The WebAssembly interpreter profiled, and v0.0.22

A first profile of the WebAssembly modules makes four quadratic string workloads linear, Lite stops making every register access a call, and v0.0.22 ships with ZIPP Lite as an asset.

The twelfth size pass profiled the modules for the first time. The checked profile now keeps a well-formed string's bytes as text (4e8cb084), flattens a rope before a RegExp exec (58735a8a), counts a compiled RegExp program toward the collection trigger (76420e1f) and shares the UTF-16 and UCS-2 regex matchers in every module (13b56e42): the JavaScript corpus takes 0.90 of the time, a sticky-regex tokenizer over 190 KB 164 ms instead of 17.8 s, and a loop that built and dropped large RegExps no longer dies of uncollected programs.

The thirteenth made a Lite register access one bounds check instead of a call, which had been 38% of an integer loop (09bf2c18), so Lite runs its corpus in 0.61 of the time; shares the Python runtime's compiled functions between programs instead of copying them (4a5dc9ac); and stops copying the value of a statement nobody reads (7190396a). Two update-expression bugs were fixed in every build: k++ on a const local changed the constant before throwing, and f++ inside function f replaced the function (cc074ade). v0.0.22 was published from 4a9a9124 on 10 October with modules 11% to 15% smaller than v0.0.21's, and ZIPP Lite joined it as a seventh asset the same day (18a8d935).