diff options
| author | Henry Gressmann <mail@henrygressmann.de> | 2024-01-26 12:03:59 +0100 |
|---|---|---|
| committer | Henry Gressmann <mail@henrygressmann.de> | 2024-01-26 12:03:59 +0100 |
| commit | f3d890a36d6299dbd70377ce57b0bd9d61de5c1b (patch) | |
| tree | 36b51022af641c0f464fd0c5d4456b722e5f735b /examples/rust/src/tinywasm.rs | |
| parent | 461126ce309f99e4ad2a6ddcbc175ea01c5e8fee (diff) | |
docs: working selfhosted example
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
Diffstat (limited to 'examples/rust/src/tinywasm.rs')
| -rw-r--r-- | examples/rust/src/tinywasm.rs | 47 |
1 files changed, 19 insertions, 28 deletions
diff --git a/examples/rust/src/tinywasm.rs b/examples/rust/src/tinywasm.rs index 4edde66..52af7b9 100644 --- a/examples/rust/src/tinywasm.rs +++ b/examples/rust/src/tinywasm.rs @@ -1,41 +1,32 @@ -#![no_std] #![no_main] +use tinywasm::{Extern, FuncContext}; -use embedded_alloc::Heap; -// use tinywasm::{Extern, FuncContext}; - -#[cfg(not(test))] -#[panic_handler] -fn panic(_info: &core::panic::PanicInfo) -> ! { - core::arch::wasm32::unreachable() +#[link(wasm_import_module = "env")] +extern "C" { + fn printi32(x: i32); } -#[global_allocator] -static HEAP: Heap = Heap::empty(); - #[no_mangle] -pub unsafe extern "C" fn _start() { - // Initialize the allocator BEFORE you use it - { - use core::mem::MaybeUninit; - const HEAP_SIZE: usize = 1024; - static mut HEAP_MEM: [MaybeUninit<u8>; HEAP_SIZE] = [MaybeUninit::uninit(); HEAP_SIZE]; - unsafe { HEAP.init(HEAP_MEM.as_ptr() as usize, HEAP_SIZE) } - } - - // now the allocator is ready types like Box, Vec can be used. +pub extern "C" fn hello() { let _ = run(); } fn run() -> tinywasm::Result<()> { - // let module = tinywasm::Module::parse_bytes(include_bytes!("../out/hello.wasm"))?; - // let mut store = tinywasm::Store::default(); + let module = tinywasm::Module::parse_bytes(include_bytes!("../../wasm/hello.wasm"))?; + let mut store = tinywasm::Store::default(); + let mut imports = tinywasm::Imports::new(); - // let mut imports = tinywasm::Imports::new(); - // imports.define("env", "printi32", Extern::typed_func(|_: FuncContext<'_>, _: i32| Ok(())))?; + imports.define( + "env", + "printi32", + Extern::typed_func(|_: FuncContext<'_>, v: i32| { + unsafe { printi32(v) } + Ok(()) + }), + )?; + let instance = module.instantiate(&mut store, Some(imports))?; - // let instance = module.instantiate(&mut store, Some(imports))?; - // let add_and_print = instance.typed_func::<(i32, i32), ()>(&mut store, "add_and_print")?; - // add_and_print.call(&mut store, (1, 2))?; + let add_and_print = instance.typed_func::<(i32, i32), ()>(&mut store, "add_and_print")?; + add_and_print.call(&mut store, (1, 2))?; Ok(()) } |
