qemu-rust
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 07/15] rust: qemu_api_macros: add Wrapper derive macro


From: Zhao Liu
Subject: Re: [PATCH 07/15] rust: qemu_api_macros: add Wrapper derive macro
Date: Tue, 25 Feb 2025 15:54:46 +0800

> +fn derive_opaque_or_error(input: DeriveInput) -> 
> Result<proc_macro2::TokenStream, MacroError> {
> +    is_transparent_repr(&input, "#[derive(Wrapper)]")?;
> +
> +    let name = &input.ident;
> +    let field = &get_unnamed_field(&input, "#[derive(Wrapper)]")?;
> +    let typ = &field.ty;
> +
> +    // TODO: how to add "::qemu_api"?  For now, this is only used in the
> +    // qemu_api crate so it's not a problem.
> +    Ok(quote! {
> +        unsafe impl crate::cell::Wrapper for #name {
> +            type Wrapped = <#typ as crate::cell::Wrapper>::Wrapped;
> +        }
> +        impl #name {
> +            pub unsafe fn from_raw<'a>(ptr: *mut <Self as 
> crate::cell::Wrapper>::Wrapped) -> &'a Self {
> +                let ptr = 
> ::std::ptr::NonNull::new(ptr).unwrap().cast::<Self>();
> +                unsafe { ptr.as_ref() }
> +            }
> +
> +            pub const fn as_mut_ptr(&self) -> *mut <Self as 
> crate::cell::Wrapper>::Wrapped {
> +                self.0.as_mut_ptr()
> +            }
> +
> +            pub const fn as_ptr(&self) -> *const <Self as 
> crate::cell::Wrapper>::Wrapped {
> +                self.0.as_ptr()
> +            }

What about also adding as_void_ptr? Then DeviceState can benefit from
this in qdev_init_clock_in.

> +        }
> +    })
> +}
> +

Others are fine for me. Nice improvement!

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]