Eric Blake <ebl...@redhat.com> 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 <ebl...@redhat.com> > > --- > 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.