On Mon, Dec 09, 2024 at 01:37:09PM +0100, Paolo Bonzini wrote: > Date: Mon, 9 Dec 2024 13:37:09 +0100 > From: Paolo Bonzini <pbonz...@redhat.com> > Subject: [PATCH 18/26] rust: qom: add possibility of overriding unparent > X-Mailer: git-send-email 2.47.1 > > Add a blanket definition of ClassInitImpl<ObjectClass> that thunks > ObjectImpl::UNPARENT and overrides it in ObjectClass if it is not > None. > > ClassInitImpl<DeviceClass> can now call its superclass's ClassInitImpl, > so that the C and Rust hierarchies match more closely. > > This is mostly done as an example of implementing the metaclass > hierarchy under ClassInitImpl. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > rust/qemu-api/src/definitions.rs | 44 ++++++++++++++++++++++++++++--- > rust/qemu-api/src/device_class.rs | 6 +++-- > 2 files changed, 45 insertions(+), 5 deletions(-)
Reviewed-by: Zhao Liu <zhao1....@intel.com> (with an additional comment below...) > diff --git a/rust/qemu-api/src/definitions.rs > b/rust/qemu-api/src/definitions.rs > index 2429b9f53f0..958ea34decc 100644 > --- a/rust/qemu-api/src/definitions.rs > +++ b/rust/qemu-api/src/definitions.rs > @@ -6,7 +6,7 @@ > > use std::{ffi::CStr, os::raw::c_void}; > > -use crate::bindings::{Object, ObjectClass, TypeInfo}; > +use crate::bindings::{self, Object, ObjectClass, TypeInfo}; > > unsafe extern "C" fn rust_instance_init<T: ObjectImpl>(obj: *mut Object) { > // SAFETY: obj is an instance of T, since rust_instance_init<T> > @@ -115,6 +115,9 @@ pub trait ObjectImpl: ObjectType + > ClassInitImpl<Self::Class> { > class_data: core::ptr::null_mut(), > interfaces: core::ptr::null_mut(), > }; > + > + // methods on ObjectClass > + const UNPARENT: Option<fn(&mut Self)> = None; > } Will we change `&mut Self` to an immutable reference in the future? IIUC, the parent on the C side also has a pointer to current object.