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
returnvoid
と take some 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_*
です。この間接化の目的は何ですか? dynCall_
WebAssembly コードが直接呼び出さないのはなぜですか?