[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