fix(wasi-runtime): end exit and park without running the program
runtime.js implemented proc_exit by throwing a JavaScript error through the wasm stack, and the switch to -fwasm-exceptions made that error catchable: every cleanup pad, catch (...) and noexcept terminate pad catches a foreign exception. An exit therefore ran the destructors of every frame it left, a catch (...) swallowed it and carried on, and under a noexcept frame it ended in std::terminate. Crafter.Graphics calls std::_Exit(0) in Window::StartSync to hand the thread to requestAnimationFrame; once the exit's destructors had torn down main's locals, every later frame read destroyed state. proc_exit is now a function of a small helper module, bound directly as the program's import, that reports to the runtime and then executes unreachable. A trap is the one thing wasm code cannot catch, and raised in wasm rather than from JS it does not depend on each engine keeping a trap uncatchable when it passes back through a JS frame. Nothing of the program runs on the way out and its shadow stack stays as it was, which is what exit and _Exit require. window.crafter_wasi.exitCode holds the status, also after a return from main, so that bridges which call into the program on their own can stop. Handing the thread to the browser for good is a separate import, crafter_runtime.park. It ends the call the same way but leaves the program alive, and main's locals valid for the calls that follow, so StartSync keeps its contract that no caller code after it runs. Until Crafter.Graphics moves to park, its _Exit behaves as before minus the destructors: the runtime records an exit but cannot stop a bridge that calls exports itself. A WASI reactor build, where main returns and state lives in statics, was the alternative. It breaks StartSync's promise never to return, which the native targets rely on. JSPI would keep the whole stack alive, but Safari does not have it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
18413bfae4
commit
0dabce0b74
2 changed files with 76 additions and 24 deletions
|
|
@ -737,7 +737,11 @@ export namespace Crafter {
|
|||
// open it). Opt-in: WASI builds destined for wasmtime/wasmer don't need
|
||||
// this and shouldn't carry the extra files. Call from project.cpp after
|
||||
// outputName is set; index.html is generated against the current
|
||||
// outputName so renaming the binary later requires another call.
|
||||
// outputName so renaming the binary later requires another call. In that
|
||||
// runtime exit and _Exit end the program without running any more of it;
|
||||
// a program that hands the thread to the browser and keeps serving calls
|
||||
// parks instead, through the crafter_runtime.park import (runtime.js,
|
||||
// PROGRAM_END).
|
||||
void EnableWasiBrowserRuntime(Configuration& cfg);
|
||||
|
||||
// Register the relaxed-SIMD codegen variant on cfg. Builds an additional
|
||||
|
|
|
|||
Loading…
Reference in a new issue