tinywasm 0.9.0

A tiny WebAssembly interpreter
Documentation
use criterion::{Criterion, criterion_group, criterion_main};
use eyre::Result;
use tinywasm::engine::Config;
use tinywasm::{Engine, FuncContext, HostFunction, Imports, MemoryBackend, ModuleInstance, Store, types};
use types::Module;

const WASM: &[u8] = include_bytes!("../../../examples/rust/out/tinywasm.wasm");

fn tinywasm_parse() -> Result<Module> {
    let parser = tinywasm_parser::Parser::new();
    let data = parser.parse_module_bytes(WASM)?;
    Ok(data)
}

fn tinywasm_to_twasm(module: &Module) -> Result<Vec<u8>> {
    let twasm = module.serialize_twasm()?;
    Ok(twasm)
}

fn tinywasm_from_twasm(twasm: &[u8]) -> Result<Module> {
    let module = Module::try_from_twasm(twasm)?;
    Ok(module)
}

fn tinywasm_run(module: &Module) -> Result<()> {
    let engine = Engine::new(Config::default().with_memory_backend(MemoryBackend::paged(64 * 1024)));
    let mut store = Store::new(engine);
    let mut imports = Imports::default();
    imports.define("env", "printi32", HostFunction::from(&mut store, |_: FuncContext<'_>, _: i32| Ok(())));
    let instance = ModuleInstance::instantiate(&mut store, module, Some(imports)).expect("instantiate");
    let hello = instance.func::<(), ()>(&store, "hello").expect("func_typed");
    hello.call(&mut store, ()).expect("call");
    Ok(())
}

fn criterion_benchmark(c: &mut Criterion) {
    let module = tinywasm_parse().expect("tinywasm_parse");
    let twasm = tinywasm_to_twasm(&module).expect("tinywasm_to_twasm");
    let mut group = c.benchmark_group("tinywasm");

    group.measurement_time(std::time::Duration::from_secs(2));
    group.bench_function("tinywasm_parse", |b| b.iter(tinywasm_parse));
    group.bench_function("tinywasm_to_twasm", |b| b.iter(|| tinywasm_to_twasm(&module)));
    group.bench_function("tinywasm_from_twasm", |b| b.iter(|| tinywasm_from_twasm(&twasm)));
    group.measurement_time(std::time::Duration::from_secs(10));
    group.bench_function("tinywasm", |b| b.iter(|| tinywasm_run(&module)));
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);