emscripten生成的invoke_ *函数的用途

时间:2017-08-04 16:19:10

标签: emscripten webassembly

编译到WebAssembly时,emscripten会生成invoke_vii之类的函数。他们的目的是什么?

详细信息:

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

...
(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_viiinvoke_iiii等函数感到茫然。

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

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

function invoke_ii(index,a1) {
  # removed error checking for brevity
  return Module["dynCall_ii"](index,a1);
}
WebAssembly模块中存在

dynCall_ii

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

1 个答案:

答案 0 :(得分:2)

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

如果构建时无例外且使用-s SUPPORT_LONGJMP=0(不是默认设置),则根本看不到任何这些功能。