#host #wasi #arguments #results #complex #structure

wasi-binio-wasm

允许在主机和 wasm 之间将复杂数据结构作为函数参数和结果传递

2 个版本

0.1.1 2020 年 4 月 5 日
0.1.0 2020 年 4 月 2 日

#1082 in WebAssembly

MIT 许可证

8KB

构建

cargo wasi build

lib.rs:

wasi_binio_host 和 wasi_binio_wasm

wasi_binio_wasm 是 wasm_binio 的 WebAssembly 库。另一个库是 wasi_binio_host,它在主机中使用。wasi_binio_host 创建一个 call_stub,以便主机可以调用具有复杂数据结构参数和结果的 WebAssembly 函数。wasi_binio_wasm 准备线性内存缓冲区并导出所需的 wasm 函数,以便主机可以调用。

截至今天,wasm 函数只能接受 i32、i64、f32、f64 类型。如果您在 wasm 中有如下函数 In wasm: do_compute(point1: &Point, point2: &Point)->Rect {...},无法直接从主机调用。借助 wasm_binio 的帮助,我们可以调用 call_stub 函数并像这样发送参数和结果

主机中的代码

let result: Rect = call_stub(&instance, &(point1, point2), "do_compute")

wasm 中的代码

#[no_mangle]
fn do_compute(ptr:i32, buffer_size: i32)->i64{
   let point_tuple : (Point, Point) = wasi_binio_wasm::wasm_deserialize(ptr, buffer_size).unwrap();
   let rect: Rect = some_how_make_a_rect_from_two_points()... /* Your own logic here */
   wasi_binio_wasm::wasm_serialize(&rect).unwrap()
}
Since wasm and wasi are under active development. Wasi will soon provide complex arguments support.
At the time you find this crate, this feature probably have already been supported natively.

依赖项

~0.6–1.2MB
~29K SLoC