Ten reported embedding bugs fixed, and v0.0.25
Ten more issues from @takahashim, from a Proxy on the global object's prototype chain to a heap ceiling a VM could not recover from, are fixed, and v0.0.25's safe-sandbox interpreter runs the benchmark rows in 0.84× Bellard's QuickJS's time.
@takahashim embeds Zipp the way a browser-like host does: the safe-sandbox profile with limits on, every script through eval_in_context, a Proxy on the global object's prototype chain, wrappers kept in WeakMaps. Their ten reports after v0.0.24 each came with a minimal repro: builtin writes and sloppy unresolvable assignments that went to that Proxy (#46 and #47, 5762df5a); a promise's resolving functions that were not function objects (#48, 6efdad8c); WeakMap#delete rebuilding its index (#49, bdd7538f); global reads slowing down as a realm grew, and a builtin reassigned on the global object (#50 and #51, cbea93aa, 476de138); a function that merely named eval (#52, 5f2bf15d); code from new Function and eval never freed (#53, 9c7d1a54, 5bd3ac46); a top-level let that the fix for #47 had broken on main (#54, 476de138); and a VM that could not allocate again after reaching its heap ceiling (#55, ca0091bc).
The same embedding set the performance work beside the fixes. Against v0.0.24, the safe-sandbox profile runs the 13 benchmark rows in 0.58× the time, 0.84× Bellard's QuickJS's and 0.53× QuickJS-NG's, with about half the peak memory. Running #50's own program in that profile turned up one more defect before release: it held only 1,024 globals created at run time, now 16,384 (3e8a5d07). v0.0.25 was published on 15 October from ddbd0272.