Crates.io | wasm_runtime_layer |
lib.rs | wasm_runtime_layer |
version | 0.4.0 |
source | src |
created_at | 2023-08-14 17:34:49.69038 |
updated_at | 2024-05-11 00:38:43.932514 |
description | Compatibility interface for WASM runtimes. |
homepage | |
repository | https://github.com/DouglasDwyer/wasm_runtime_layer |
max_upload_size | |
id | 944387 |
size | 72,448 |
wasm_runtime_layer
creates a thin abstraction over WebAssembly runtimes, allowing for backend-agnostic host code. The interface is based upon the wasmtime
and wasmi
crates, but may be implemented for any runtime.
To use this crate, first instantiate a backend runtime. The runtime may be any
value that implements backend::WasmEngine
. Some runtimes are already implemented as additional crates.
Then, one can create an Engine
from the backend runtime, and use it to initialize modules and instances:
// 1. Instantiate a runtime
let engine = Engine::new(wasmi_runtime_layer::Engine::default());
let mut store = Store::new(&engine, ());
// 2. Create modules and instances, similar to other runtimes
let module_bin = wat::parse_str(
r#"
(module
(type $t0 (func (param i32) (result i32)))
(func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
local.get $p0
i32.const 1
i32.add))
"#,
)
.unwrap();
let module = Module::new(&engine, std::io::Cursor::new(&module_bin)).unwrap();
let instance = Instance::new(&mut store, &module, &Imports::default()).unwrap();
let add_one = instance
.get_export(&store, "add_one")
.unwrap()
.into_func()
.unwrap();
let mut result = [Value::I32(0)];
add_one
.call(&mut store, &[Value::I32(42)], &mut result)
.unwrap();
assert_eq!(result[0], Value::I32(43));
WasmEngine
trait for wrappers around wasmtime::Engine
instances.WasmEngine
trait for wrappers around wasmtime::Engine
instances.wasm32-unknown-unknown
targets.Contributions for additional backend implementations are welcome!
To run the tests for wasmi and wasmtime, run:
cargo test
For the wasm32 target, you can use the slower interpreter wasmi, or the native JIT accelerated browser backend.
To test the backends, you need to install wasm-pack
.
You can then run:
wasm-pack test --node