【问题标题】:Obtaining JavaScript import object entries from a WebAssembly .wasm module从 WebAssembly .wasm 模块获取 JavaScript 导入对象条目
【发布时间】:2017-06-08 19:26:58
【问题描述】:

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

WebAssembly.instantiate(bufferSource, importObject);

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

【问题讨论】:

    标签: rust emscripten webassembly


    【解决方案1】:

    您可以使用诸如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 会议上可能是讨论此类添加的好时机。

    【讨论】:

    • 不错的方法。没想到你能做到。谢谢!
    • 正如我提交的错误所说,它仍然有点缺乏!如果有人发现 JavaScript API 中缺少额外的东西,请做文件错误记录用例,如果你有创意,建议一个 API 来修复你正在尝试做的事情。随着人们开始使用 WebAssembly,预计他们会在以后发现我们忽略或弃用的东西。
    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 2021-03-22
    • 2019-12-31
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多