在这种情况下,Wasm编译超出了内部限制,针对提供的参数。

4

我将尝试从ArrayBuffer创建一个WebAssembly模块。

C代码:

#include <stdio.h>

int main() {
      printf("hello, world!\n");
        return 0;
}

我这样编译它:
$ emcc -O2 hello.c -s WASM=1 -o hello.html

我启动一个本地的http服务器。 然后我尝试在浏览器中这样加载它:

fetch('hello.wasm')
.then(res => res.arrayBuffer())
.then(buff => WebAssembly.Module(buff));

我遇到了以下错误:

Uncaught (in promise) RangeError: WebAssembly.Module(): Wasm编译在此上下文中超出了提供的参数的内部限制 at fetch.then.then.buff (:1:77) at

我不知道如何解决这个错误,而且在网上搜索也找不到任何有用的信息。

如果能得到帮助,将不胜感激。

谢谢!

1个回答

2

WebAssembly.Module是同步的,但一些浏览器不允许在主线程上使用大型模块,以避免编译阻塞主线程。

请尝试以下方法:

fetch('hello.wasm').then(response =>
    response.arrayBuffer()
).then(buffer =>
    WebAssembly.instantiate(buffer, importObj)
).then(({module, instance}) =>
    instance.exports.f()
);

最好使用WebAssembly.instantiate,因为它可以同时进行编译和实例化操作,并允许引擎保持importObject以确保一切正常(特别是WebAssembly.Memory)。

在这里,我假设你想要的不仅仅是main函数,而是想调用你模块导出的函数 f


嗯,但在你之前的问题的回答中,你说我可以动态创建importObj,这意味着使用工厂函数WebAssembly.Module()。 - Andrei CACIO
我该如何创建 importObject - Andrei CACIO
熟悉WebAssembly的常规使用者已经知道importObject将包含什么,因此对于大多数人来说,WebAssembly.instance是正确的API。如果您真的不知道它将包含什么,则可以使用WebAssembly.compile获取WebAssembly.Module,然后使用WebAssembly.instantiate。这仍然是基于Promise的,但是将编译/实例化分开,并允许您在获取模块后创建importObject - JF Bastien
我已经使用WebAssembly.compile()成功获取了一个**模块(Module)**实例,但是我遇到了另一个错误。我会发布另一个问题来解决它。感谢您的帮助! - Andrei CACIO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接