根据这个github评论,通过直接访问wasm实例的内存,可以重新创建从Rust/wasm返回的Uint8ClampedArray或Uint8Array:
const textureRaw = new Uint8ClampedArray(memory.buffer, texture.offset(), texture.size());问题是,wasm-bindgen生成的js文件已经实例化了一个wasm实例,我希望访问这个特定实例的内存,但它似乎不被导出:
// 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实例的内存缓冲区?
我试过:
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实例中加载?
发布于 2022-10-08 15:59:25
import { memory } from "XXXXXX_bg";这个内存导入应该可以正常工作,但是我想您尝试访问释放的内存。虽然我不知道为什么释放的内存立即显示为零。
通过使用静态内存,我创建了一个简短的示例:
#[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)
}访问下列代码的释放内存不起作用:
#[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)
}根据用例,还可以手动释放堆分配:
#[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)
}https://stackoverflow.com/questions/60199785
复制相似问题