c/c++语言开发共享从JavaScript调用WebAssembly中的C样式函数指针

有没有办法访问生活在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; } 

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

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

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

 do_callback(void (*callback)(void *arg), void *arg) { callback(); } 

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

 function set_callback(callbackptr, argptr) { instance.exports.do_callback(callbackptr, argptr); } 

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

    您可以从Javascript调用函数指针。

    函数指针存储在表中。 当函数指针传递给Javascript时,您将在表中接收该函数指针的整数索引。 将该索引传递给Table.prototype.get() ,您可以调用该函数。

     ... set_callback: function set_callback(callbackptr, argptr) { tbl.get(callbackptr)(argptr); }, ... 

    您可以在“表”部分的MDN页面上阅读更多相关信息: https : //developer.mozilla.org/en-US/docs/WebAssembly/Using_the_JavaScript_API#Tables

    编辑:这是我用来测试它的最小例子。

    第一个文件是使用fptr.c编译的emcc fptr.c -Os -s WASM=1 -s SIDE_MODULE=1 -o fptr.wasm

     typedef int (*fptr_type)(void); extern void pass_fptr_to_js(fptr_type fptr); static int callback_0(void) { return 26; } static int callback_1(void) { return 42; } void run_test() { pass_fptr_to_js(callback_0); pass_fptr_to_js(callback_1); } 

    这是fptr.html

         WebAssembly Experiment   

    Check the console.

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

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

    需要了解更多c/c++开发分享从JavaScript调用WebAssembly中的C样式函数指针,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享从JavaScript调用WebAssembly中的C样式函数指针相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979017.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐