aboutsummaryrefslogtreecommitdiff
path: root/rust/qemu-api-macros/src
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2024-10-24 11:57:02 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2025-01-10 23:34:43 +0100
commit20f0b8e98b4851bfd52bbb4edd4b602d08b9b817 (patch)
tree48080f85c290b9a87a16044d8bd03afcffdf0728 /rust/qemu-api-macros/src
parent7f65d4e58b67d6e5ee05c9381a50ef1eba3a5a1e (diff)
downloadqemu-20f0b8e98b4851bfd52bbb4edd4b602d08b9b817.zip
qemu-20f0b8e98b4851bfd52bbb4edd4b602d08b9b817.tar.gz
qemu-20f0b8e98b4851bfd52bbb4edd4b602d08b9b817.tar.bz2
rust: macros: check that #[derive(Object)] requires #[repr(C)]
Convert derive_object to the same pattern of first making a Result<proc_macro2::TokenStream, CompileError>, and then doing .unwrap_or_else(Into::into) to support checking the validity of the input. Add is_c_repr to check that all QOM structs include a #[repr(C)] attribute. Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'rust/qemu-api-macros/src')
-rw-r--r--rust/qemu-api-macros/src/lib.rs17
1 files changed, 11 insertions, 6 deletions
diff --git a/rust/qemu-api-macros/src/lib.rs b/rust/qemu-api-macros/src/lib.rs
index 74a8bc7..160b283 100644
--- a/rust/qemu-api-macros/src/lib.rs
+++ b/rust/qemu-api-macros/src/lib.rs
@@ -32,18 +32,23 @@ fn is_c_repr(input: &DeriveInput, msg: &str) -> Result<(), CompileError> {
}
}
-#[proc_macro_derive(Object)]
-pub fn derive_object(input: TokenStream) -> TokenStream {
- let input = parse_macro_input!(input as DeriveInput);
- let name = input.ident;
+fn derive_object_or_error(input: DeriveInput) -> Result<proc_macro2::TokenStream, CompileError> {
+ is_c_repr(&input, "#[derive(Object)]")?;
- let expanded = quote! {
+ let name = &input.ident;
+ Ok(quote! {
::qemu_api::module_init! {
MODULE_INIT_QOM => unsafe {
::qemu_api::bindings::type_register_static(&<#name as ::qemu_api::qom::ObjectImpl>::TYPE_INFO);
}
}
- };
+ })
+}
+
+#[proc_macro_derive(Object)]
+pub fn derive_object(input: TokenStream) -> TokenStream {
+ let input = parse_macro_input!(input as DeriveInput);
+ let expanded = derive_object_or_error(input).unwrap_or_else(Into::into);
TokenStream::from(expanded)
}