Как мне прочитать структуру кортежа из буфера памяти Wasm? - PullRequest
0 голосов
/ 05 августа 2020

Я определил структуру кортежа:

pub struct ChangedCell(pub bool, pub u32, pub u32);

Мое предположение

ChangedCell весит 9 байт (bool: 1 байт, u32 : 4 байта, u32: 4 байта)

Что я сделал

Я вернул pointer, length для Vec<ChangedCell> на JavaScript:

const arr = new Uint8Array(memory.buffer, pointer, length * 9);
function getElements(n,arr) {

    const isVal = arr[n * 9 + 0];
    const val1 = arr.slice(n * 9 + 1, n * 9 + 5);
    const val2 = arr.slice(n * 9 + 5, n * 9 + 9);
    return {isVal,val1,val2}
}

Ожидаемое поведение

  • isVal должно быть [byte]
  • val1 должно быть [byte] * 4
  • val2 должно быть [byte] * 4

Вопрос

Как вы читаете что-то подобное в JavaScript?

1 Ответ

5 голосов
/ 05 августа 2020

Прежде всего, если вы собираетесь использовать конкретный макет, вы должны пометить свой тип как repr(C):

#[repr(C)]
pub struct ChangedCell(pub bool, pub u32, pub u32);

Вероятно, вы получите тот же макет с нашим без repr(C), но вы получите гарантию только в том случае, если напишете его явно.

Теперь вам гарантирован C совместимый макет, который (остерегайтесь заполнения!) в wasm32 будет:

  • bool: по смещению 0 , 1 байт, 0x00 или 0x01.
  • u32: по смещению 4 , 4 байта,
  • u32 : по смещению 8 , 4 байта,

Общий размер: 12 байтов. Байты 1, 2 и 3 являются заполнителями и поэтому не используются.

...