Commit 6ddeefff authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2016-05-12' into staging



QAPI patches for 2016-05-12

# gpg: Signature made Thu 12 May 2016 08:49:04 BST using RSA key ID EB918653
# gpg: Good signature from "Markus Armbruster <armbru@redhat.com>"
# gpg:                 aka "Markus Armbruster <armbru@pond.sub.org>"

* remotes/armbru/tags/pull-qapi-2016-05-12: (23 commits)
  qapi: Change visit_type_FOO() to no longer return partial objects
  qapi: Simplify semantics of visit_next_list()
  qapi: Fix string input visitor handling of invalid list
  tests/string-input-visitor: Add negative integer tests
  qapi: Split visit_end_struct() into pieces
  qmp: Tighten output visitor rules
  qmp: Don't reuse qmp visitor after grabbing output
  spapr_drc: Expose 'null' in qom-get when there is no fdt
  qmp: Support explicit null during visits
  qapi: Add visit_type_null() visitor
  tests: Add check-qnull
  qapi: Document visitor interfaces, add assertions
  qmp-input: Refactor when list is advanced
  qmp-input: Require struct push to visit members of top dict
  qom: Wrap prop visit in visit_start_struct
  qapi-commands: Wrap argument visit in visit_start_struct
  qmp-input: Don't consume input when checking has_member
  qapi: Use strict QMP input visitor in more places
  qapi: Consolidate QMP input visitor creation
  qmp-input: Clean up stack handling
  ...

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents f83b70f7 68ab47e4
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -196,7 +196,6 @@ block_crypto_open_opts_init(QCryptoBlockFormat format,
    OptsVisitor *ov;
    QCryptoBlockOpenOptions *ret = NULL;
    Error *local_err = NULL;
    Error *end_err = NULL;

    ret = g_new0(QCryptoBlockOpenOptions, 1);
    ret->format = format;
@@ -219,9 +218,11 @@ block_crypto_open_opts_init(QCryptoBlockFormat format,
        error_setg(&local_err, "Unsupported block format %d", format);
        break;
    }
    if (!local_err) {
        visit_check_struct(opts_get_visitor(ov), &local_err);
    }

    visit_end_struct(opts_get_visitor(ov), &end_err);
    error_propagate(&local_err, end_err);
    visit_end_struct(opts_get_visitor(ov));

 out:
    if (local_err) {
@@ -242,7 +243,6 @@ block_crypto_create_opts_init(QCryptoBlockFormat format,
    OptsVisitor *ov;
    QCryptoBlockCreateOptions *ret = NULL;
    Error *local_err = NULL;
    Error *end_err = NULL;

    ret = g_new0(QCryptoBlockCreateOptions, 1);
    ret->format = format;
@@ -265,9 +265,11 @@ block_crypto_create_opts_init(QCryptoBlockFormat format,
        error_setg(&local_err, "Unsupported block format %d", format);
        break;
    }
    if (!local_err) {
        visit_check_struct(opts_get_visitor(ov), &local_err);
    }

    visit_end_struct(opts_get_visitor(ov), &end_err);
    error_propagate(&local_err, end_err);
    visit_end_struct(opts_get_visitor(ov));

 out:
    if (local_err) {
+33 −11
Original line number Diff line number Diff line
@@ -899,10 +899,16 @@ Example:
            goto out_obj;
        }
        visit_type_UserDefOne_members(v, *obj, &err);
        error_propagate(errp, err);
        err = NULL;
        if (err) {
            goto out_obj;
        }
        visit_check_struct(v, &err);
    out_obj:
        visit_end_struct(v, &err);
        visit_end_struct(v);
        if (err && visit_is_input(v)) {
            qapi_free_UserDefOne(*obj);
            *obj = NULL;
        }
    out:
        error_propagate(errp, err);
    }
@@ -910,21 +916,27 @@ Example:
    void visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOneList **obj, Error **errp)
    {
        Error *err = NULL;
        GenericList *i, **prev;
        UserDefOneList *tail;
        size_t size = sizeof(**obj);

        visit_start_list(v, name, &err);
        visit_start_list(v, name, (GenericList **)obj, size, &err);
        if (err) {
            goto out;
        }

        for (prev = (GenericList **)obj;
             !err && (i = visit_next_list(v, prev, sizeof(**obj))) != NULL;
             prev = &i) {
            UserDefOneList *native_i = (UserDefOneList *)i;
            visit_type_UserDefOne(v, NULL, &native_i->value, &err);
        for (tail = *obj; tail;
             tail = (UserDefOneList *)visit_next_list(v, (GenericList *)tail, size)) {
            visit_type_UserDefOne(v, NULL, &tail->value, &err);
            if (err) {
                break;
            }
        }

        visit_end_list(v);
        if (err && visit_is_input(v)) {
            qapi_free_UserDefOneList(*obj);
            *obj = NULL;
        }
    out:
        error_propagate(errp, err);
    }
@@ -996,13 +1008,21 @@ Example:
    {
        Error *err = NULL;
        UserDefOne *retval;
        QmpInputVisitor *qiv = qmp_input_visitor_new_strict(QOBJECT(args));
        QmpInputVisitor *qiv = qmp_input_visitor_new(QOBJECT(args), true);
        QapiDeallocVisitor *qdv;
        Visitor *v;
        UserDefOneList *arg1 = NULL;

        v = qmp_input_get_visitor(qiv);
        visit_start_struct(v, NULL, NULL, 0, &err);
        if (err) {
            goto out;
        }
        visit_type_UserDefOneList(v, "arg1", &arg1, &err);
        if (!err) {
            visit_check_struct(v, &err);
        }
        visit_end_struct(v);
        if (err) {
            goto out;
        }
@@ -1019,7 +1039,9 @@ Example:
        qmp_input_visitor_cleanup(qiv);
        qdv = qapi_dealloc_visitor_new();
        v = qapi_dealloc_get_visitor(qdv);
        visit_start_struct(v, NULL, NULL, 0, NULL);
        visit_type_UserDefOneList(v, "arg1", &arg1, NULL);
        visit_end_struct(v);
        qapi_dealloc_visitor_cleanup(qdv);
    }

+4 −7
Original line number Diff line number Diff line
@@ -269,11 +269,7 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
    void *fdt;

    if (!drc->fdt) {
        visit_start_struct(v, name, NULL, 0, &err);
        if (!err) {
            visit_end_struct(v, &err);
        }
        error_propagate(errp, err);
        visit_type_null(v, NULL, errp);
        return;
    }

@@ -301,7 +297,8 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
        case FDT_END_NODE:
            /* shouldn't ever see an FDT_END_NODE before FDT_BEGIN_NODE */
            g_assert(fdt_depth > 0);
            visit_end_struct(v, &err);
            visit_check_struct(v, &err);
            visit_end_struct(v);
            if (err) {
                error_propagate(errp, err);
                return;
@@ -312,7 +309,7 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
            int i;
            prop = fdt_get_property_by_offset(fdt, fdt_offset, &prop_len);
            name = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
            visit_start_list(v, name, &err);
            visit_start_list(v, name, NULL, 0, &err);
            if (err) {
                error_propagate(errp, err);
                return;
+8 −7
Original line number Diff line number Diff line
@@ -138,17 +138,18 @@ static void balloon_stats_get_all(Object *obj, Visitor *v, const char *name,
    for (i = 0; i < VIRTIO_BALLOON_S_NR; i++) {
        visit_type_uint64(v, balloon_stat_names[i], &s->stats[i], &err);
        if (err) {
            break;
            goto out_nested;
        }
    }
    error_propagate(errp, err);
    err = NULL;
    visit_end_struct(v, &err);
    visit_check_struct(v, &err);
out_nested:
    visit_end_struct(v);

    if (!err) {
        visit_check_struct(v, &err);
    }
out_end:
    error_propagate(errp, err);
    err = NULL;
    visit_end_struct(v, &err);
    visit_end_struct(v);
out:
    error_propagate(errp, err);
}
+5 −0
Original line number Diff line number Diff line
@@ -18,6 +18,11 @@

typedef struct QapiDeallocVisitor QapiDeallocVisitor;

/*
 * The dealloc visitor is primarly used only by generated
 * qapi_free_FOO() functions, and is the only visitor designed to work
 * correctly in the face of a partially-constructed QAPI tree.
 */
QapiDeallocVisitor *qapi_dealloc_visitor_new(void);
void qapi_dealloc_visitor_cleanup(QapiDeallocVisitor *d);

Loading