diff --git a/lib/runtime/examples/simple/main.rs b/lib/runtime/examples/simple/main.rs index be178740a..e56c9c022 100644 --- a/lib/runtime/examples/simple/main.rs +++ b/lib/runtime/examples/simple/main.rs @@ -8,22 +8,17 @@ fn main() -> Result<()> { let wasm_binary = wat2wasm(IMPORT_MODULE.as_bytes()).expect("WAST not valid or malformed"); let inner_module = runtime::compile(&wasm_binary, &CraneliftCompiler::new())?; - let mut env_namespace = Namespace::new(); - env_namespace.insert( - "print_i32", - export_func!( - print_num, - [i32] -> [i32] - ), - ); + let import_object = imports! { + "env" => { + "print_i32" => print_num<[i32] -> [i32]>, + }, + }; - let mut imports = ImportObject::new(); - imports.register("env", env_namespace); + let inner_instance = inner_module.instantiate(import_object)?; - let inner_instance = inner_module.instantiate(imports)?; - - let mut outer_imports = ImportObject::new(); - outer_imports.register("env", inner_instance); + let outer_imports = imports! { + "env" => inner_instance, + }; let outer_module = runtime::compile(EXAMPLE_WASM, &CraneliftCompiler::new())?; let mut outer_instance = outer_module.instantiate(outer_imports)?; diff --git a/lib/runtime/src/lib.rs b/lib/runtime/src/lib.rs index aec776991..89a597f36 100644 --- a/lib/runtime/src/lib.rs +++ b/lib/runtime/src/lib.rs @@ -32,7 +32,6 @@ pub use self::module::Module; use std::rc::Rc; pub mod prelude { - pub use crate::export_func; pub use crate::import::{ImportObject, Namespace}; pub use crate::types::{ FuncIndex, GlobalIndex, ImportedFuncIndex, ImportedGlobalIndex, ImportedMemoryIndex, @@ -40,6 +39,7 @@ pub mod prelude { MemoryIndex, TableIndex, Type, Value, }; pub use crate::vm; + pub use crate::{export_func, imports}; } /// Compile a webassembly module using the provided compiler. diff --git a/lib/runtime/src/macros.rs b/lib/runtime/src/macros.rs index a8b9dbef6..9dc7d2cd2 100644 --- a/lib/runtime/src/macros.rs +++ b/lib/runtime/src/macros.rs @@ -49,4 +49,41 @@ macro_rules! __export_func_convert_type { ($x:ty) => { compile_error!("Only `i32`, `u32`, `i64`, `u64`, `f32`, and `f64` are supported for argument and return types") }; -} \ No newline at end of file +} + +#[macro_export] +macro_rules! imports { + ( $( $ns_name:expr => $ns:tt, )* ) => {{ + use wasmer_runtime::{ + import::{ImportObject, Namespace}, + }; + + let mut import_object = ImportObject::new(); + + $({ + let ns = $crate::__imports_internal!($ns); + + import_object.register($ns_name, ns); + })* + + import_object + }}; +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __imports_internal { + ( { $( $imp_name:expr => $func:ident < [ $( $params:ident ),* ] -> [ $( $returns:ident ),* ] >, )* } ) => {{ + let mut ns = Namespace::new(); + $( + ns.insert($imp_name, $crate::export_func!( + $func, + [ $( $params ),* ] -> [ $( $returns )* ] + )); + )* + ns + }}; + ($ns:ident) => { + $ns + }; +}