'Pass a pointer string as an argument in host import function in Rust WebAassembly (wasmtime)

so I have the following import in my generated .wast file (disclaimer: I have not written the wasm file myself):

 (import "index" "bigDecimal.fromString" (func $fimport$1 (param i32) (result i32)))

and I need to write up the host import function in Rust. I cannot use &str in Rust but also the import requires an i32. I'm guessing I need to pass a pointer to a string, defined in Rust? Can anyone point me to the right direction? Some example of that being done in wasmtime?

let from_string = Func::wrap(&store, |a: i32| {
    println!("a={}", a);
});

Thanks a ton in advance!



Solution 1:[1]

You are right, the parameter a is a pointer to the string inside of the Wasm modules memory. You can access this via wasmtime::Memory::data_ptr(...) function. To get the memory from the caller you can add a parameter of type wasmtime::Caller to your closure. This parameter must not be in your wasm modules function signature but only in the host functions signature.

I hope this short example will help:

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;
    }
});

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 timog