summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Gressmann <mail@henrygressmann.de>2023-11-30 15:47:14 +0100
committerHenry Gressmann <mail@henrygressmann.de>2023-11-30 15:47:14 +0100
commitd91678d58ba9672a54faec266d4f90da6bed932a (patch)
tree22110ca1ff62d94cc2a40c1f42de11861f9a6a93
parent1faa6a53ac3bed4fae2e24513240582f33757eb7 (diff)
feat: add ModuleInstance.get_func
Signed-off-by: Henry Gressmann <mail@henrygressmann.de>
-rw-r--r--crates/cli/bin.rs5
-rw-r--r--crates/tinywasm/src/module/mod.rs19
-rw-r--r--crates/tinywasm/src/runtime/types.rs1
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> {