4

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

WebAssembly.instantiate(bufferSource, importObject);

据我了解,这样做的唯一方法是导出已编译代码的类似 s 语法的文件。我在他们的文档中或通过网络搜索找不到如何做到这一点。

4

1 回答 1

4

您可以使用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;
    }
}

请注意,表和内存初始/最大值目前是猜测!我建议我们将缺失的信息添加到 JS API中。我认为在下一次 WebAssembly 会议上可能是讨论此类添加的好时机。

于 2017-06-09T04:05:12.470 回答