Paolo Bonzini <pbonz...@redhat.com> writes:
> Remove the duplicate code by using the module_init! macro; at the same time, > simplify how module_init! is used, by taking inspiration from the > implementation > of #[derive(Object)]. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> Reviewed-by: Junjie Mao <junjie....@hotmail.com> One minor comment below. > --- > rust/qemu-api-macros/src/lib.rs | 33 +++------------- > rust/qemu-api/src/definitions.rs | 66 ++++++++++++++------------------ > 2 files changed, 33 insertions(+), 66 deletions(-) > <snip> > diff --git a/rust/qemu-api/src/definitions.rs > b/rust/qemu-api/src/definitions.rs > index 3323a665d92..f180c38bfb2 100644 > --- a/rust/qemu-api/src/definitions.rs > +++ b/rust/qemu-api/src/definitions.rs > @@ -29,51 +29,40 @@ pub trait Class { > > #[macro_export] > macro_rules! module_init { <snip> > + ($type:ident => $body:block) => { > + const _: () = { > + #[used] > + #[cfg_attr( > + not(any(target_vendor = "apple", target_os = "windows")), > + link_section = ".init_array" > + )] > + #[cfg_attr(target_vendor = "apple", link_section = > "__DATA,__mod_init_func")] > + #[cfg_attr(target_os = "windows", link_section = ".CRT$XCU")] > + pub static LOAD_MODULE: extern "C" fn() = { > + extern "C" fn init_fn() { init_fn() should be unsafe fn according to the signature of register_module_init. Being unsafe fn also makes sense here because it is the caller, not init_fn() itself, that is responsible for the safety of the unsafe code in the body. -- Best Regards Junjie Mao > $body > } > > - unsafe { > - $crate::bindings::register_module_init( > - Some($func), > - $crate::bindings::module_init_type::MODULE_INIT_QOM, > - ); > + extern "C" fn ctor_fn() { > + unsafe { > + $crate::bindings::register_module_init( > + Some(init_fn), > + $crate::bindings::module_init_type::$type, > + ); > + } > } > - } > > - __load > + ctor_fn > + }; > }; > }; > + > + // shortcut because it's quite common that $body needs unsafe {} > + ($type:ident => unsafe $body:block) => { > + $crate::module_init! { > + $type => { unsafe { $body } } > + } > + }; > } > > #[macro_export]