导入器模块:
(module
(type $GG (func (param i32) (result i32)))
(import "low" "load" (func $load (param i32) (result i32)))
(table (import "low" "table") 2 anyfunc)
(func (export "func_0") (result i32)
(call_indirect $GG (i32.const 0) (i32.const 0))
)
)
出口商模块:
(module
(table 2 anyfunc)
(memory $0 100)
(export "memory" (memory $0))
(export "load" (func $local))
(func $local (param $0 i32) (result i32)
(i32.load (get_local $0))
)
)
我正在尝试将以下两个模块编译为wasm
,然后使用JS API加载。我正在尝试使用以下JS代码来进行导入工作:
var h = fetch("test.wasm")
.then(function(response) {
return response.arrayBuffer();
})
var l = fetch("low.wasm").
then(function(response){
return response.arrayBuffer();
})
var exp = l.then( function(buffer){
var moduleBufferView = new Uint8Array(buffer);
WebAssembly.instantiate(moduleBufferView)
.then(function(instantiated) {
const instance = instantiated.instance;
return instance.exports
})
})
fetch("test.wasm")
.then(function(response) {
return response.arrayBuffer();
})
.then(function(buffer) {
var moduleBufferView = new Uint8Array(buffer);
WebAssembly.instantiate(moduleBufferView, exp)
.then(function(instantiated) {
const instance = instantiated.instance;
document.getElementById('res').innerHTML = instance.exports.func_0();
})
});
使用引用解释器进行编译时出现以下错误:
test.wast:4.8-4.67: link failure: unknown import "low"."load"
。
错误确实有意义,测试模块在编译时不知道低,但我如何将它们链接在一起?
答案 0 :(得分:2)
默认情况下,引用解释器在其输入脚本中解释(即,执行并实例化)模块定义。如果你想在格式之间将它用于convert文件,那么你必须像例如一样调用。
wasm -d module.wat -o module.wasm
请参阅口译员section on converting files中的README。
顺便说一下,你的程序中的表永远不会被初始化,所以call_indirect
只会陷阱。您的JavaScript粘合剂看起来有点奇怪:例如,instance.exports.()
不是有效的JavaScript,为什么要尝试将它分配给DOM节点?