Rust wasm:如何访问当前实例的 Webassembly.Memory(来自 Rust)?

Rust wasm: How to access Webassembly.Memory of current instance (from Rust)?

查看js_sys::Uint8Array::new_with_byte_offset_and_length

的函数签名
pub fn new_with_byte_offset_and_length(
    buffer: &JsValue,
    byte_offset: u32,
    length: u32
) -> Uint8Array

它需要一个参数 buffer 来引用当前 wasm 实例的内存缓冲区。

如何从 Rust 端访问这样的对象? (被编译成 wasm)

It needs an argument buffer which refers to the current wasm instance's memory buffer.

首先,值得注意的是,这不一定是真的。该绑定适用于标准 JavaScript API - Uint8Array - 它允许您从任意缓冲区或容量创建字节数组。

如果您只想将字节数组视图传递给 Rust 内存或将 Rust 内存中的 return 字节传递给 JavaScript,则您并不需要此构造函数 - 为此,请使用 wasm-bindgen 的标准功能和 pass/return &[u8]Vec<u8> 就像在常规 Rust 代码中一样。

但是,为了以防万一,回答你问题的第二部分

How do I access such an object from the Rust side ? (that gets compiled to wasm)

从 Rust 方面,您可以使用 wasm_bindgen::memory, which will give you a memory instance. By default it returns it as a generic JsValue, but you can cast it into WebAssembly.Memory.unchecked_into::<js_sys::WebAssembly::Memory>(),反过来,如果需要,您可以访问 buffer 属性。

请注意,为 Rust 内存创建短期 Uint8Array 视图也是在内置 API js_sys::Uint8Array::view 中实现的,但它被标记为 unsafe一个很好的理由:buffer 可以在任何分配上失效,许多内置 APIs 调用,因此您需要非常小心地处理此类视图并确保它们在创建后立即使用。同样,避免问题的最佳方法是根本不依赖这种低级别访问,而是使用 #[wasm_bindgen] 生成任何绑定。