编译到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_vii
,invoke_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_
?
答案 0 :(得分:2)
这些用于处理setjmp / longjmp以及C ++异常。在这些机制中,JavaScript需要能够回调WebAssembly并调用WebAssembly间接函数表中的函数。
如果构建时无例外且使用-s SUPPORT_LONGJMP=0
(不是默认设置),则根本看不到任何这些功能。