如何在WebAssembly中使用`indirect_call`?

时间:2017-08-16 12:41:58

标签: webassembly

没有使用indirect_call在线提供的示例。根据语义文档,我试过

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

数字是随机的,但不是给出我预期的运行时错误。我正在解析错误。

call_indirect的正确语法是什么?

1 个答案:

答案 0 :(得分:4)

call_indirect的正确语法似乎是

(call_indirect $fsig
   (i32.const 0)
)

其中$fsigtype部分中定义的预期函数签名,参数是函数的地址(或者更确切地说是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)
    )
  )

)