2017-08-16 3 views
2

オンラインでindirect_callを使用する例はありません。セマンティクスのドキュメントに基づいて、私が試したWebAssemblyで `indirect_call`を使うには?

(call_indirect 
    (i32.const 0) 
    (i32.const 0) 
    ) 

番号はランダムであるが、代わりに私が期待していた実行時エラーを与えます。解析エラーが発生しています。

call_indirectの正しい構文は何ですか?

答えて

1

call_indirectの正しい構文は、$fsigtypeセクションで定義されるように期待される機能の署名であり、引数が関数(又はむしろ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) 
    ) 
) 

) 
+0

正しいです。あなたの答えに追加するには(具体的には、質問にオンラインの例はありません)、specリポジトリのテストスイートに例があります:https://github.com/WebAssembly/spec/blob/master/test/core/call_indirect.wast –

+0

@JFBastien例を指してくれてありがとう。私はwebAsmの人はどこかのドキュメンテーションやセマンティクスのページにこのリンクを与えるべきだと思います。それらは本当に役立ちますが、誰かがテストファイルを調べることはできません。 – abhishek

+0

@abhishekセマンティクスは、テキスト形式とはまったく別物であり、独自のものです。これは、テキスト形式が便利なだけなので、WebAssemblyのバイナリ形式を表現するためのさまざまな方法の1つです。スペックは物事が形式的に指定されている場所ですが、まだ進行中です。終了すると、テキスト形式を参照せずに形式的に両方のセマンティクスを指定し、テキスト形式を個別に指定します。 –

関連する問題