首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wasm-bindgen:访问是m实例的内存缓冲区(来自JS)

Wasm-bindgen:访问是m实例的内存缓冲区(来自JS)
EN

Stack Overflow用户
提问于 2020-02-13 02:51:38
回答 1查看 527关注 0票数 4

根据这个github评论,通过直接访问wasm实例的内存,可以重新创建从Rust/wasm返回的Uint8ClampedArray或Uint8Array:

代码语言:javascript
复制
const textureRaw = new Uint8ClampedArray(memory.buffer, texture.offset(), texture.size());

问题是,wasm-bindgen生成的js文件已经实例化了一个wasm实例,我希望访问这个特定实例的内存,但它似乎不被导出:

代码语言:javascript
复制
// XXXXX_bg.js

const path = require('path').join(__dirname, 'ed25519_sigs_bg.wasm');
const bytes = require('fs').readFileSync(path);
let imports = {};
imports['./ed25519_sigs.js'] = require('./ed25519_sigs.js');

const wasmModule = new WebAssembly.Module(bytes);
const wasmInstance = new WebAssembly.Instance(wasmModule, imports);
module.exports = wasmInstance.exports;

如何访问当前wasm实例的内存缓冲区?

我试过:

代码语言:javascript
复制
import { memory } from "XXXXXX_bg";

// say o is returned as an object with the right offset() and size() accessors. It represents an Uint8Array in memory
let outU8A: Uint8Array = new Uint8Array(
  memory.buffer,
  o.offset(),
  o.size()
);

输出是预期的大小,但每个值都是零。这让我觉得我可能试图从第二个wasm.memory实例中加载?

EN

回答 1

Stack Overflow用户

发布于 2022-10-08 15:59:25

代码语言:javascript
复制
import { memory } from "XXXXXX_bg";

这个内存导入应该可以正常工作,但是我想您尝试访问释放的内存。虽然我不知道为什么释放的内存立即显示为零。

通过使用静态内存,我创建了一个简短的示例:

代码语言:javascript
复制
#[wasm_bindgen]
pub unsafe fn static_value() -> ByteStream {
    static mut values: [u8; 3] = [0; 3];
    let slice = values.as_mut_slice();
    slice.copy_from_slice(&[1, 2, 3]); // fill with some data
    ByteStream::new(slice)
}

访问下列代码的释放内存不起作用:

代码语言:javascript
复制
#[wasm_bindgen]
pub fn freed_heap_value() -> ByteStream {
    let mut values = Box::new([0; 3]);
    let slice = values.as_mut_slice();
    slice.copy_from_slice(&[1, 2, 3]); // fill with some data
    ByteStream::new(slice)
}

根据用例,还可以手动释放堆分配:

代码语言:javascript
复制
#[wasm_bindgen]
pub fn heap_value() -> ByteStream {
    let mut values = Box::new([0; 3]);
    let values = Box::leak(values); // has to be freed manually
    let slice = values.as_mut_slice();
    slice.copy_from_slice(&[1, 2, 3]); // fill with some data
    ByteStream::new(slice)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60199785

复制
相关文章

相似问题

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