首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以从在JavaScript中导入的主机函数之一访问WebAssembly实例的导出内存?

是否可以从在JavaScript中导入的主机函数之一访问WebAssembly实例的导出内存?
EN

Stack Overflow用户
提问于 2021-08-31 17:34:35
回答 1查看 318关注 0票数 1

我手写了一些WebAssembly模块,以了解它们是如何工作的。现在我正在尝试了解导入和导出是如何工作的,以及如何执行IO。

该模块如下:

代码语言:javascript
复制
(module
  (import "env" "print_string" (func $print_string (param i32)))

  (func $main (result i32)
    i32.const 1024
    call $print_string

    i32.const 0
  )

  (memory $memory 2)
  (data (i32.const 1024) "example\00")

  (export "memory" (memory $memory))
  (export "main" (func $main))
)

到目前为止,我一直在使用wasmtime (这是一个用Rust编写的WebAssembly应用程序接口)来运行这个模块。使用wasmtime,我可以实例化一个Linker,它将负责包装我传递给模块的来自主机的print_string函数。包装的print_string函数可以访问一个额外的Caller参数,它允许我检查实例化的模块导出,获取内存并从中读取以null结尾的字符串。这使我既可以导出内存,又可以在导入的函数中访问实例化模块的内存。

在WebAssembly的JavaScript应用程序接口中,这是可能的吗?我正在查看可用的here应用程序接口,但似乎没有任何东西表明这是可能的。

我在JavaScript应用程序接口中看到的唯一解决方案是:模块还从主机导入内存,而不是从模块导出内存。这样,导入的函数也可以访问内存对象。理想情况下,我希望模块导出自己的内存。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-01 07:09:35

至少在Javascript中你可以这样做

代码语言:javascript
复制
new Uint8Array(wasmInstance.exports.memory.buffer)

访问导出为Byte Array的整个内存。例如,我使用它将内存的第一个字节导出到画布中

代码语言:javascript
复制
  var wasmModule = new WebAssembly.Module(bytes);
  var wasmInstance = new WebAssembly.Instance(wasmModule,{
    gfx: {
      flip: function() {
        imageData.data.set(new Uint8Array(wasmInstance.exports.mem.buffer,0,canvasWidth*canvasHeight*4));
        ctx.putImageData(imageData, 0, 0);
      }
    }
  });
  wasmInstance.exports.init();

你可以在这里看到整个演示:http://worlddominationcommittee.org/~lee/filez/wasm/test5.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69003106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档