美文网首页WebAssembly
[wasm] WebAssembly.instantiate

[wasm] WebAssembly.instantiate

作者: 何幻 | 来源:发表于2018-05-16 15:39 被阅读189次

    WebAssembly.instantiate() 是编译和实例化 WebAssembly 代码的主要方法,
    这个方法有两个重载方式:

    (1)第一种重载使用WebAssembly二进制代码的 typed arrayArrayBuffer 形式进行编译和实例化。
    返回的 Promise 会携带已编译的 WebAssembly.Module 和它的第一个实例化对象 WebAssembly.Instance

    (2)第二种重载使用已编译的 WebAssembly.Module , 返回的 Promise 携带一个 Module的实例化对象 Instance. 如果这个 Module 已经被编译了或者是从缓存中获取的,那么这种重载方式是非常有用的。

    1. 使用二进制bufferSource实例化

    用法,

    Promise<ResultObject> WebAssembly.instantiate(bufferSource [,importObject]);
    

    参数解释,
    (1)bufferSource
    一个包含你想编译的wasm模块二进制代码的 typed array(类型数组)或 ArrayBuffer(数组缓冲区)。

    (2)importObject 可选
    一个将被导入到新创建实例中的对象,它包含的值有,函数、WebAssembly.Memory 对象等等。

    返回值解释,
    ResultObject包含两个属性,Promise<ResultObject>是一个Promise,
    (1)module,一个被编译好的 WebAssembly.Module 对象
    (2)instance,一个包含所有 Exported WebAssembly functionsWebAssembly.Instance 对象。

    异常,
    (1)如果参数的类型或结构不正确,将会抛出异常 TypeError
    (2)如果操作失败,promise 将会被 reject 掉,根据失败的原因不同,会抛出3种异常,
    WebAssembly.CompileErrorWebAssembly.LinkError, 或WebAssembly.RuntimeError

    2. 使用已编译的module实例化

    用法,

    Promise<WebAssembly.Instance> WebAssembly.instantiate(module [,importObject]);
    

    参数解释,
    (1)module,
    将被实例化的 WebAssembly.Module 对象。

    (2)importObject 可选,同bufferSource用法

    返回值解释,
    一个解析为 WebAssembly.Instance 的Promise 对象。

    异常,
    同bufferSource用法

    3. 例子

    const importObject = {
      imports: {
        imported_func(arg) {
          console.log(arg);
        }
      }
    };
    
    async function f(){
        const response = await fetch('simple.wasm');
        const bufferSource = await response.arrayBuffer();
    
        const result = await WebAssembly.instantiate(bufferSource, importObject);
        const {instance:{exports:exported_func}} = result;
    
        exported_func();
    }
    
    f();
    

    注:
    (1)fetch会返回一个Promise,其中包含了Response对象,
    Response继承了Body,可以调用Body.arrayBuffer()方法,
    会将Response转换为一个包含ArrayBuffer的Promise。

    (2)WebAssembly.Instance对象的exports属性是只读的,它是属性值是一个对象,
    包含了所有WebAssembly模块中导出的方法(Exported WebAssembly functions),这些方法被JavaScript包装好了,自动做了一个参数转换,例如把JavaScript中的number转换为Int32

    除了Instance.exports之外,还可以使用Table.prototype.get()来获取这些方法。


    参考

    MDN: WebAssembly.instantiate()
    MDN: Fetch API
    MDN: Response
    MDN: Body
    MDN: Body.arrayBuffer()
    MDN: WebAssembly.Instance.prototype.exports
    MDN: Exported WebAssembly functions

    相关文章

      网友评论

        本文标题:[wasm] WebAssembly.instantiate

        本文链接:https://www.haomeiwen.com/subject/zkspdftx.html