Передайте строку указателя в качестве аргумента в функции импорта хоста в Rust WebAassembly (wasmtime)
поэтому у меня есть следующий импорт в моем сгенерированном файле .wast (отказ от ответственности: я сам не записывал файл wasm):
(import "index" "bigDecimal.fromString" (func $fimport$1 (param i32) (result i32)))
и мне нужно написать функцию импорта хоста в Rust. Я не могу использовать & str в Rust, но для импорта также требуется i32. Я предполагаю, что мне нужно передать указатель на строку, определенную в Rust? Может ли кто-нибудь указать мне правильное направление? Какой-нибудь пример того, что было сделано в wasmtime?
let from_string = Func::wrap(&store, |a: i32| {
println!("a={}", a);
});
Заранее спасибо!
1 ответ
Вы правы, параметр
a
является указателем на строку внутри памяти модулей Wasm. Вы можете получить доступ к этому через
wasmtime::Memory::data_ptr(...)
функция. Чтобы получить память от вызывающего абонента, вы можете добавить параметр типа
wasmtime::Caller
к вашему закрытию. Этот параметр не должен быть в подписи функции вашего модуля wasm, а только в подписи функции хоста.
Я надеюсь, что этот короткий пример поможет:
let read_wasm_string_func = Func::wrap(&store, |mut caller: Caller<'_, WasiCtx>, ptr_wasm: i32| -> i32 {
let memory = caller.get_export("memory").unwrap().into_memory().unwrap();
unsafe {
let ptr_native = memory.data_ptr(&caller).offset(ptr_wasm as isize);
// Do something with the pointer to turn it into a number
// return int
return num;
}
});