WebAssemblyモジュール内にある関数ポインタにアクセスする方法はありますか?例えばJavaScriptからWebAssemblyでCスタイルの関数ポインタを呼び出す
、WebAssemblyにコンパイル以下の「モジュール」を与えられた:
extern void set_callback(void (*callback)(void *arg), void *arg);
static void callback(void *arg)
{
/* ... */
}
int main() {
set_callback(&callback, 0);
return 0;
}
JavaScriptでdo_callback
の実装では、実際の関数呼び出しを行うために仲介C関数輸出に依存することなく、コールバックを呼び出すことができます?
var instance = new WebAssembly.Instance(module, {
memory: /* ... */
env: {
set_callback: function set_callback(callbackptr, argptr) {
// We only got the pointer, is there any
},
},
});
仲介関数のエクスポートとは、公開機能を持つ内部関数を追加できるということです。
do_callback(void (*callback)(void *arg), void *arg)
{
callback();
}
その後のJavaScript set_callback
機能は、デリゲートdo_callback
機能を経由して関数ポインタを呼び出すことができます。
function set_callback(callbackptr, argptr) {
instance.exports.do_callback(callbackptr, argptr);
}
しかし、この明示的な間接化を行う必要はありませんが、これは可能ですか?
これは関数ポインタのテーブルである」として、関数テーブルの説明は基本的に読み込むよう、すでに使用し、これを試されていますそれはCスタイルの関数ポインタ "ですが、モジュールのインポート記述子にテーブルを渡すことは、観察可能な効果がなく、テーブルは空になりますか? –
@CasperBeyer私はこれをテストするために使用した実際の例を含めるために私の投稿を編集しました。 – Ghillie
Emscriptenを使用せずにテーブルとメモリのインポートを生成するclangをどうすればできますか?リンカーレベルでそれを行いますか?例えば、輸入品を含む「空の」モジュールとwasm-link? –