1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
/// Helper macro to create a new `Func` object using the provided function pointer. /// /// # Usage /// /// Function pointers or closures are supported. Closures can capture /// their environment (with `move`). The first parameter is likely to /// be of kind `vm::Ctx`, though it can be optional. /// /// ``` /// # use wasmer_runtime_core::{imports, func}; /// # use wasmer_runtime_core::vm; /// /// // A function that has access to `vm::Ctx`. /// fn func_with_vmctx(_: &mut vm::Ctx, n: i32) -> i32 { /// n /// } /// /// // A function that cannot access `vm::Ctx`. /// fn func(n: i32) -> i32 { /// n /// } /// /// let i = 7; /// /// let import_object = imports! { /// "env" => { /// "foo" => func!(func_with_vmctx), /// "bar" => func!(func), /// // A closure with a captured environment, and an access to `vm::Ctx`. /// "baz" => func!(move |_: &mut vm::Ctx, n: i32| -> i32 { /// n + i /// }), /// // A closure without a captured environment, and no access to `vm::Ctx`. /// "qux" => func!(|n: i32| -> i32 { /// n /// }), /// }, /// }; /// ``` #[macro_export] macro_rules! func { ($func:expr) => {{ $crate::Func::new($func) }}; } /// Generate an [`ImportObject`] safely. /// /// [`ImportObject`]: struct.ImportObject.html /// /// # Note /// The `import` macro currently only supports /// importing functions. /// /// /// # Usage /// ``` /// # use wasmer_runtime_core::{imports, func}; /// # use wasmer_runtime_core::vm::Ctx; /// let import_object = imports! { /// "env" => { /// "foo" => func!(foo), /// }, /// }; /// /// let imports_with_state = imports! { /// || (0 as _, |_a| {}), /// "env" => { /// "foo" => func!(foo), /// }, /// }; /// /// fn foo(_: &mut Ctx, n: i32) -> i32 { /// n /// } /// ``` #[macro_export] macro_rules! imports { ( $( $ns_name:expr => $ns:tt, )* ) => {{ use $crate::{ import::{ImportObject, Namespace}, }; let mut import_object = ImportObject::new(); $({ let ns = $crate::__imports_internal!($ns); import_object.register($ns_name, ns); })* import_object }}; ($state_gen:expr, $( $ns_name:expr => $ns:tt, )* ) => {{ use $crate::{ import::{ImportObject, Namespace}, }; let mut import_object = ImportObject::new_with_data($state_gen); $({ 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 => $import_item:expr, )* } ) => {{ let mut ns = Namespace::new(); $( ns.insert($imp_name, $import_item); )* ns }}; ($ns:ident) => { $ns }; } #[macro_export] #[doc(hidden)] macro_rules! namespace { ( $( $imp_name:expr => $import_item:expr, )* ) => {{ let mut ns = $crate::import::Namespace::new(); $( ns.insert($imp_name, $import_item); )* ns }}; }