Skip to content
  • Eric Blake's avatar
    qapi: Don't special-case simple union wrappers · 32bafa8f
    Eric Blake authored
    
    
    Simple unions were carrying a special case that hid their 'data'
    QMP member from the resulting C struct, via the hack method
    QAPISchemaObjectTypeVariant.simple_union_type().  But by using
    the work we started by unboxing flat union and alternate
    branches, coupled with the ability to visit the members of an
    implicit type, we can now expose the simple union's implicit
    type in qapi-types.h:
    
    | struct q_obj_ImageInfoSpecificQCow2_wrapper {
    |     ImageInfoSpecificQCow2 *data;
    | };
    |
    | struct q_obj_ImageInfoSpecificVmdk_wrapper {
    |     ImageInfoSpecificVmdk *data;
    | };
    ...
    | struct ImageInfoSpecific {
    |     ImageInfoSpecificKind type;
    |     union { /* union tag is @type */
    |         void *data;
    |-        ImageInfoSpecificQCow2 *qcow2;
    |-        ImageInfoSpecificVmdk *vmdk;
    |+        q_obj_ImageInfoSpecificQCow2_wrapper qcow2;
    |+        q_obj_ImageInfoSpecificVmdk_wrapper vmdk;
    |     } u;
    | };
    
    Doing this removes asymmetry between QAPI's QMP side and its
    C side (both sides now expose 'data'), and means that the
    treatment of a simple union as sugar for a flat union is now
    equivalent in both languages (previously the two approaches used
    a different layer of dereferencing, where the simple union could
    be converted to a flat union with equivalent C layout but
    different {} on the wire, or to an equivalent QMP wire form
    but with different C representation).  Using the implicit type
    also lets us get rid of the simple_union_type() hack.
    
    Of course, now all clients of simple unions have to adjust from
    using su->u.member to using su->u.member.data; while this touches
    a number of files in the tree, some earlier cleanup patches
    helped minimize the change to the initialization of a temporary
    variable rather than every single member access.  The generated
    qapi-visit.c code is also affected by the layout change:
    
    |@@ -7393,10 +7393,10 @@ void visit_type_ImageInfoSpecific_member
    |     }
    |     switch (obj->type) {
    |     case IMAGE_INFO_SPECIFIC_KIND_QCOW2:
    |-        visit_type_ImageInfoSpecificQCow2(v, "data", &obj->u.qcow2, &err);
    |+        visit_type_q_obj_ImageInfoSpecificQCow2_wrapper_members(v, &obj->u.qcow2, &err);
    |         break;
    |     case IMAGE_INFO_SPECIFIC_KIND_VMDK:
    |-        visit_type_ImageInfoSpecificVmdk(v, "data", &obj->u.vmdk, &err);
    |+        visit_type_q_obj_ImageInfoSpecificVmdk_wrapper_members(v, &obj->u.vmdk, &err);
    |         break;
    |     default:
    |         abort();
    
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    Message-Id: <1458254921-17042-13-git-send-email-eblake@redhat.com>
    Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
    32bafa8f