Eric Blake <[email protected]> writes:
> Rather than storing a base class as a pointer to a box, just
> store the fields of that base class in the same order, so that
> a child struct can be directly cast to its parent. This gives
> less malloc overhead, less pointer dereferencing, and even less
> generated code. Compare to the earlier commit 1e6c1616a "qapi:
> Generate a nicer struct for flat unions" (although that patch
> had fewer places to change, as less of qemu was directly using
> qapi structs for flat unions). It also allows us to turn on
> automatic type-safe wrappers for upcasting to the base class
> of a struct.
>
> Changes to the generated code look like this in qapi-types.h:
>
> | struct SpiceChannel {
> |- SpiceBasicInfo *base;
> |+ /* Members inherited from SpiceBasicInfo: */
> |+ char *host;
> |+ char *port;
> |+ NetworkAddressFamily family;
> |+ /* Own members: */
> | int64_t connection_id;
>
> as well as added upcast functions like qapi_SpiceChannel_base().
"additional upcast functions" sounds better to my ears.
> Meanwhile, changes to qapi-visit.c look like:
>
> | static void visit_type_SpiceChannel_fields(Visitor *v, SpiceChannel **obj,
> Error **errp)
> | {
> | Error *err = NULL;
> |
> |- visit_type_implicit_SpiceBasicInfo(v, &(*obj)->base, &err);
> |+ visit_type_SpiceBasicInfo_fields(v, (SpiceBasicInfo **)obj, &err);
> | if (err) {
>
> (the cast is necessary, since our upcast wrappers only deal with a
> single pointer, not pointer-to-pointer); plus the wholesale
> elimination of some now-unused visit_type_implicit_FOO() functions.
>
> Without boxing, the corner case of one empty struct having
> another empty struct as its base type now requires inserting a
> dummy member (previously, the 'Base *base' member sufficed).
>
> And now that we no longer consume a 'base' member in the generated
> C struct, we can delete the former negative struct-base-clash-base
> test.
>
> Signed-off-by: Eric Blake <[email protected]>
>
> ---
> v11: delay gen_upcast for structs until here, rebase to proper use
> of gen_visit_fields_decl() in gen_visit_struct_fields(), improve
> commit message
> v10: split off some of the cleanups into earlier patches, improve
> commit message, don't emit visit_type_FOO_fields out of order,
> save positive tests in qapi-schema-tests for later
> v9: (no v6-8): hoist from v5 34/46, rebase to master
Patch looks good. I can touch up the commit message in my tree.