> +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....@intel.com>


Reply via email to