1

当编译成 WebAssembly 时,emscripten 会生成类似invoke_vii. 他们的目的是什么?

细节:

从 C 编译的 WebAssembly 模块emcc -s WASM=1 -g期望宿主环境提供各种功能。

...
(import "env" "abortOnCannotGrowMemory" (func $import$9 (result i32)))
(import "env" "invoke_vii" (func $import$10 (param i32 i32 i32)))
(import "env" "___syscall221" (func $import$11 (param i32 i32) (result i32)))
...

我正在开发一个用 C 编写的 WebAssembly 解释器。所以我必须处理提供这些功能,但我对 , 之类的功能感到invoke_vii目瞪口呆invoke_iiii

后缀显然与调用签名有关。例如,vii表示返回void并取一些ints。名称调用表明该函数应该调用某些东西。

除了在 emscripten 生成的 Java Script 代码中的实现之外,我找不到有关这些函数的信息:

function invoke_ii(index,a1) {
  # removed error checking for brevity
  return Module["dynCall_ii"](index,a1);
}

dynCall_ii存在于 WebAssembly 模块中。

似乎所有invoke_*功能都是指示解释器运行相应的dynCall_*功能。这种间接的目的是什么?为什么 WebAssembly 代码不dynCall_直接调用?

4

1 回答 1

2

这些用于处理 setjmp/longjmp 以及 C++ 异常。在这些机制中,JavaScript 需要能够回调 WebAssembly 并调用 WebAssembly 间接函数表中的函数。

如果您没有例外地构建并且使用-s SUPPORT_LONGJMP=0(不是默认值),您根本不应该看到任何这些功能。

于 2020-09-29T05:16:47.313 回答