diff options
Diffstat (limited to 'examples/linking.rs')
| -rw-r--r-- | examples/linking.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/examples/linking.rs b/examples/linking.rs new file mode 100644 index 0000000..f278266 --- /dev/null +++ b/examples/linking.rs @@ -0,0 +1,41 @@ +use color_eyre::eyre::Result; +use tinywasm::{Module, Store}; + +const WASM_ADD: &str = r#" +(module + (func $add (param $lhs i32) (param $rhs i32) (result i32) + local.get $lhs + local.get $rhs + i32.add) + (export "add" (func $add))) +"#; + +const WASM_IMPORT: &str = r#" +(module + (import "adder" "add" (func $add (param i32 i32) (result i32))) + (func $main (result i32) + i32.const 1 + i32.const 2 + call $add) + (export "main" (func $main)) +) +"#; + +fn main() -> Result<()> { + let wasm_add = wat::parse_str(WASM_ADD).expect("failed to parse wat"); + let wasm_import = wat::parse_str(WASM_IMPORT).expect("failed to parse wat"); + + let add_module = Module::parse_bytes(&wasm_add)?; + let import_module = Module::parse_bytes(&wasm_import)?; + + let mut store = Store::default(); + let add_instance = add_module.instantiate(&mut store, None)?; + + let mut imports = tinywasm::Imports::new(); + imports.link_module("adder", add_instance.id())?; + let import_instance = import_module.instantiate(&mut store, Some(imports))?; + + let main = import_instance.exported_func::<(), i32>(&store, "main")?; + assert_eq!(main.call(&mut store, ())?, 3); + Ok(()) +} |
