tinywasm 0.9.0

A tiny WebAssembly interpreter
Documentation
use eyre::Result;
use tinywasm::{ModuleInstance, Store};

const MODULE_WAT: &str = r#"
    (module
      (func (export "add") (param i32 i32) (result i32)
        local.get 0
        local.get 1
        i32.add)
      (memory (export "memory") 1)
    )
"#;

#[test]
fn func_handle_rejects_wrong_store() -> Result<()> {
    let wasm = wat::parse_str(MODULE_WAT)?;
    let module = tinywasm::parse_bytes(&wasm)?;

    let mut owner_store = Store::default();
    let instance = ModuleInstance::instantiate(&mut owner_store, &module, None)?;
    let func = instance.func_untyped(&owner_store, "add")?;

    let mut other_store = Store::default();
    let err = func.call(&mut other_store, &[1.into(), 2.into()]).unwrap_err();
    assert!(err.to_string().contains("invalid store"));

    Ok(())
}

#[test]
fn memory_access_rejects_wrong_store() -> Result<()> {
    let wasm = wat::parse_str(MODULE_WAT)?;
    let module = tinywasm::parse_bytes(&wasm)?;

    let mut owner_store = Store::default();
    let instance = ModuleInstance::instantiate(&mut owner_store, &module, None)?;

    let memory = instance.memory("memory")?;
    let other_store = Store::default();
    let err = memory.len(&other_store).unwrap_err();
    assert_eq!(err, tinywasm::Error::Trap(tinywasm::Trap::InvalidStore));

    Ok(())
}

#[test]
fn global_access_rejects_wrong_store() -> Result<()> {
    let wasm = wat::parse_str(
        r#"
        (module
          (global (export "g") (mut i32) (i32.const 1))
        )
        "#,
    )?;
    let module = tinywasm::parse_bytes(&wasm)?;

    let mut owner_store = Store::default();
    let instance = ModuleInstance::instantiate(&mut owner_store, &module, None)?;
    let global = instance.global("g")?;

    let other_store = Store::default();
    let err = global.get(&other_store).unwrap_err();
    assert_eq!(err, tinywasm::Error::Trap(tinywasm::Trap::InvalidStore));

    Ok(())
}

#[test]
fn table_grow_rejects_wrong_store_with_invalid_store_error() -> Result<()> {
    let wasm = wat::parse_str(
        r#"
        (module
          (table (export "t") 1 funcref)
        )
        "#,
    )?;
    let module = tinywasm::parse_bytes(&wasm)?;

    let mut owner_store = Store::default();
    let instance = ModuleInstance::instantiate(&mut owner_store, &module, None)?;
    let table = instance.table("t")?;

    let mut other_store = Store::default();
    let err = table.grow(&mut other_store, 1, tinywasm::types::FuncRef::null().into()).unwrap_err();
    assert_eq!(err, tinywasm::Error::Trap(tinywasm::Trap::InvalidStore));

    Ok(())
}