从JavaScript调用WebAssembly中的C样式函数指针

Cas*_*yer 6 javascript c webassembly

有没有办法访问生活在WebAssembly模块中的函数指针?

例如,给定以下编译为WebAssembly的"模块":

extern void set_callback(void (*callback)(void *arg), void *arg);

static void callback(void *arg)
{
  /* ... */
}

int main() {
  set_callback(&callback, 0);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

do_callbackJavaScript中的实现是否可以调用回调而不必依赖中间C函数导出来进行实际的函数调用?

var instance = new WebAssembly.Instance(module, {
  memory: /* ... */
  env: {
    set_callback: function set_callback(callbackptr, argptr) {
      // We only got the pointer, is there any  
    },
  },
}); 
Run Code Online (Sandbox Code Playgroud)

通过中间函数导出,我的意思是我可以添加具有公共可见性的内部函数.

do_callback(void (*callback)(void *arg), void *arg)
{
  callback();
} 
Run Code Online (Sandbox Code Playgroud)

然后JavaScript set_callback函数可以通过委托do_callback函数调用函数指针.

function set_callback(callbackptr, argptr) {
  instance.exports.do_callback(callbackptr, argptr);
}
Run Code Online (Sandbox Code Playgroud)

但是,最好是这样做而不必经过那个明确的间接,是否可能,功能表可能?

Cas*_*yer -1

当时的问题是,Clang 基本上没有实现 call_indirect,并且在代码生成期间实际上没有用任何内容填充函数表。

已在当前版本的 LLVM 中解决。