WebAssembly Table.add()添加函数后调用报错,如何解决?
在尝试用WebAssembly Table对象管理导入函数时遇到了问题。我按照文档把importObject里的函数添加到Table里,但运行时控制台报错说函数不可调用:
const importObj = {
env: {
log: (msgPtr) => console.log(wasm.UTF8ToString(msgPtr))
}
};
const table = new WebAssembly.Table({initial: 1, element: "anyfunc"});
table.set(0, importObj.env.log); // 这里有没有搞错?
WebAssembly.instantiateStreaming(fetch('test.wasm'), importObj)
.then(obj => {
obj.instance.exports.run(); // 这里报错说调用无效函数
});
wasm代码里通过(invoke “log” (get_global $func))的方式调用表项,但始终提示”Call to null/undefined function”。查了MDN发现可能和Table类型有关,但不知道具体哪里设置错了。
anyfunc已经被废弃了,要用funcref。修改 Table 创建时的类型,像这样:记得把
table放到importObj里一起导入,应该能用。anyfunc类型上,这是 WebAssembly 早期版本的东西,在现在的规范里已经被废弃了。你需要用funcref来代替。试试这个方法:
1. 创建 Table 的时候指定元素类型为
funcref:2. 然后把函数正确添加到 Table 中:
3. 最重要的是,确保你的 Wasm 模块能够正确引用这个 Table。如果你直接用
importObject,需要把它挂载到正确的命名空间下。可以这样调整:这样修改后,Wasm 模块就能通过 Table 正确找到对应的函数了。
顺便提醒一下,Wasm 的调试确实挺麻烦的,尤其是这种和 JS 交互的问题。如果还有类似报错,可以先检查 Table 的大小是否足够、函数索引是否正确。有时候真的是些不起眼的小细节搞出来的麻烦事。