Передайте строку указателя в качестве аргумента в функции импорта хоста в 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;
    }
});
Другие вопросы по тегам