• E
    qapi: Improve generated event use of qapi visitor · a16e3e5c
    Eric Blake 提交于
    All other successful clients of visit_start_struct() were paired
    with an unconditional visit_end_struct(); but the generated
    code for events was relying on qmp_output_visitor_cleanup() to
    work on an incomplete visit.  Alter the code to guarantee that
    the struct is completed, which will make a future patch to
    split visit_end_struct() easier to reason about.  While at it,
    drop some assertions and comments that are not present in other
    uses of the qmp output visitor, and pass NULL rather than "" as
    the 'kind' parameter (matching most other uses where obj is NULL).
    
    The changes to the generated code look like:
    
    |     qmp = qmp_event_build_dict("DEVICE_TRAY_MOVED");
    |
    |     qov = qmp_output_visitor_new();
    |-    g_assert(qov);
    |-
    |     v = qmp_output_get_visitor(qov);
    |-    g_assert(v);
    |
    |-    /* Fake visit, as if all members are under a structure */
    |-    visit_start_struct(v, NULL, "", "DEVICE_TRAY_MOVED", 0, &err);
    |+    visit_start_struct(v, NULL, NULL, "DEVICE_TRAY_MOVED", 0, &err);
    |     if (err) {
    |         goto out;
    |     }
    |     visit_type_str(v, (char **)&device, "device", &err);
    |     if (err) {
    |-        goto out;
    |+        goto out_obj;
    |     }
    |     visit_type_bool(v, &tray_open, "tray-open", &err);
    |     if (err) {
    |-        goto out;
    |+        goto out_obj;
    |     }
    |-    visit_end_struct(v, &err);
    |+out_obj:
    |+    visit_end_struct(v, err ? NULL : &err);
    |     if (err) {
    |         goto out;
    |     }
    |
    |     obj = qmp_output_get_qobject(qov);
    |-    g_assert(obj != NULL);
    |+    g_assert(obj);
    |
    |     qdict_put_obj(qmp, "data", obj);
    |     emit(QAPI_EVENT_DEVICE_TRAY_MOVED, qmp, &err);
    
    Note that the 'goto out_obj' with no intervening code before the
    label, as well as the construct of 'err ? NULL : &err', are both
    a bit unusual but also temporary; they get fixed in a later patch
    that splits visit_end_struct() to drop its errp parameter by moving
    some checking before the label.  But until that time, this was the
    simplest way to avoid the appearance of passing a possibly-set
    error to visit_end_struct(), even though actual code inspection
    shows that visit_end_struct() for a QMP output visitor will never
    set an error.
    Signed-off-by: NEric Blake <eblake@redhat.com>
    Message-Id: <1454075341-13658-11-git-send-email-eblake@redhat.com>
    [Commit message's code diff tweaked]
    Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
    a16e3e5c
qapi.py 59.3 KB