From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 10/23] qmp-input: Require struct push to visit members of top dict
Date: Thu, 12 May 2016 09:58:57 +0200 [thread overview]
Message-ID: <1463039950-4021-11-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1463039950-4021-1-git-send-email-armbru@redhat.com>
From: Eric Blake <eblake@redhat.com>
Don't embed the root of the visit into the stack of current
containers being visited. That way, we no longer get confused
on whether the first visit of a dictionary is to the dictionary
itself or to one of the members of the dictionary, based on
whether the caller passed name=NULL; and makes the QMP Input
visitor like other visitors where the value of 'name' is now
ignored on the root visit. (We may someday want to revisit
the rules on what 'name' should be on a top-level visit,
rather than just ignoring it; but that would be the topic of
another patch).
An audit of all qmp_input_visitor_new() call sites shows that
there were only two places where callers had previously been
visiting to a QDict with a non-NULL name to bypass a call to
visit_start_struct(), and those were fixed in prior patches.
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1461879932-9020-11-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
qapi/qmp-input-visitor.c | 43 +++++++++++++++++++++++--------------------
1 file changed, 23 insertions(+), 20 deletions(-)
diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c
index cae6387..f158d57 100644
--- a/qapi/qmp-input-visitor.c
+++ b/qapi/qmp-input-visitor.c
@@ -35,9 +35,11 @@ struct QmpInputVisitor
{
Visitor visitor;
- /* Stack of objects being visited. stack[0] is root of visit,
- * stack[1..] records the nesting of start_struct()/end_struct()
- * and start_list()/end_list() pairs. */
+ /* Root of visit at visitor creation. */
+ QObject *root;
+
+ /* Stack of objects being visited (all entries will be either
+ * QDict or QList). */
StackObject stack[QIV_STACK_SIZE];
int nb_stack;
@@ -54,33 +56,34 @@ static QObject *qmp_input_get_object(QmpInputVisitor *qiv,
const char *name,
bool consume)
{
- StackObject *tos = &qiv->stack[qiv->nb_stack - 1];
- QObject *qobj = tos->obj;
+ StackObject *tos;
+ QObject *qobj;
QObject *ret;
+ if (!qiv->nb_stack) {
+ /* Starting at root, name is ignored. */
+ return qiv->root;
+ }
+
+ /* We are in a container; find the next element. */
+ tos = &qiv->stack[qiv->nb_stack - 1];
+ qobj = tos->obj;
assert(qobj);
- /* If we have a name, and we're in a dictionary, then return that
- * value. */
- if (name && qobject_type(qobj) == QTYPE_QDICT) {
+ if (qobject_type(qobj) == QTYPE_QDICT) {
+ assert(name);
ret = qdict_get(qobject_to_qdict(qobj), name);
if (tos->h && consume && ret) {
bool removed = g_hash_table_remove(tos->h, name);
assert(removed);
}
- return ret;
- }
-
- /* If we are in the middle of a list, then return the next element
- * of the list. */
- if (tos->entry) {
+ } else {
assert(qobject_type(qobj) == QTYPE_QLIST);
- return qlist_entry_obj(tos->entry);
+ assert(!name);
+ ret = qlist_entry_obj(tos->entry);
}
- /* Otherwise, we are at the root of the visit or the start of a
- * list, and return the object as-is. */
- return qobj;
+ return ret;
}
static void qdict_add_key(const char *key, QObject *obj, void *opaque)
@@ -355,7 +358,7 @@ Visitor *qmp_input_get_visitor(QmpInputVisitor *v)
void qmp_input_visitor_cleanup(QmpInputVisitor *v)
{
- qobject_decref(v->stack[0].obj);
+ qobject_decref(v->root);
g_free(v);
}
@@ -381,7 +384,7 @@ QmpInputVisitor *qmp_input_visitor_new(QObject *obj, bool strict)
v->visitor.optional = qmp_input_optional;
v->strict = strict;
- qmp_input_push(v, obj, NULL);
+ v->root = obj;
qobject_incref(obj);
return v;
--
2.5.5
next prev parent reply other threads:[~2016-05-12 7:59 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-12 7:58 [Qemu-devel] [PULL 00/23] QAPI patches for 2016-05-12 Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 01/23] qapi-visit: Add visitor.type classification Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 02/23] qapi: Guarantee NULL obj on input visitor callback error Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 03/23] qmp: Drop dead command->type Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 04/23] qmp-input: Clean up stack handling Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 05/23] qapi: Consolidate QMP input visitor creation Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 06/23] qapi: Use strict QMP input visitor in more places Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 07/23] qmp-input: Don't consume input when checking has_member Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 08/23] qapi-commands: Wrap argument visit in visit_start_struct Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 09/23] qom: Wrap prop " Markus Armbruster
2016-05-12 7:58 ` Markus Armbruster [this message]
2016-05-12 7:58 ` [Qemu-devel] [PULL 11/23] qmp-input: Refactor when list is advanced Markus Armbruster
2016-05-12 7:58 ` [Qemu-devel] [PULL 12/23] qapi: Document visitor interfaces, add assertions Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 13/23] tests: Add check-qnull Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 14/23] qapi: Add visit_type_null() visitor Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 15/23] qmp: Support explicit null during visits Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 16/23] spapr_drc: Expose 'null' in qom-get when there is no fdt Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 17/23] qmp: Don't reuse qmp visitor after grabbing output Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 18/23] qmp: Tighten output visitor rules Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 19/23] qapi: Split visit_end_struct() into pieces Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 20/23] tests/string-input-visitor: Add negative integer tests Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 21/23] qapi: Fix string input visitor handling of invalid list Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 22/23] qapi: Simplify semantics of visit_next_list() Markus Armbruster
2016-05-12 7:59 ` [Qemu-devel] [PULL 23/23] qapi: Change visit_type_FOO() to no longer return partial objects Markus Armbruster
2016-05-12 14:55 ` [Qemu-devel] [PULL 00/23] QAPI patches for 2016-05-12 Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1463039950-4021-11-git-send-email-armbru@redhat.com \
--to=armbru@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).