Код: Выделить всё
use wasm_bindgen::prelude::*;
use std::alloc::{Layout, dealloc};
#[wasm_bindgen]
pub struct ArrayBuffer {
ptr: *const u8,
len: usize,
}
#[wasm_bindgen]
impl ArrayBuffer {
#[wasm_bindgen(getter)]
pub fn ptr(&self) -> *const u8 {
self.ptr
}
#[wasm_bindgen(getter)]
pub fn len(&self) -> usize {
self.len
}
}
#[wasm_bindgen]
pub fn get_array() -> ArrayBuffer {
let data = vec![1, 2, 3, 4, 5];
let ptr = data.as_ptr();
let len = data.len();
std::mem::forget(data);
ArrayBuffer { ptr, len }
}
#[wasm_bindgen]
pub fn free_array_raw(ptr: *mut u8, len: usize) {
unsafe {
let mut v = Vec::from_raw_parts(ptr, len, len);
v.fill(0);
drop(v);
}
}
< /code>
I Compile с wasm-pack targetting nodejs < /p>
wasm-pack build --target nodejs
< /code>
Вот мой код Javascript, который я использовал для его тестирования < /p>
const wasm = require('./pkg/wasm.js');
async function run() {
const arrayBuffer = wasm.get_array();
const ptr = arrayBuffer.ptr;
const len = arrayBuffer.len;
const memory = wasm.__wasm.memory;
const uint8Array = new Uint8Array(memory.buffer, ptr, len);
console.log(uint8Array);
arrayBuffer.free();
wasm.free_array_raw(ptr, len);
console.log(uint8Array);
}
run().catch(console.error);
< /code>
Память не складывается, я все еще могу получить доступ к данным < /p>
[root@localhost wasm]# node ./main.js
Uint8Array(5) [ 1, 2, 3, 4, 5 ]
Uint8Array(5) [ 1, 2, 3, 4, 5 ]
Подробнее здесь: https://stackoverflow.com/questions/796 ... javascript