call_indirect
の正しい構文は、$fsig
をtype
セクションで定義されるように期待される機能の署名であり、引数が関数(又はむしろtable
そのインデックス)のアドレスである
(call_indirect $fsig
(i32.const 0)
)
であるように見えます。例えば
テイク関数ポインタ呼び出して、次のCコードの例:
typedef void(*fp)();
void dispatch(fp x) {
x();
}
それcompilesここ
(module
(type $FUNCSIG$v (func))
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0))
(export "dispatch" (func $dispatch))
(func $dispatch (param $0 i32)
(call_indirect $FUNCSIG$v
(get_local $0)
)
)
)
には、私たちが実際に返す関数
test
を呼び出して、より完全な例であります値:
(module
(type $FUNCSIG$i (func (result i32)))
(table 1 anyfunc)
(elem (i32.const 0) $test)
(memory $0 1)
(func $test (type $FUNCSIG$i) (result i32)
(i32.const 42)
)
(func $main (result i32)
(call_indirect $FUNCSIG$i
(i32.const 0)
)
)
)
正しいです。あなたの答えに追加するには(具体的には、質問にオンラインの例はありません)、specリポジトリのテストスイートに例があります:https://github.com/WebAssembly/spec/blob/master/test/core/call_indirect.wast –
@JFBastien例を指してくれてありがとう。私はwebAsmの人はどこかのドキュメンテーションやセマンティクスのページにこのリンクを与えるべきだと思います。それらは本当に役立ちますが、誰かがテストファイルを調べることはできません。 – abhishek
@abhishekセマンティクスは、テキスト形式とはまったく別物であり、独自のものです。これは、テキスト形式が便利なだけなので、WebAssemblyのバイナリ形式を表現するためのさまざまな方法の1つです。スペックは物事が形式的に指定されている場所ですが、まだ進行中です。終了すると、テキスト形式を参照せずに形式的に両方のセマンティクスを指定し、テキスト形式を個別に指定します。 –