4.1 KiB
Wasmer Runtime
Wasmer is a standalone JIT WebAssembly runtime, aiming to be fully compatible with Emscripten, Rust and Go. Learn more.
This crate represents the high-level runtime API, making embedding WebAssembly in your application easy, efficient, and safe.
How to use Wasmer Runtime
The easiest way is to use the instantiate
function to create an
Instance
. Then you can use call
or func
and then
call
to call an exported function safely.
Example
Given this WebAssembly:
(module
(type $t0 (func (param i32) (result i32)))
(func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
get_local $p0
i32.const 1
i32.add))
compiled into Wasm bytecode, we can call the exported add_one
function:
static WASM: &'static [u8] = &[
// The module above compiled to bytecode goes here.
0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x60,
0x01, 0x7f, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x07, 0x0b, 0x01, 0x07,
0x61, 0x64, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x00, 0x00, 0x0a, 0x09, 0x01,
0x07, 0x00, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x0b, 0x00, 0x1a, 0x04, 0x6e,
0x61, 0x6d, 0x65, 0x01, 0x0a, 0x01, 0x00, 0x07, 0x61, 0x64, 0x64, 0x5f,
0x6f, 0x6e, 0x65, 0x02, 0x07, 0x01, 0x00, 0x01, 0x00, 0x02, 0x70, 0x30,
];
use wasmer_runtime::{
instantiate,
DynFunc,
Value,
imports,
error,
};
fn main() -> error::Result<()> {
// We're not importing anything, so make an empty import object.
let import_object = imports! {};
let instance = instantiate(WASM, &import_object)?;
let values = instance
.exports
.get::<DynFunc>("add_one")?
.call(&[Value::I32(42)])?;
assert_eq!(values[0], Value::I32(43));
Ok(())
}
Additional Notes
The wasmer-runtime
crate is built to support multiple compiler
backends. We support having a Cranelift backend in the
wasmer-clif-backend
crate, a LLVM backend in the
[wasmer-llvm-backend
] crate, and the Singlepass backend in the
[wasmer-singlepass-backend
] crate. Currently, the Cranelift backend
is the default.
You can specify the compiler you wish to use with the compile_with
function.