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

WebAssembly.instantiate(bufferSource, importObject);

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

最佳答案

您可以使用诸如wabtwasm2wast之类的工具将.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 session 上可能是讨论添加此类内容的好时机。

关于rust - 从WebAssembly .wasm模块获取JavaScript导入对象条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44444050/

10-10 18:34