2
有使用indirect_call
网上提供的任何实例。基于语义文档,我试过如何在WebAssembly中使用`indirect_call`?
(call_indirect
(i32.const 0)
(i32.const 0)
)
数字是随机的,但不是给出运行时错误,而是我所期望的。我正在解析错误。
什么是call_indirect
正确的语法?
有使用indirect_call
网上提供的任何实例。基于语义文档,我试过如何在WebAssembly中使用`indirect_call`?
(call_indirect
(i32.const 0)
(i32.const 0)
)
数字是随机的,但不是给出运行时错误,而是我所期望的。我正在解析错误。
什么是call_indirect
正确的语法?
为call_indirect
的正确语法似乎是
(call_indirect $fsig
(i32.const 0)
)
凡$fsig
是如在type
部分中定义的预期功能签名和参数是函数的地址(或更确切地说,其在table
指数) 。
就拿下面的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二进制格式之一。规范是事物被正式指定的地方,但它仍然是一个正在进行的工作。完成后,它将正式指定两种语义,而不参考文本格式,并将分别指定文本格式。 –