Skip to content

Commit

Permalink
qapi: Make more of qobject_to()
Browse files Browse the repository at this point in the history
This patch reworks some places which use either qobject_type() checks
plus qobject_to(), where the latter alone is sufficient, or NULL checks
plus qobject_type() checks where we can simply do a qobject_to() != NULL
check.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-Id: <20180224154033.29559-6-mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
[eblake: rebase to qobject_to() parameter ordering]
Signed-off-by: Eric Blake <eblake@redhat.com>
  • Loading branch information
XanClic authored and ebblake committed Mar 19, 2018
1 parent cb51b97 commit 532fb53
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 17 deletions.
4 changes: 2 additions & 2 deletions qapi/qobject-input-visitor.c
Expand Up @@ -339,7 +339,7 @@ static GenericList *qobject_input_next_list(Visitor *v, GenericList *tail,
QObjectInputVisitor *qiv = to_qiv(v);
StackObject *tos = QSLIST_FIRST(&qiv->stack);

assert(tos && tos->obj && qobject_type(tos->obj) == QTYPE_QLIST);
assert(tos && qobject_to(QList, tos->obj));

if (!tos->entry) {
return NULL;
Expand All @@ -353,7 +353,7 @@ static void qobject_input_check_list(Visitor *v, Error **errp)
QObjectInputVisitor *qiv = to_qiv(v);
StackObject *tos = QSLIST_FIRST(&qiv->stack);

assert(tos && tos->obj && qobject_type(tos->obj) == QTYPE_QLIST);
assert(tos && qobject_to(QList, tos->obj));

if (tos->entry) {
error_setg(errp, "Only %u list elements expected in %s",
Expand Down
13 changes: 7 additions & 6 deletions qobject/json-parser.c
Expand Up @@ -276,7 +276,8 @@ static void parser_context_free(JSONParserContext *ctxt)
*/
static int parse_pair(JSONParserContext *ctxt, QDict *dict, va_list *ap)
{
QObject *key = NULL, *value;
QObject *value;
QString *key = NULL;
JSONToken *peek, *token;

peek = parser_context_peek_token(ctxt);
Expand All @@ -285,8 +286,8 @@ static int parse_pair(JSONParserContext *ctxt, QDict *dict, va_list *ap)
goto out;
}

key = parse_value(ctxt, ap);
if (!key || qobject_type(key) != QTYPE_QSTRING) {
key = qobject_to(QString, parse_value(ctxt, ap));
if (!key) {
parse_error(ctxt, peek, "key is not a string in object");
goto out;
}
Expand All @@ -308,14 +309,14 @@ static int parse_pair(JSONParserContext *ctxt, QDict *dict, va_list *ap)
goto out;
}

qdict_put_obj(dict, qstring_get_str(qobject_to(QString, key)), value);
qdict_put_obj(dict, qstring_get_str(key), value);

qobject_decref(key);
QDECREF(key);

return 0;

out:
qobject_decref(key);
QDECREF(key);

return -1;
}
Expand Down
20 changes: 11 additions & 9 deletions qobject/qdict.c
Expand Up @@ -882,18 +882,20 @@ QObject *qdict_crumple(const QDict *src, Error **errp)

child = qdict_get(two_level, prefix);
if (suffix) {
if (child) {
if (qobject_type(child) != QTYPE_QDICT) {
QDict *child_dict = qobject_to(QDict, child);
if (!child_dict) {
if (child) {
error_setg(errp, "Key %s prefix is already set as a scalar",
prefix);
goto error;
}
} else {
child = QOBJECT(qdict_new());
qdict_put_obj(two_level, prefix, child);

child_dict = qdict_new();
qdict_put_obj(two_level, prefix, QOBJECT(child_dict));
}

qobject_incref(ent->value);
qdict_put_obj(qobject_to(QDict, child), suffix, ent->value);
qdict_put_obj(child_dict, suffix, ent->value);
} else {
if (child) {
error_setg(errp, "Key %s prefix is already set as a dict",
Expand All @@ -913,9 +915,9 @@ QObject *qdict_crumple(const QDict *src, Error **errp)
multi_level = qdict_new();
for (ent = qdict_first(two_level); ent != NULL;
ent = qdict_next(two_level, ent)) {

if (qobject_type(ent->value) == QTYPE_QDICT) {
child = qdict_crumple(qobject_to(QDict, ent->value), errp);
QDict *dict = qobject_to(QDict, ent->value);
if (dict) {
child = qdict_crumple(dict, errp);
if (!child) {
goto error;
}
Expand Down

0 comments on commit 532fb53

Please sign in to comment.