如何链接多个webassembly模块?我正在使用引用解释器将S-exp编译为wasm?

时间:2017-09-29 21:32:10

标签: webassembly

导入器模块:

(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"

错误确实有意义,测试模块在编译时不知道低,但我如何将它们链接在一起?

1 个答案:

答案 0 :(得分:2)

默认情况下,引用解释器在其输入脚本中解释(即,执行并实例化)模块定义。如果你想在格式之间将它用于convert文件,那么你必须像例如一样调用。

wasm -d module.wat -o module.wasm

请参阅口译员section on converting files中的README

顺便说一下,你的程序中的表永远不会被初始化,所以call_indirect只会陷阱。您的JavaScript粘合剂看起来有点奇怪:例如,instance.exports.()不是有效的JavaScript,为什么要尝试将它分配给DOM节点?