From: Anthony Liguori <aliguori@us.ibm.com>
To: Michael Roth <mdroth@linux.vnet.ibm.com>, qemu-devel@nongnu.org
Cc: quintela@redhat.com, owasserm@redhat.com, yamahata@valinux.co.jp,
pbonzini@redhat.com, akong@redhat.com, afaerber@suse.de
Subject: Re: [Qemu-devel] [PATCH 05/22] qapi: qapi_visit.py, support arrays and complex qapi definitions
Date: Tue, 24 Jul 2012 17:16:58 -0500 [thread overview]
Message-ID: <877gtsls85.fsf@codemonkey.ws> (raw)
In-Reply-To: <1343150454-4677-6-git-send-email-mdroth@linux.vnet.ibm.com>
Michael Roth <mdroth@linux.vnet.ibm.com> writes:
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
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 <mdroth@linux.vnet.ibm.com>
> ---
> 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>'):
> + 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
next prev parent reply other threads:[~2012-07-24 22:17 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-24 17:20 [Qemu-devel] [RFC v2] Use QEMU IDL for device serialization/introspection Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 01/22] qapi: qapi-visit.py -> qapi_visit.py so we can import Michael Roth
2012-07-24 22:12 ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 02/22] qapi: qapi-types.py -> qapi_types.py Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 03/22] qapi: qapi-commands.py -> qapi_commands.py Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 04/22] qapi: qapi_visit.py, make code useable as module Michael Roth
2012-07-24 22:13 ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 05/22] qapi: qapi_visit.py, support arrays and complex qapi definitions Michael Roth
2012-07-24 22:16 ` Anthony Liguori [this message]
2012-07-24 17:20 ` [Qemu-devel] [PATCH 06/22] qapi: add visitor interfaces for arrays Michael Roth
2012-07-24 22:18 ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 07/22] qapi: qapi_visit.py, support generating static functions Michael Roth
2012-07-24 22:19 ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 08/22] qapi: qapi_visit.py, support for visiting non-pointer/embedded structs Michael Roth
2012-07-24 22:21 ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 09/22] qapi: QmpOutputVisitor, implement array handling Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 10/22] qapi: qapi.py, make json parser more robust Michael Roth
2012-07-24 22:23 ` Anthony Liguori
2012-07-24 22:59 ` Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 11/22] qapi: add open-coded visitor for struct tm types Michael Roth
2012-07-24 22:24 ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 12/22] qom-fuse: workaround for truncated properties > 4096 Michael Roth
2012-07-24 22:26 ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 13/22] module additions for schema registration Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 14/22] qdev: move Property-related declarations to qdev-properties.h Michael Roth
2012-07-24 22:28 ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 15/22] qidl: Add documentation Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 16/22] qidl: parser, initial import from qc.git Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 17/22] qidl: codegen, initial commit Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 18/22] qidl: qidl.h Michael Roth
2012-07-24 20:47 ` Blue Swirl
2012-07-25 0:30 ` Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 19/22] qidl: unit tests Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 20/22] qemu-timer: add visit_type_QEMUTimer Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 21/22] rtc: add QIDL annotations Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 22/22] cirrus_vga: " Michael Roth
-- strict thread matches above, loose matches on Subject: below --
2012-09-21 14:07 [Qemu-devel] [PATCH v2] Add infrastructure for QIDL-based device serialization Michael Roth
2012-09-21 14:07 ` [Qemu-devel] [PATCH 05/22] qapi: qapi_visit.py, support arrays and complex qapi definitions Michael Roth
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=877gtsls85.fsf@codemonkey.ws \
--to=aliguori@us.ibm.com \
--cc=afaerber@suse.de \
--cc=akong@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=owasserm@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=yamahata@valinux.co.jp \
/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).