Допустим, у меня есть следующие определения в коде Rust:
#[wasm_bindgen]
pub struct RustType {
foo: usize
}
#[wasm_bindgen]
impl RustType {
#[wasm_bindgen(constructor)]
pub fn new() -> Self {
Self { foo: 100 }
}
}
#[wasm_bindgen]
pub fn print_addr(obj: &RustType) {
console_log!("rust addr = {}", obj as *const _ as u32);
}
Код JS создает экземпляр RustType
и передает его функции print_addr
:
var obj = new RustType();
print_addr(obj);
После изменения сгенерированной функции print_addr
в index_bg.js
следующим образом:
export function print_addr(obj) {
_assertClass(obj, RustType);
console.log("js addr = ", obj.ptr); // <== added this line
if (obj.ptr === 0) {
throw new Error('Attempt to use a moved value');
}
wasm.print_addr(obj.ptr);
}
в консоли разработчика я получаю следующий вывод:
js addr = 1114120
rust addr = 1114124
Возникает вопрос, почему значения указателя Rust и указателя JS различаются? Также по моим наблюдениям разница между указателем Rust и указателем JS всегда равна 4. Почему это так?