mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00
rust: qom: move ClassInitImpl to the instance side
Put all traits on the instance struct, which makes it possible to reuse class structs if no new virtual methods or class fields are added. This is almost always the case for devices (because they are leaf classes), which is the primary use case for Rust. This is also simpler: soon we will find the implemented methods without macros, and this removes the need to go from the class struct to the instance struct to find the implementation of the *Impl traits. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3701fb22df
commit
c6c4f3e0d9
3 changed files with 7 additions and 7 deletions
|
@ -116,7 +116,7 @@ pub struct PL011Class {
|
||||||
_inner: [u8; 0],
|
_inner: [u8; 0],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl qemu_api::definitions::ClassInitImpl for PL011Class {
|
impl qemu_api::definitions::ClassInitImpl for PL011State {
|
||||||
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut c_void)> =
|
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut c_void)> =
|
||||||
Some(crate::device_class::pl011_class_init);
|
Some(crate::device_class::pl011_class_init);
|
||||||
const CLASS_BASE_INIT: Option<
|
const CLASS_BASE_INIT: Option<
|
||||||
|
@ -649,7 +649,7 @@ pub unsafe extern "C" fn pl011_luminary_init(obj: *mut Object) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl qemu_api::definitions::ClassInitImpl for PL011LuminaryClass {
|
impl qemu_api::definitions::ClassInitImpl for PL011Luminary {
|
||||||
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut c_void)> =
|
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut c_void)> =
|
||||||
None;
|
None;
|
||||||
const CLASS_BASE_INIT: Option<
|
const CLASS_BASE_INIT: Option<
|
||||||
|
|
|
@ -9,8 +9,8 @@ use std::{ffi::CStr, os::raw::c_void};
|
||||||
use crate::bindings::{Object, ObjectClass, TypeInfo};
|
use crate::bindings::{Object, ObjectClass, TypeInfo};
|
||||||
|
|
||||||
/// Trait a type must implement to be registered with QEMU.
|
/// Trait a type must implement to be registered with QEMU.
|
||||||
pub trait ObjectImpl: Sized {
|
pub trait ObjectImpl: ClassInitImpl + Sized {
|
||||||
type Class: ClassInitImpl;
|
type Class;
|
||||||
const TYPE_NAME: &'static CStr;
|
const TYPE_NAME: &'static CStr;
|
||||||
const PARENT_TYPE_NAME: Option<&'static CStr>;
|
const PARENT_TYPE_NAME: Option<&'static CStr>;
|
||||||
const ABSTRACT: bool = false;
|
const ABSTRACT: bool = false;
|
||||||
|
@ -32,8 +32,8 @@ pub trait ObjectImpl: Sized {
|
||||||
instance_finalize: Self::INSTANCE_FINALIZE,
|
instance_finalize: Self::INSTANCE_FINALIZE,
|
||||||
abstract_: Self::ABSTRACT,
|
abstract_: Self::ABSTRACT,
|
||||||
class_size: core::mem::size_of::<Self::Class>(),
|
class_size: core::mem::size_of::<Self::Class>(),
|
||||||
class_init: <Self::Class as ClassInitImpl>::CLASS_INIT,
|
class_init: <Self as ClassInitImpl>::CLASS_INIT,
|
||||||
class_base_init: <Self::Class as ClassInitImpl>::CLASS_BASE_INIT,
|
class_base_init: <Self as ClassInitImpl>::CLASS_BASE_INIT,
|
||||||
class_data: core::ptr::null_mut(),
|
class_data: core::ptr::null_mut(),
|
||||||
interfaces: core::ptr::null_mut(),
|
interfaces: core::ptr::null_mut(),
|
||||||
};
|
};
|
||||||
|
|
|
@ -59,7 +59,7 @@ fn test_device_decl_macros() {
|
||||||
const PARENT_TYPE_NAME: Option<&'static CStr> = Some(device_class::TYPE_DEVICE);
|
const PARENT_TYPE_NAME: Option<&'static CStr> = Some(device_class::TYPE_DEVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ClassInitImpl for DummyClass {
|
impl ClassInitImpl for DummyState {
|
||||||
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut c_void)> =
|
const CLASS_INIT: Option<unsafe extern "C" fn(klass: *mut ObjectClass, data: *mut c_void)> =
|
||||||
Some(dummy_class_init);
|
Some(dummy_class_init);
|
||||||
const CLASS_BASE_INIT: Option<
|
const CLASS_BASE_INIT: Option<
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue