从 JavaScript 终止 WebAssembly
Terminate WebAssembly from JavaScript
是否可以终止 运行 WebAssembly 代码并清除 JavaScript 中的所有剩余资源?
大体情况是这样的。 JS 初始化一个 WASM 模块并调用一个导出函数。在稍后的某个时间点,WASM 代码调用一个导入的函数 f
将控制权转移回 JS。 f
做了一些事情,并根据结果决定是否保留 WASM 运行。
两种情况:
- 应该保留 WASM 运行。
f
只是 returns.
f
决定终止 WASM 功能并可能清理任何 WASM 相关资源。它可以?怎么样?
如果可以更轻松地分析更具体的示例,请考虑 execve
的工作原理。如果调用失败,它只是 returns 指示失败。然而,如果它成功了,它不会 return - 一个广泛的过度简化就是说它终止了调用者并在它的位置开始一个新的调用者(保持一些环境不变)。
可能终止调用者的唯一方法——无论调用者是 Wasm 还是 JavaScript——是抛出异常。这让调用者做出充分的反应。特别是,如果它需要进行清理,那么它应该被编写为捕获可能的异常、执行清理并重新抛出(或者,等效地,在可用时使用 try-finally 构造)。
Wasm 目前不直接支持异常处理,但可以通过 thunking 到 JavaScript 来模拟。 Wasm 的未来版本将有适当的异常处理支持。
是否可以终止 运行 WebAssembly 代码并清除 JavaScript 中的所有剩余资源?
大体情况是这样的。 JS 初始化一个 WASM 模块并调用一个导出函数。在稍后的某个时间点,WASM 代码调用一个导入的函数 f
将控制权转移回 JS。 f
做了一些事情,并根据结果决定是否保留 WASM 运行。
两种情况:
- 应该保留 WASM 运行。
f
只是 returns. f
决定终止 WASM 功能并可能清理任何 WASM 相关资源。它可以?怎么样?
如果可以更轻松地分析更具体的示例,请考虑 execve
的工作原理。如果调用失败,它只是 returns 指示失败。然而,如果它成功了,它不会 return - 一个广泛的过度简化就是说它终止了调用者并在它的位置开始一个新的调用者(保持一些环境不变)。
可能终止调用者的唯一方法——无论调用者是 Wasm 还是 JavaScript——是抛出异常。这让调用者做出充分的反应。特别是,如果它需要进行清理,那么它应该被编写为捕获可能的异常、执行清理并重新抛出(或者,等效地,在可用时使用 try-finally 构造)。
Wasm 目前不直接支持异常处理,但可以通过 thunking 到 JavaScript 来模拟。 Wasm 的未来版本将有适当的异常处理支持。