Hello Paolo, On Mon, 21 Oct 2024 19:35, Paolo Bonzini <pbonz...@redhat.com> wrote: >Use the "struct update" syntax to initialize most of the fields to zero, >and simplify the handmade type-checking of $name.
Note: It wasn't meant for type checking but for making sure the linker doesn't strip the symbol (hence the #[used] attribute). These were left over when I was debugging linker issues and slapped #[used] everywhere but they are not needed in this case indeed. > >Reviewed-by: Junjie Mao <junjie....@hotmail.com> >Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> >--- > rust/qemu-api/src/device_class.rs | 29 ++++++----------------------- > 1 file changed, 6 insertions(+), 23 deletions(-) > >diff --git a/rust/qemu-api/src/device_class.rs >b/rust/qemu-api/src/device_class.rs >index 2219b9f73d0..5aba426d243 100644 >--- a/rust/qemu-api/src/device_class.rs >+++ b/rust/qemu-api/src/device_class.rs >@@ -29,44 +29,27 @@ macro_rules! device_class_init { > macro_rules! define_property { > ($name:expr, $state:ty, $field:expr, $prop:expr, $type:expr, default = > $defval:expr$(,)*) => { > $crate::bindings::Property { >- name: { >- #[used] >- static _TEMP: &::core::ffi::CStr = $name; >- _TEMP.as_ptr() >- }, >+ // use associated function syntax for type checking >+ name: ::core::ffi::CStr::as_ptr($name), > info: $prop, > offset: ::core::mem::offset_of!($state, $field) > .try_into() > .expect("Could not fit offset value to type"), >- bitnr: 0, >- bitmask: 0, > set_default: true, > defval: $crate::bindings::Property__bindgen_ty_1 { u: > $defval.into() }, >- arrayoffset: 0, >- arrayinfo: ::core::ptr::null(), >- arrayfieldsize: 0, >- link_type: ::core::ptr::null(), >+ ..unsafe { >::core::mem::MaybeUninit::<$crate::bindings::Property>::zeroed().assume_init() >} Call it personal taste but I don't like emulating C's zero initializer syntax in Rust :) Is it that much trouble to explicitly write down every field in a macro, anyway? No strong preference here though. > } > }; > ($name:expr, $state:ty, $field:expr, $prop:expr, $type:expr$(,)*) => { > $crate::bindings::Property { >- name: { >- #[used] >- static _TEMP: &::core::ffi::CStr = $name; >- _TEMP.as_ptr() >- }, >+ // use associated function syntax for type checking >+ name: ::core::ffi::CStr::as_ptr($name), > info: $prop, > offset: ::core::mem::offset_of!($state, $field) > .try_into() > .expect("Could not fit offset value to type"), >- bitnr: 0, >- bitmask: 0, > set_default: false, >- defval: $crate::bindings::Property__bindgen_ty_1 { i: 0 }, >- arrayoffset: 0, >- arrayinfo: ::core::ptr::null(), >- arrayfieldsize: 0, >- link_type: ::core::ptr::null(), >+ ..unsafe { >::core::mem::MaybeUninit::<$crate::bindings::Property>::zeroed().assume_init() >} > } > }; > } >-- >2.46.2 >