diff options
| author | Henry Gressmann <mail@henrygressmann.de> | 2023-11-30 15:47:14 +0100 |
|---|---|---|
| committer | Henry Gressmann <mail@henrygressmann.de> | 2023-11-30 15:47:14 +0100 |
| commit | d91678d58ba9672a54faec266d4f90da6bed932a (patch) | |
| tree | 22110ca1ff62d94cc2a40c1f42de11861f9a6a93 /crates | |
| parent | 1faa6a53ac3bed4fae2e24513240582f33757eb7 (diff) | |
feat: add ModuleInstance.get_func
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/cli/bin.rs | 5 | ||||
| -rw-r--r-- | crates/tinywasm/src/module/mod.rs | 19 | ||||
| -rw-r--r-- | crates/tinywasm/src/runtime/types.rs | 1 |
3 files changed, 22 insertions, 3 deletions
diff --git a/crates/cli/bin.rs b/crates/cli/bin.rs index 7cc0703..b06c286 100644 --- a/crates/cli/bin.rs +++ b/crates/cli/bin.rs @@ -70,7 +70,10 @@ fn main() -> Result<()> { fn run(wasm: &[u8]) -> Result<()> { let module = tinywasm::Module::try_new(wasm)?; let mut store = tinywasm::Store::default(); - let _instance = tinywasm::ModuleInstance::new(&mut store, &module)?; + let instance = tinywasm::ModuleInstance::new(&mut store, &module)?; + + let func = instance.get_func("add").unwrap(); + println!("func: {:?}", func); Ok(()) } diff --git a/crates/tinywasm/src/module/mod.rs b/crates/tinywasm/src/module/mod.rs index a3a8e44..4af1a9a 100644 --- a/crates/tinywasm/src/module/mod.rs +++ b/crates/tinywasm/src/module/mod.rs @@ -1,7 +1,10 @@ use alloc::vec::Vec; use wasmparser::{Export, FuncType, Validator}; -use crate::{runtime::FuncAddr, Error, Result, Store}; +use crate::{ + runtime::{FuncAddr, ModuleFunc}, + Error, Result, Store, +}; use self::reader::ModuleReader; @@ -33,6 +36,20 @@ impl<'m, 'data> ModuleInstance<'m, 'data> where 'm: 'data, { + /// Get an exported function by name + pub fn get_func(&self, name: &str) -> Option<ModuleFunc> { + let export = self + .exports + .iter() + .find(|e| e.name == name && e.kind == wasmparser::ExternalKind::Func)?; + let func_addr = self.func_addrs.get(export.index as usize)?; + + Some(ModuleFunc { + code: *func_addr, + ty: self.types.get(*func_addr as usize)?.clone(), + }) + } + pub fn new(store: &'data mut Store<'data>, module: &'m Module<'data>) -> Result<Self> { let types = module .reader diff --git a/crates/tinywasm/src/runtime/types.rs b/crates/tinywasm/src/runtime/types.rs index 511eac1..f96c406 100644 --- a/crates/tinywasm/src/runtime/types.rs +++ b/crates/tinywasm/src/runtime/types.rs @@ -31,7 +31,6 @@ pub struct HostFunc { #[derive(Debug)] pub struct ModuleFunc { pub ty: FuncType, - pub module: Addr, pub code: FuncAddr, } pub struct Func<'a> { |
