summaryrefslogtreecommitdiff
path: root/examples/rust/src/tinywasm.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/rust/src/tinywasm.rs')
-rw-r--r--examples/rust/src/tinywasm.rs47
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(())
}