From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:53545) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SAoZJ-0005CO-4j for qemu-devel@nongnu.org; Thu, 22 Mar 2012 16:25:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SAoZG-000277-Rl for qemu-devel@nongnu.org; Thu, 22 Mar 2012 16:25:08 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:39907) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SAoZG-00025H-Hz for qemu-devel@nongnu.org; Thu, 22 Mar 2012 16:25:06 -0400 Received: by pbcuo5 with SMTP id uo5so2220357pbc.4 for ; Thu, 22 Mar 2012 13:25:05 -0700 (PDT) Message-ID: <4F6B8A9D.302@codemonkey.ws> Date: Thu, 22 Mar 2012 15:25:01 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <1332417072-20329-1-git-send-email-pbonzini@redhat.com> <1332417072-20329-8-git-send-email-pbonzini@redhat.com> In-Reply-To: <1332417072-20329-8-git-send-email-pbonzini@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 07/10] qapi: place outermost object on qiv stack List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: anthony@codemonkey.vs, lcapitulino@redhat.com, eblake@redhat.com, qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com On 03/22/2012 06:51 AM, Paolo Bonzini wrote: > This is a slight change in the implementation of QMPInputVisitor > that helps when adding strict mode. > > Const QObjects cannot be inc/decref-ed, and that's why QMPInputVisitor > relies heavily on weak references to inner objects. I'm not removing > the weak references now, but since refcount+const is a lost battle in C > (C++ has "mutable") I think removing const is fine in this case. > > Signed-off-by: Paolo Bonzini Reviewed-by: Anthony Liguori But I seem to recall that this was this way because some QMP function returns a const QObject... oh well, if things still compile with this patch, I'm happy with it. Regards, Anthony Liguori > --- > qapi/qmp-input-visitor.c | 41 +++++++++++++++++------------------------ > 1 files changed, 17 insertions(+), 24 deletions(-) > > diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c > index dfc859a..97a0186 100644 > --- a/qapi/qmp-input-visitor.c > +++ b/qapi/qmp-input-visitor.c > @@ -22,14 +22,13 @@ > > typedef struct StackObject > { > - const QObject *obj; > - const QListEntry *entry; > + QObject *obj; > + const QListEntry *entry; > } StackObject; > > struct QmpInputVisitor > { > Visitor visitor; > - QObject *obj; > StackObject stack[QIV_STACK_SIZE]; > int nb_stack; > }; > @@ -39,21 +38,15 @@ static QmpInputVisitor *to_qiv(Visitor *v) > return container_of(v, QmpInputVisitor, visitor); > } > > -static const QObject *qmp_input_get_object(QmpInputVisitor *qiv, > - const char *name) > +static QObject *qmp_input_get_object(QmpInputVisitor *qiv, > + const char *name) > { > - const QObject *qobj; > - > - if (qiv->nb_stack == 0) { > - qobj = qiv->obj; > - } else { > - qobj = qiv->stack[qiv->nb_stack - 1].obj; > - } > + QObject *qobj = qiv->stack[qiv->nb_stack - 1].obj; > > if (qobj) { > if (name&& qobject_type(qobj) == QTYPE_QDICT) { > return qdict_get(qobject_to_qdict(qobj), name); > - } else if (qiv->nb_stack> 0&& qobject_type(qobj) == QTYPE_QLIST) { > + } else if (qiv->stack[qiv->nb_stack - 1].entry) { > return qlist_entry_obj(qiv->stack[qiv->nb_stack - 1].entry); > } > } > @@ -61,7 +54,7 @@ static const QObject *qmp_input_get_object(QmpInputVisitor *qiv, > return qobj; > } > > -static void qmp_input_push(QmpInputVisitor *qiv, const QObject *obj, Error **errp) > +static void qmp_input_push(QmpInputVisitor *qiv, QObject *obj, Error **errp) > { > qiv->stack[qiv->nb_stack].obj = obj; > qiv->stack[qiv->nb_stack].entry = NULL; > @@ -83,7 +76,7 @@ static void qmp_input_start_struct(Visitor *v, void **obj, const char *kind, > const char *name, size_t size, Error **errp) > { > QmpInputVisitor *qiv = to_qiv(v); > - const QObject *qobj = qmp_input_get_object(qiv, name); > + QObject *qobj = qmp_input_get_object(qiv, name); > Error *err = NULL; > > if (!qobj || qobject_type(qobj) != QTYPE_QDICT) { > @@ -113,7 +106,7 @@ static void qmp_input_end_struct(Visitor *v, Error **errp) > static void qmp_input_start_list(Visitor *v, const char *name, Error **errp) > { > QmpInputVisitor *qiv = to_qiv(v); > - const QObject *qobj = qmp_input_get_object(qiv, name); > + QObject *qobj = qmp_input_get_object(qiv, name); > > if (!qobj || qobject_type(qobj) != QTYPE_QLIST) { > error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", > @@ -160,7 +153,7 @@ static void qmp_input_type_int(Visitor *v, int64_t *obj, const char *name, > Error **errp) > { > QmpInputVisitor *qiv = to_qiv(v); > - const QObject *qobj = qmp_input_get_object(qiv, name); > + QObject *qobj = qmp_input_get_object(qiv, name); > > if (!qobj || qobject_type(qobj) != QTYPE_QINT) { > error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", > @@ -175,7 +168,7 @@ static void qmp_input_type_bool(Visitor *v, bool *obj, const char *name, > Error **errp) > { > QmpInputVisitor *qiv = to_qiv(v); > - const QObject *qobj = qmp_input_get_object(qiv, name); > + QObject *qobj = qmp_input_get_object(qiv, name); > > if (!qobj || qobject_type(qobj) != QTYPE_QBOOL) { > error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", > @@ -190,7 +183,7 @@ static void qmp_input_type_str(Visitor *v, char **obj, const char *name, > Error **errp) > { > QmpInputVisitor *qiv = to_qiv(v); > - const QObject *qobj = qmp_input_get_object(qiv, name); > + QObject *qobj = qmp_input_get_object(qiv, name); > > if (!qobj || qobject_type(qobj) != QTYPE_QSTRING) { > error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", > @@ -205,7 +198,7 @@ static void qmp_input_type_number(Visitor *v, double *obj, const char *name, > Error **errp) > { > QmpInputVisitor *qiv = to_qiv(v); > - const QObject *qobj = qmp_input_get_object(qiv, name); > + QObject *qobj = qmp_input_get_object(qiv, name); > > if (!qobj || qobject_type(qobj) != QTYPE_QFLOAT) { > error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", > @@ -220,7 +213,7 @@ static void qmp_input_start_optional(Visitor *v, bool *present, > const char *name, Error **errp) > { > QmpInputVisitor *qiv = to_qiv(v); > - const QObject *qobj = qmp_input_get_object(qiv, name); > + QObject *qobj = qmp_input_get_object(qiv, name); > > if (!qobj) { > *present = false; > @@ -237,7 +230,7 @@ Visitor *qmp_input_get_visitor(QmpInputVisitor *v) > > void qmp_input_visitor_cleanup(QmpInputVisitor *v) > { > - qobject_decref(v->obj); > + qobject_decref(v->stack[0].obj); > g_free(v); > } > > @@ -259,8 +252,8 @@ QmpInputVisitor *qmp_input_visitor_new(QObject *obj) > v->visitor.type_number = qmp_input_type_number; > v->visitor.start_optional = qmp_input_start_optional; > > - v->obj = obj; > - qobject_incref(v->obj); > + qmp_input_push(v, obj, NULL); > + qobject_incref(obj); > > return v; > }