Rust wasm: Как получить доступ к Webassembly.Memory текущего экземпляра (из Rust)? - PullRequest
0 голосов
/ 13 февраля 2020

Просмотр сигнатуры функции 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)

1 Ответ

1 голос
/ 28 февраля 2020

Требуется буфер аргументов, который ссылается на буфер памяти текущего экземпляра wasm.

Прежде всего, стоит отметить, что это не обязательно так. Эта привязка предназначена для стандартного JavaScript API - Uint8Array - который позволяет создавать байтовые массивы из произвольных буферов или емкости.

Вам не нужен этот конструктор, если вы просто хотите передать представление байтового массива в память Rust или вернуть байты в памяти Rust в JavaScript - для этого вместо этого используйте стандартные возможности wasm-bindgen и передайте / верните &[u8] или Vec<u8>, как в случае с обычный код Rust.

Однако, чтобы ответить на вашу вторую часть вопроса на всякий случай

Как получить доступ к такому объекту со стороны Rust? (компилируется в wasm)

Со стороны Rust вы можете использовать wasm_bindgen::memory, что даст вам экземпляр памяти. По умолчанию он возвращает его как шаблон c JsValue, но вы можете преобразовать его в WebAssembly.Memory, используя .unchecked_into::<js_sys::WebAssembly::Memory>(), что, в свою очередь, позволит вам получить доступ к свойству buffer вам это нужно.

Обратите внимание, что создание кратковременных Uint8Array представлений в Rust памяти, как это, также реализовано во встроенном API js_sys::Uint8Array::view, но оно помечено unsafe по уважительной причине: buffer может быть признано недействительным при любом выделении, которое вызывается множеством встроенных API-интерфейсов, поэтому вам нужно очень осторожно обращаться с такими представлениями и убедиться, что они используются сразу после создания. Лучший способ избежать проблем, опять же, вообще не полагаться на такой низкоуровневый доступ, а вместо этого использовать #[wasm_bindgen] для генерации любых привязок.

...