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]
生成任何绑定。
查看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]
生成任何绑定。