From: Paolo Bonzini <pbonzini@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, marcandre.lureau@redhat.com, qemu-rust@nongnu.org
Subject: Re: [PATCH 14/19] scripts/qapi: generate high-level Rust bindings
Date: Wed, 10 Dec 2025 15:38:51 +0100 [thread overview]
Message-ID: <f8b03a16-d957-4968-a7c8-38fec0b01a88@redhat.com> (raw)
In-Reply-To: <87v7ig3rc2.fsf@pond.sub.org>
On 12/9/25 11:03, Markus Armbruster wrote:
> * Why is util::qobject::QObject needed?
>
> * NONE is an error value, not a valid QType. Having such error values
> in enums isn't unusual in C. What about idiomatic Rust? Even if it's
> unusual there, we may elect to do it anyway, just to keep generated
> Rust closer to C. But it should be a conscious decision, not a blind
> port from C to Rust.
For QType we don't need to keep it closer, but actually ABI-compatible:
QType is defined by QAPI but is used (almost exclusively) by QObject.
We use the C version in the QObject bindings, for example:
$($crate::bindings::QTYPE_QNULL => break $unit,)?
> * "Default for QType" is NONE. In C, it's zero bytes, which boils down
> to QTYPE_NONE.
>
> * QTYPE__MAX is a bit of a headache in C. It's not a valid enum value.
> We make it one only because we need to know the largest valid enum
> value, e.g. to size arrays, and the easiest way to get that value is
> adding an invalid one to the enum. Same for all the other generated
> enums. Could we avoid it in Rust?
Yes, I think so.
> * C has a file comment of the form
>
> /*
> * One-line description of the file's purpose
> *
> * Copyright lines
> *
> * License blurb
> */
>
> I think Rust could use such a comment, too.
Ok.
> * C has built-in types like QType in qapi-builtin-types.h, generated
> only with -b. This is a somewhat crude way to let code generated for
> multiple schemas coexist: pass -b for exactly one of them. If we
> generated code for built-in types unconditionally into qapi-types.h,
> the C compiler would choke on duplicate definitions. Why is this not
> a problem with Rust?
Because there's better namespacing, so it's okay to define the builtin
types in more than one place. However, do we need at all the builtin
types in Rust? QType is only defined in QAPI to have the nice enum
lookup tables, and we can get it via FFI bindings. Lists, as you say
below, are not needed, and they are also a part of qapi-builtin-types.h.
So I think Rust does not need built-in types at all, which I think
solves all your problems here (other than _MAX which can be removed).
>
> * The Rust version doesn't have deallocation boilerplate. Deallocation
> just works there, I guess.
>
> * The Rust version doesn't have the List type. Lists just work there, I
> guess.
Yep.
> * The Rust version doesn't have the implicit type q_obj_my_command_arg,
> which is the arguments of my-command as a struct type. C needs it for
> marshaling / unmarshaling with visitors. Rust doesn't, because we use
> serde. Correct?
Commands are not supported at all yet.
Paolo
next prev parent reply other threads:[~2025-12-10 14:39 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-10 15:09 [PATCH 00/19] rust: QObject and QAPI bindings Paolo Bonzini
2025-10-10 15:09 ` [PATCH 01/19] util: add ensure macro Paolo Bonzini
2025-10-10 15:09 ` [PATCH 02/19] rust/util: use anyhow's native chaining capabilities Paolo Bonzini
2025-10-10 15:09 ` [PATCH 03/19] rust: do not add qemuutil to Rust crates Paolo Bonzini
2025-12-05 8:30 ` Markus Armbruster
2025-12-05 12:07 ` Paolo Bonzini
2025-10-10 15:09 ` [PATCH 04/19] rust/qobject: add basic bindings Paolo Bonzini
2025-12-05 9:35 ` Markus Armbruster
2025-12-05 11:27 ` Paolo Bonzini
2025-12-11 7:21 ` Markus Armbruster
2025-10-10 15:09 ` [PATCH 05/19] subprojects: add serde Paolo Bonzini
2025-10-10 15:09 ` [PATCH 06/19] rust/qobject: add Serialize implementation Paolo Bonzini
2025-12-05 9:47 ` Markus Armbruster
2025-12-10 17:19 ` Paolo Bonzini
2025-12-11 7:07 ` Markus Armbruster
2025-10-10 15:09 ` [PATCH 07/19] rust/qobject: add Serializer (to_qobject) implementation Paolo Bonzini
2025-10-10 15:09 ` [PATCH 08/19] rust/qobject: add Deserialize implementation Paolo Bonzini
2025-10-10 15:09 ` [PATCH 09/19] rust/qobject: add Deserializer (from_qobject) implementation Paolo Bonzini
2025-10-10 15:09 ` [PATCH 10/19] rust/util: replace Error::err_or_unit/err_or_else with Error::with_errp Paolo Bonzini
2025-10-10 15:09 ` [PATCH 11/19] rust/qobject: add from/to JSON bindings for QObject Paolo Bonzini
2025-12-05 10:04 ` Markus Armbruster
2025-12-05 11:09 ` Paolo Bonzini
2025-12-05 12:16 ` Markus Armbruster
2025-12-08 7:00 ` Paolo Bonzini
2025-12-08 9:17 ` Markus Armbruster
2025-12-09 7:34 ` Paolo Bonzini
2025-10-10 15:09 ` [PATCH 12/19] rust/qobject: add Display/Debug Paolo Bonzini
2025-10-10 15:09 ` [PATCH 13/19] scripts/qapi: add QAPISchemaIfCond.rsgen() Paolo Bonzini
2025-12-09 18:43 ` Markus Armbruster
2025-10-10 15:09 ` [PATCH 14/19] scripts/qapi: generate high-level Rust bindings Paolo Bonzini
2025-12-09 10:03 ` Markus Armbruster
2025-12-10 14:38 ` Paolo Bonzini [this message]
2025-12-11 7:25 ` Markus Armbruster
2025-10-10 15:10 ` [PATCH 15/19] scripts/qapi: add serde attributes Paolo Bonzini
2025-12-09 12:24 ` Markus Armbruster
2025-10-10 15:10 ` [PATCH 16/19] scripts/qapi: strip trailing whitespaces Paolo Bonzini
2025-12-09 8:48 ` Markus Armbruster
2025-12-10 17:28 ` Paolo Bonzini
2025-10-10 15:10 ` [PATCH 17/19] scripts/rustc_args: add --no-strict-cfg Paolo Bonzini
2025-10-10 15:10 ` [PATCH 18/19] rust/util: build QAPI types Paolo Bonzini
2025-10-10 15:10 ` [PATCH 19/19] rust/tests: QAPI integration tests Paolo Bonzini
2025-10-30 17:13 ` [PATCH 00/19] rust: QObject and QAPI bindings Paolo Bonzini
2025-12-05 13:55 ` Markus Armbruster
2025-12-09 6:01 ` Markus Armbruster
2025-12-10 14:12 ` Paolo Bonzini
2025-12-10 14:50 ` Markus Armbruster
2025-12-10 16:01 ` Paolo Bonzini
2025-12-10 16:59 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f8b03a16-d957-4968-a7c8-38fec0b01a88@redhat.com \
--to=pbonzini@redhat.com \
--cc=armbru@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-rust@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).