summaryrefslogtreecommitdiff
path: root/examples/rust/src/tinywasm_no_std.rs
blob: 6d7e73c0bc6ac8ba3c6fd012ae532201512ed6a3 (plain)
#![no_main]
#![no_std]
use dlmalloc::GlobalDlmalloc;
use tinywasm::{FuncContext, HostFunction};

extern crate alloc;

#[global_allocator]
static ALLOCATOR: GlobalDlmalloc = GlobalDlmalloc;

#[cfg(not(feature = "std"))]
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
    loop {}
}

#[link(wasm_import_module = "env")]
unsafe extern "C" {
    fn printi32(x: i32);
}

#[unsafe(no_mangle)]
pub extern "C" fn hello() {
    let _ = run();
}

fn run() -> tinywasm::Result<()> {
    let mut store = tinywasm::Store::default();
    let mut imports = tinywasm::Imports::new();

    let res = tinywasm::parser::Parser::new().parse_module_bytes(include_bytes!("./print.wasm"))?;
    let twasm = res.serialize_twasm()?;
    let module = tinywasm::Module::parse_bytes(&twasm)?;

    let printi32 = HostFunction::from(&mut store, |_: FuncContext<'_>, v: i32| {
        unsafe { printi32(v) }
        Ok(())
    });

    imports.define("env", "printi32", printi32);
    let instance = module.instantiate(&mut store, Some(imports))?;
    let add_and_print = instance.func::<(i32, i32), ()>(&store, "add_and_print")?;
    add_and_print.call(&mut store, (1, 2))?;
    Ok(())
}