从 WebAssembly .wasm 模块获取 JavaScript 个导入对象条目
Obtaining JavaScript import object entries from a WebAssembly .wasm module
我想了解 Rust 程序在编译为 wasm 文件时实际导出的内容,以便我可以为实例化函数提供有效的 importObject
:
WebAssembly.instantiate(bufferSource, importObject);
据我所知,执行此操作的唯一方法是导出编译代码的类似 s-syntax 的文件。我无法在他们的文档中或通过网络搜索找到如何执行此操作。
您可以使用 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;
}
}
请注意 Table 和内存初始值/最大值目前是猜测!我提议我们 add the missing information to the JS API。我认为在下一次 WebAssembly 会议上可能是讨论这种添加的好时机。
我想了解 Rust 程序在编译为 wasm 文件时实际导出的内容,以便我可以为实例化函数提供有效的 importObject
:
WebAssembly.instantiate(bufferSource, importObject);
据我所知,执行此操作的唯一方法是导出编译代码的类似 s-syntax 的文件。我无法在他们的文档中或通过网络搜索找到如何执行此操作。
您可以使用 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;
}
}
请注意 Table 和内存初始值/最大值目前是猜测!我提议我们 add the missing information to the JS API。我认为在下一次 WebAssembly 会议上可能是讨论这种添加的好时机。