qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v6 04/22] qapi: extend qdict_flatten() for QList


From: Stefan Hajnoczi
Subject: Re: [Qemu-devel] [PATCH v6 04/22] qapi: extend qdict_flatten() for QLists
Date: Fri, 20 Dec 2013 10:46:13 +0100
User-agent: Mutt/1.5.21 (2010-09-15)

On Thu, Dec 19, 2013 at 08:47:05PM +0100, Max Reitz wrote:
> Reversing qdict_array_split(), qdict_flatten() should flatten QLists as
> well by interpreting them as QDicts where every entry's key is its
> index.
> 
> This allows bringing QDicts with QLists from QMP commands to the same
> form as they would be given as command-line options, thereby allowing
> them to be parsed the same way.
> 
> Signed-off-by: Max Reitz <address@hidden>
> ---
>  qobject/qdict.c | 57 
> +++++++++++++++++++++++++++++++++++++++++++++++++++------
>  1 file changed, 51 insertions(+), 6 deletions(-)

Please add a tests/check-qdict.c test case.

> diff --git a/qobject/qdict.c b/qobject/qdict.c
> index fca1902..7b6b08a 100644
> --- a/qobject/qdict.c
> +++ b/qobject/qdict.c
> @@ -477,7 +477,46 @@ static void qdict_destroy_obj(QObject *obj)
>      g_free(qdict);
>  }
>  
> -static void qdict_do_flatten(QDict *qdict, QDict *target, const char *prefix)
> +static void qdict_flatten_qdict(QDict *qdict, QDict *target,
> +                                const char *prefix);
> +
> +static void qdict_flatten_qlist(QList *qlist, QDict *target, const char 
> *prefix)
> +{
> +    QObject *value;
> +    const QListEntry *entry;
> +    char *new_key;
> +    int i;
> +
> +    /* This function is never called with prefix == NULL, i.e., it is always
> +     * called from within qdict_flatten_q(list|dict)(). Therefore, it does 
> not
> +     * need to remove list entries during the iteration (the whole list will 
> be
> +     * deleted eventually anyway from qdict_flatten_qdict()). */
> +    assert(prefix);
> +
> +    entry = qlist_first(qlist);
> +
> +    for (i = 0; entry; entry = qlist_next(entry), i++) {
> +        value = qlist_entry_obj(entry);
> +
> +        qobject_incref(value);
> +        new_key = g_strdup_printf("%s.%i", prefix, i);
> +        qdict_put_obj(target, new_key, value);

It seems this operation is clobbered by what follows and should be
deleted.  Is the incref also superfluous or...

> +
> +        if (qobject_type(value) == QTYPE_QDICT) {
> +            qdict_flatten_qdict(qobject_to_qdict(value), target, new_key);
> +        } else if (qobject_type(value) == QTYPE_QLIST) {
> +            qdict_flatten_qlist(qobject_to_qlist(value), target, new_key);
> +        } else {
> +            /* All other types are moved to the target unchanged. */
> +            qobject_incref(value);

...should this one be deleted?

> +            qdict_put_obj(target, new_key, value);
> +        }
> +
> +        g_free(new_key);
> +    }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]