[clang] [llvm] Add __builtin_wasm_js_catch (PR #153767)
Heejin Ahn via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 15 21:08:36 PDT 2025
aheejin wrote:
I'm not sure if I understand why this is necessary.
> This is a setjmp-like API that catches JavaScript errors. Its signature is `externref_t __builtin_wasm_js_catch(int *status);` The first time it returns, the return value is `null` and *status is set to 0. If we later call a function that raises a JavaScript error, control jumps back to the most recently executed call to `__builtin_wasm_js_catch()` which this time sets `*status` to 1 and returns the caught JS error.
Why this peculiar workflow? Why don't we catch something in a normal way, like, wrapping something with a JS `try` block?
> I think this is a generally useful thing to be able to do to handle errors in `EM_JS` functions, but it is possible to use JS try/catch for that. However, this is necessary in order to catch a SuspendError since it is generated within the import wrapper internally to the runtime and there is no way to catch the SuspendError in JavaScript.
Maybe I don't have the right context on what you're referring to, but
```js
try {
jsfunc1();
} catch (e) {
if (e instanceof WebAssembly.SuspendError) {
// Do something...
}
}
```
Why doesn't this work?
https://github.com/llvm/llvm-project/pull/153767
More information about the cfe-commits
mailing list