[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/8] rust: qom: rename Class trait to ClassInitImpl
From: |
Paolo Bonzini |
Subject: |
[PATCH 2/8] rust: qom: rename Class trait to ClassInitImpl |
Date: |
Mon, 25 Nov 2024 09:05:01 +0100 |
While at it, document it.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
rust/hw/char/pl011/src/device.rs | 4 ++--
rust/qemu-api/src/definitions.rs | 25 ++++++++++++++++++++++---
rust/qemu-api/tests/tests.rs | 4 ++--
3 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/device.rs
index f47e0f48d8a..763605d4776 100644
--- a/rust/hw/char/pl011/src/device.rs
+++ b/rust/hw/char/pl011/src/device.rs
@@ -117,7 +117,7 @@ pub struct PL011Class {
_inner: [u8; 0],
}
-impl qemu_api::definitions::Class for PL011Class {
+impl qemu_api::definitions::ClassInitImpl for PL011Class {
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass,
data: *mut c_void)> =
Some(crate::device_class::pl011_class_init);
const CLASS_BASE_INIT: Option<
@@ -650,7 +650,7 @@ pub struct PL011LuminaryClass {
}
}
-impl qemu_api::definitions::Class for PL011LuminaryClass {
+impl qemu_api::definitions::ClassInitImpl for PL011LuminaryClass {
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass,
data: *mut c_void)> =
None;
const CLASS_BASE_INIT: Option<
diff --git a/rust/qemu-api/src/definitions.rs b/rust/qemu-api/src/definitions.rs
index 92b3c6f9118..3291f4242ce 100644
--- a/rust/qemu-api/src/definitions.rs
+++ b/rust/qemu-api/src/definitions.rs
@@ -20,8 +20,27 @@ pub trait ObjectImpl {
const INSTANCE_FINALIZE: Option<unsafe extern "C" fn(obj: *mut Object)> =
None;
}
-pub trait Class {
+/// Trait used to fill in a class struct.
+///
+/// Each QOM class that has virtual methods describes them in a
+/// _class struct_. Class structs include a parent field corresponding
+/// to the vtable of the parent class, all the way up to [`ObjectClass`].
+/// Each QOM type has one such class struct.
+///
+/// The Rust implementation of methods will usually come from a trait
+/// like [`ObjectImpl`].
+pub trait ClassInitImpl {
+ /// Function that is called after all parent class initialization
+ /// has occurred. On entry, the virtual method pointers are set to
+ /// the default values coming from the parent classes; the function
+ /// can change them to override virtual methods of a parent class.
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass,
data: *mut c_void)>;
+
+ /// Called on descendent classes after all parent class initialization
+ /// has occurred, but before the class itself is initialized. This
+ /// is only useful if a class is not a leaf, and can be used to undo
+ /// the effects of copying the contents of the parent's class struct
+ /// to the descendants.
const CLASS_BASE_INIT: Option<
unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut c_void),
>;
@@ -82,8 +101,8 @@ macro_rules! type_info {
instance_finalize: <$t as
$crate::definitions::ObjectImpl>::INSTANCE_FINALIZE,
abstract_: <$t as $crate::definitions::ObjectImpl>::ABSTRACT,
class_size: ::core::mem::size_of::<<$t as
$crate::definitions::ObjectImpl>::Class>(),
- class_init: <<$t as $crate::definitions::ObjectImpl>::Class as
$crate::definitions::Class>::CLASS_INIT,
- class_base_init: <<$t as $crate::definitions::ObjectImpl>::Class
as $crate::definitions::Class>::CLASS_BASE_INIT,
+ class_init: <<$t as $crate::definitions::ObjectImpl>::Class as
$crate::definitions::ClassInitImpl>::CLASS_INIT,
+ class_base_init: <<$t as $crate::definitions::ObjectImpl>::Class
as $crate::definitions::ClassInitImpl>::CLASS_BASE_INIT,
class_data: ::core::ptr::null_mut(),
interfaces: ::core::ptr::null_mut(),
};
diff --git a/rust/qemu-api/tests/tests.rs b/rust/qemu-api/tests/tests.rs
index f793ff26e5d..704c63c846f 100644
--- a/rust/qemu-api/tests/tests.rs
+++ b/rust/qemu-api/tests/tests.rs
@@ -7,7 +7,7 @@
use qemu_api::{
bindings::*,
c_str, declare_properties, define_property,
- definitions::{Class, ObjectImpl},
+ definitions::{ClassInitImpl, ObjectImpl},
device_class, device_class_init,
zeroable::Zeroable,
};
@@ -60,7 +60,7 @@ impl ObjectImpl for DummyState {
const PARENT_TYPE_NAME: Option<&'static CStr> =
Some(device_class::TYPE_DEVICE);
}
- impl Class for DummyClass {
+ impl ClassInitImpl for DummyClass {
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass,
data: *mut c_void)> =
Some(dummy_class_init);
const CLASS_BASE_INIT: Option<
--
2.47.0
- [PATCH 0/8] rust: qom: move bridge for TypeInfo and DeviceClass functions to common code, Paolo Bonzini, 2024/11/25
- [PATCH 1/8] rust: qom: add default definitions for ObjectImpl, Paolo Bonzini, 2024/11/25
- [PATCH 2/8] rust: qom: rename Class trait to ClassInitImpl,
Paolo Bonzini <=
- [PATCH 5/8] rust: qdev: move device_class_init! body to generic function, ClassInitImpl implementation to macro, Paolo Bonzini, 2024/11/25
- [PATCH 7/8] rust: qom: automatically use Drop trait to implement instance_finalize, Paolo Bonzini, 2024/11/25
- [PATCH 8/8] rust: qom: move bridge for TypeInfo functions out of pl011, Paolo Bonzini, 2024/11/25
- [PATCH 6/8] rust: qdev: move bridge for realize and reset functions out of pl011, Paolo Bonzini, 2024/11/25
- [PATCH 3/8] rust: qom: convert type_info! macro to an associated const, Paolo Bonzini, 2024/11/25
- [PATCH 4/8] rust: qom: move ClassInitImpl to the instance side, Paolo Bonzini, 2024/11/25