从WebAssembly .wasm模块获取JavaScript导入对象条目

时间:2017-06-08 19:26:58

标签: rust emscripten webassembly

我想了解Rust程序在编译为wasm文件时实际导出的内容,以便我可以为实例化函数提供有效的importObject

WebAssembly.instantiate(bufferSource, importObject);

据我了解,唯一的方法是导出一个类似已编译代码的s语法文件。我无法在他们的文档或网络搜索中找到如何执行此操作。

1 个答案:

答案 0 :(得分:3)

您可以使用wabt wasm2wast之类的工具将.wasm文件翻译为等效的.wast。那就是你所要求的。

但是,您不一定需要这样做! JavaScript API为您提供了大多数您想要的内容:

let arrayBuffer = ...; // Somehow get your .wasm file into an ArrayBuffer. XHR, from a string, or what have you.
let module = WebAssembly.Module(arrayBuffer); // This is the synchronous API! Only use it for testing / offline things.

let importObject = {};
for (let imp of WebAssembly.Module.imports(module)) {
    if (typeof importObject[imp.module] === "undefined")
        importObject[imp.module] = {};
    switch (imp.kind) {
    case "function": importObject[imp.module][imp.name] = () => {}; break;
    case "table": importObject[imp.module][imp.name] = new WebAssembly.Table({ initial: ???, maximum: ???, element: "anyfunc" }); break;
    case "memory": importObject[imp.module][imp.name] = new WebAssembly.Memory({ initial: ??? }); break;
    case "global": importObject[imp.module][imp.name] = 0; break;
    }
}

请注意,表和内存的初始/最大值是当前的猜测!我建议我们add the missing information to the JS API。我认为在下一次WebAssembly会议上讨论这样的补充可能是个好时机。