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
>

Reply via email to