summaryrefslogtreecommitdiff
path: root/examples/linking.rs
blob: f278266bc79e7f9542d55db26a9d74fd552796f2 (plain)
use color_eyre::eyre::Result;
use tinywasm::{Module, Store};

const WASM_ADD: &str = r#"
(module
  (func $add (param $lhs i32) (param $rhs i32) (result i32)
    local.get $lhs
    local.get $rhs
    i32.add)
  (export "add" (func $add)))
"#;

const WASM_IMPORT: &str = r#"
(module
  (import "adder" "add" (func $add (param i32 i32) (result i32)))
  (func $main (result i32)
    i32.const 1
    i32.const 2
    call $add)
  (export "main" (func $main))
)
"#;

fn main() -> Result<()> {
    let wasm_add = wat::parse_str(WASM_ADD).expect("failed to parse wat");
    let wasm_import = wat::parse_str(WASM_IMPORT).expect("failed to parse wat");

    let add_module = Module::parse_bytes(&wasm_add)?;
    let import_module = Module::parse_bytes(&wasm_import)?;

    let mut store = Store::default();
    let add_instance = add_module.instantiate(&mut store, None)?;

    let mut imports = tinywasm::Imports::new();
    imports.link_module("adder", add_instance.id())?;
    let import_instance = import_module.instantiate(&mut store, Some(imports))?;

    let main = import_instance.exported_func::<(), i32>(&store, "main")?;
    assert_eq!(main.call(&mut store, ())?, 3);
    Ok(())
}