All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v14 05/19] qmp-input: Clean up stack handling
Date: Wed, 13 Apr 2016 10:36:11 -0600	[thread overview]
Message-ID: <570E757B.5070909@redhat.com> (raw)
In-Reply-To: <871t69ld38.fsf@dusky.pond.sub.org>

[-- Attachment #1: Type: text/plain, Size: 3974 bytes --]

On 04/13/2016 09:53 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> Management of the top of stack was a bit verbose; creating a
>> temporary variable and adding some comments makes the existing
>> code more legible before the next few patches improve things.
>> No semantic changes other than asserting that we are always
>> visiting a QObject, and not a NULL value.
>>
>> Signed-off-by: Eric Blake <eblake@redhat.com>
>>
>> ---

> 
> The mixture of block comments and comments to the right is a bit
> awkward.  What about:
> 
>    typedef struct StackObject {
>        QObject *obj; /* Object being visited */
> 
>        GHashTable *h;              /* if obj is dict: unvisited keys */
>        const QListEntry *entry;    /* if obj is list: unvisited tail */
>    } StackObject;
> 

Works for me.

>>
>>  struct QmpInputVisitor
>>  {
>>      Visitor visitor;
>> +
>> +    /* Stack of objects being visited.  stack[0] is root of visit,
>> +     * stack[1] and below correspond to visit_start_struct (nested
>> +     * QDict) and visit_start_list (nested QList).  */
> 
> I guess what you want to say is stack[1..] record the nesting of
> start_struct() ... end_struct() and start_list() ... end_list() pairs.
> 
> Comment gets rewritten in PATCH 17, no need to worry too much about it.
> 
>>      StackObject stack[QIV_STACK_SIZE];
>>      int nb_stack;
>> +
>> +    /* True to track whether all keys in QDict have been parsed.  */
>>      bool strict;
> 
> I think @strict switches on rejection of unexpected dictionary keys.
> See qmp_input_pop() below.
> 
> I dislike the fact that we have two input visitors, and the one with the
> obvious name ignores certain errors.  I don't doubt that it has its
> uses, but reporting errors should be the default, and ignoring them
> should be a conscious decision.  Anyway, not this patch's problem.

Dan also has a pending patch that reworks it to add yet another
parameter (the ability to take input in string format and auto-convert
it to the correct type).  In that one, he exposes a third method for
choosing which visitor you get, and which then under the hood call a
helper with two boolean flags.  Maybe it's time to just convert all
clients to always passing the parameters they want, along with auditing
whether ignoring extra input is a sane option for that client - but as
you say, it's fine for a separate patch.

>> +
>> +    /* If we have a name, and we're in a dictionary, then return that
>> +     * value. */
> 
> Can we be in a dictionary and not have a name?

The converse happens: we can certainly have a name and not be in a
dictionary, for a top-level visit.  But it has weird semantics until I
clean it up later in 17/19.  For this patch, it was just code motion and
documentation (the 'if (name && qobject_type...)' condition here is the
same pre- and post-patch), where I was just getting rid of a dead 'if
(qobj)'.


> 
> 
>    static void qmp_input_pop(QmpInputVisitor *qiv, Error **errp)
>    {
>        assert(qiv->nb_stack > 0);
> 
>        if (qiv->strict) {
>            GHashTable * const top_ht = qiv->stack[qiv->nb_stack - 1].h;
>            if (top_ht) {
>                GHashTableIter iter;
>                const char *key;
> 
>                g_hash_table_iter_init(&iter, top_ht);
>                if (g_hash_table_iter_next(&iter, (void **)&key, NULL)) {
>                    error_setg(errp, QERR_QMP_EXTRA_MEMBER, key);
> 
> This looks wrong.  If we have more than one extra members, the second
> call error_setg() will fail an assertion in error_setv(), unless errp is
> null.

Whoops - looks like f96493b1 is broken for missing a 'break' statement.
 I'll send that as a separate for-2.6 cleanup that we should pull sooner
rather than later.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

  reply	other threads:[~2016-04-13 16:36 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-08 16:12 [Qemu-devel] [PATCH v14 00/19] qapi visitor cleanups (post-introspection cleanups subset E) Eric Blake
2016-04-08 16:12 ` [Qemu-devel] [PATCH v14 01/19] qapi: Consolidate object visitors Eric Blake
2016-04-13 12:48   ` Markus Armbruster
2016-04-13 16:13     ` Eric Blake
2016-04-15 15:05       ` Markus Armbruster
2016-04-08 16:12 ` [Qemu-devel] [PATCH v14 02/19] qapi-visit: Add visitor.type classification Eric Blake
2016-04-13 13:49   ` Markus Armbruster
2016-04-13 16:23     ` Eric Blake
2016-04-15 15:24       ` Markus Armbruster
2016-04-08 16:12 ` [Qemu-devel] [PATCH v14 03/19] qapi: Guarantee NULL obj on input visitor callback error Eric Blake
2016-04-13 14:04   ` Markus Armbruster
2016-04-08 16:12 ` [Qemu-devel] [PATCH v14 04/19] qmp: Drop dead command->type Eric Blake
2016-04-08 16:12 ` [Qemu-devel] [PATCH v14 05/19] qmp-input: Clean up stack handling Eric Blake
2016-04-13 15:53   ` Markus Armbruster
2016-04-13 16:36     ` Eric Blake [this message]
2016-04-13 16:40       ` Eric Blake
2016-04-15 15:27       ` Markus Armbruster
2016-04-08 16:12 ` [Qemu-devel] [PATCH v14 06/19] qmp-input: Don't consume input when checking has_member Eric Blake
2016-04-13 16:06   ` Markus Armbruster
2016-04-13 16:43     ` Eric Blake
2016-04-15 15:28       ` Markus Armbruster
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 07/19] qmp-input: Refactor when list is advanced Eric Blake
2016-04-13 17:38   ` Markus Armbruster
2016-04-13 19:58     ` Eric Blake
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 08/19] qapi: Document visitor interfaces, add assertions Eric Blake
2016-04-14 15:22   ` Markus Armbruster
2016-04-26 21:50     ` Eric Blake
2016-04-28 16:33       ` Markus Armbruster
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 09/19] tests: Add check-qnull Eric Blake
2016-04-14 16:13   ` Markus Armbruster
2016-04-14 17:37     ` Markus Armbruster
2016-04-14 18:54       ` Eric Blake
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 10/19] qapi: Add visit_type_null() visitor Eric Blake
2016-04-14 17:09   ` Markus Armbruster
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 11/19] qmp: Support explicit null during visits Eric Blake
2016-04-15  8:29   ` Markus Armbruster
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 12/19] spapr_drc: Expose 'null' in qom-get when there is no fdt Eric Blake
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 13/19] qmp: Tighten output visitor rules Eric Blake
2016-04-15  9:02   ` Markus Armbruster
2016-04-27  1:29     ` Eric Blake
2016-04-27  6:29       ` Markus Armbruster
2016-04-27 12:22         ` Eric Blake
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 14/19] qapi: Split visit_end_struct() into pieces Eric Blake
2016-04-15 11:03   ` Markus Armbruster
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 15/19] qapi-commands: Wrap argument visit in visit_start_struct Eric Blake
2016-04-15 11:42   ` Markus Armbruster
2016-04-26 12:56     ` Eric Blake
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 16/19] qom: Wrap prop " Eric Blake
2016-04-15 11:52   ` Markus Armbruster
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 17/19] qmp-input: Require struct push to visit members of top dict Eric Blake
2016-04-15 12:53   ` Markus Armbruster
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 18/19] qapi: Simplify semantics of visit_next_list() Eric Blake
2016-04-15 14:09   ` Markus Armbruster
2016-04-22  8:46     ` Markus Armbruster
2016-04-22 11:35       ` Markus Armbruster
2016-04-22 11:37         ` [Qemu-devel] [PATCH] tests/string-input-visitor: Add negative integer tests Markus Armbruster
2016-04-27 20:22         ` [Qemu-devel] [PATCH v14 18/19] qapi: Simplify semantics of visit_next_list() Eric Blake
2016-04-08 16:13 ` [Qemu-devel] [PATCH v14 19/19] qapi: Change visit_type_FOO() to no longer return partial objects Eric Blake
2016-04-15 14:49   ` Markus Armbruster
2016-04-27 21:51     ` Eric Blake
2016-04-15 15:41 ` [Qemu-devel] [PATCH v14 00/19] qapi visitor cleanups (post-introspection cleanups subset E) Markus Armbruster

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=570E757B.5070909@redhat.com \
    --to=eblake@redhat.com \
    --cc=armbru@redhat.com \
    --cc=mdroth@linux.vnet.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.