From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:54603) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1StnQJ-0004Zc-VL for qemu-devel@nongnu.org; Tue, 24 Jul 2012 18:17:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1StnQI-0005fb-LE for qemu-devel@nongnu.org; Tue, 24 Jul 2012 18:17:47 -0400 Received: from e32.co.us.ibm.com ([32.97.110.150]:60307) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1StnQI-0005fX-D2 for qemu-devel@nongnu.org; Tue, 24 Jul 2012 18:17:46 -0400 Received: from /spool/local by e32.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 24 Jul 2012 16:17:45 -0600 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by d03dlp02.boulder.ibm.com (Postfix) with ESMTP id A2DF93E4003F for ; Tue, 24 Jul 2012 22:17:41 +0000 (WET) Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q6OMH2NW105794 for ; Tue, 24 Jul 2012 16:17:03 -0600 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q6OMH0jW015909 for ; Tue, 24 Jul 2012 16:17:01 -0600 From: Anthony Liguori In-Reply-To: <1343150454-4677-6-git-send-email-mdroth@linux.vnet.ibm.com> References: <1343150454-4677-1-git-send-email-mdroth@linux.vnet.ibm.com> <1343150454-4677-6-git-send-email-mdroth@linux.vnet.ibm.com> Date: Tue, 24 Jul 2012 17:16:58 -0500 Message-ID: <877gtsls85.fsf@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: Re: [Qemu-devel] [PATCH 05/22] qapi: qapi_visit.py, support arrays and complex qapi definitions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Michael Roth , qemu-devel@nongnu.org Cc: quintela@redhat.com, owasserm@redhat.com, yamahata@valinux.co.jp, pbonzini@redhat.com, akong@redhat.com, afaerber@suse.de Michael Roth writes: Reviewed-by: Anthony Liguori Regards, Anthony Liguori > Add support for arrays in the code generators. > > Complex field descriptions can now be used to provide additional > information to the visitor generators, such as the max size of an array, > or the field within a struct to use to determine how many elements are > present in the array to avoid serializing uninitialized elements. > > Add handling for these in the code generators as well. > > Signed-off-by: Michael Roth > --- > scripts/qapi.py | 10 ++++++++-- > scripts/qapi_commands.py | 8 ++++---- > scripts/qapi_types.py | 2 +- > scripts/qapi_visit.py | 34 +++++++++++++++++++++++++++------- > 4 files changed, 40 insertions(+), 14 deletions(-) > > diff --git a/scripts/qapi.py b/scripts/qapi.py > index 8082af3..39bb74e 100644 > --- a/scripts/qapi.py > +++ b/scripts/qapi.py > @@ -99,12 +99,16 @@ def parse_args(typeinfo): > argentry = typeinfo[member] > optional = False > structured = False > + annotated = False > if member.startswith('*'): > argname = member[1:] > optional = True > if isinstance(argentry, OrderedDict): > - structured = True > - yield (argname, argentry, optional, structured) > + if argentry.has_key(''): > + annotated = True > + else: > + structured = True > + yield (argname, argentry, optional, structured, annotated) > > def de_camel_case(name): > new_name = '' > @@ -177,6 +181,8 @@ def c_type(name): > return 'void' > elif name == name.upper(): > return '%sEvent *' % camel_case(name) > + elif name.replace("u", "").replace("int", "") in ["8", "16", "32", "64"]: > + return name + "_t" > else: > return '%s *' % name > > diff --git a/scripts/qapi_commands.py b/scripts/qapi_commands.py > index 9eed40e..52221d6 100644 > --- a/scripts/qapi_commands.py > +++ b/scripts/qapi_commands.py > @@ -32,7 +32,7 @@ void %(visitor)s(Visitor *m, %(name)s * obj, const char *name, Error **errp); > > def generate_command_decl(name, args, ret_type): > arglist="" > - for argname, argtype, optional, structured in parse_args(args): > + for argname, argtype, optional, structured, annotated in parse_args(args): > argtype = c_type(argtype) > if argtype == "char *": > argtype = "const char *" > @@ -50,7 +50,7 @@ def gen_sync_call(name, args, ret_type, indent=0): > retval="" > if ret_type: > retval = "retval = " > - for argname, argtype, optional, structured in parse_args(args): > + for argname, argtype, optional, structured, annotated in parse_args(args): > if optional: > arglist += "has_%s, " % c_var(argname) > arglist += "%s, " % (c_var(argname)) > @@ -106,7 +106,7 @@ Visitor *v; > def gen_visitor_input_vars_decl(args): > ret = "" > push_indent() > - for argname, argtype, optional, structured in parse_args(args): > + for argname, argtype, optional, structured, annotated in parse_args(args): > if optional: > ret += mcgen(''' > bool has_%(argname)s = false; > @@ -145,7 +145,7 @@ v = qmp_input_get_visitor(mi); > ''', > obj=obj) > > - for argname, argtype, optional, structured in parse_args(args): > + for argname, argtype, optional, structured, annotated in parse_args(args): > if optional: > ret += mcgen(''' > visit_start_optional(v, &has_%(c_name)s, "%(name)s", errp); > diff --git a/scripts/qapi_types.py b/scripts/qapi_types.py > index 4a734f5..fb2b9ea 100644 > --- a/scripts/qapi_types.py > +++ b/scripts/qapi_types.py > @@ -35,7 +35,7 @@ struct %(name)s > ''', > name=structname) > > - for argname, argentry, optional, structured in parse_args(members): > + for argname, argentry, optional, structured, annotated in parse_args(members): > if optional: > ret += mcgen(''' > bool has_%(c_name)s; > diff --git a/scripts/qapi_visit.py b/scripts/qapi_visit.py > index 25707f5..9839e3c 100644 > --- a/scripts/qapi_visit.py > +++ b/scripts/qapi_visit.py > @@ -16,6 +16,22 @@ import sys > import os > import getopt > import errno > +import types > + > +def generate_visit_array_body(name, info): > + ret = mcgen(''' > +visit_start_array(m, (void **)obj, "%(name)s", %(count)s, sizeof(%(type)s), errp); > +int %(name)s_i; > +for (%(name)s_i = 0; %(name)s_i < %(count)s; %(name)s_i++) { > + visit_type_%(type_short)s(m, &(*obj)->%(name)s[%(name)s_i], NULL, errp); > + visit_next_array(m, errp); > +} > +visit_end_array(m, errp); > +''', > + name=name, type=c_type(info['type'][0]), > + type_short=info['type'][0], > + count=info['array_size']) > + return ret > > def generate_visit_struct_body(field_prefix, name, members): > ret = mcgen(''' > @@ -45,10 +61,10 @@ if (!err) { > > push_indent() > push_indent() > - for argname, argentry, optional, structured in parse_args(members): > + for argname, argentry, optional, structured, annotated in parse_args(members): > if optional: > ret += mcgen(''' > -visit_start_optional(m, obj ? &(*obj)->%(c_prefix)shas_%(c_name)s : NULL, "%(name)s", &err); > +visit_start_optional(m, obj ? &(*obj)->%(c_prefix)shas_%(c_name)s : NULL, "%(name)s", errp); > if (obj && (*obj)->%(prefix)shas_%(c_name)s) { > ''', > c_prefix=c_var(field_prefix), prefix=field_prefix, > @@ -58,12 +74,16 @@ if (obj && (*obj)->%(prefix)shas_%(c_name)s) { > if structured: > ret += generate_visit_struct_body(field_prefix + argname, argname, argentry) > else: > - ret += mcgen(''' > -visit_type_%(type)s(m, obj ? &(*obj)->%(c_prefix)s%(c_name)s : NULL, "%(name)s", &err); > + if annotated: > + if isinstance(argentry['type'], types.ListType): > + ret += generate_visit_array_body(argname, argentry) > + else: > + ret += mcgen(''' > +visit_type_%(type)s(m, obj ? &(*obj)->%(c_prefix)s%(c_name)s : NULL, "%(name)s", errp); > ''', > - c_prefix=c_var(field_prefix), prefix=field_prefix, > - type=type_name(argentry), c_name=c_var(argname), > - name=argname) > + c_prefix=c_var(field_prefix), prefix=field_prefix, > + type=type_name(argentry), c_name=c_var(argname), > + name=argname) > > if optional: > pop_indent() > -- > 1.7.9.5