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 drops a hack that was > needed for type-safe casting 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: > > | static inline SpiceBasicInfo *qapi_SpiceChannel_base(const SpiceChannel > *obj) > | { > |- return (SpiceBasicInfo *)obj->base; > |+ return (SpiceBasicInfo *)obj; > | }
No more, PATCH 09 hides this change. If you limit that one to just unions, it'll be visible again here, but it'll look different. > > and this in qapi-visit.c: > > | 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_SpiceBasiInfo_fields(v, (SpiceBasicInfo **)obj, &err); s/BasiI/BasicI/ > | if (err) { > > 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 pointer to the base would have > 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> Patch looks good.