当编译成 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
并取一些int
s。名称调用表明该函数应该调用某些东西。
除了在 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_
直接调用?