[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC PATCH v7 17/18] qapi: Simplify gen_visit_fields()
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [RFC PATCH v7 17/18] qapi: Simplify gen_visit_fields() error handling |
Date: |
Thu, 01 Oct 2015 14:49:02 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) |
Eric Blake <address@hidden> writes:
> Since we have consolidated all generated code to use 'err' as
> the name of the local variable for error detection, we can
> simplify the decision on whether to skip error detection (useful
> for deallocation paths) to be a boolean.
>
> This requires the python 2.5 ternary syntax.
Let's drop this sentence.
> Signed-off-by: Eric Blake <address@hidden>
>
> ---
> v7: new patch; rfc as it depends on Markus' configure change to
> require python 2.6
> ---
> scripts/qapi-commands.py | 4 +---
> scripts/qapi.py | 23 ++++++++++-------------
> 2 files changed, 11 insertions(+), 16 deletions(-)
>
> diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
> index 9d214a6..43a893b 100644
> --- a/scripts/qapi-commands.py
> +++ b/scripts/qapi-commands.py
> @@ -101,19 +101,17 @@ def gen_marshal_input_visit(arg_type, dealloc=False):
> return ret
>
> if dealloc:
> - errarg = None
> ret += mcgen('''
> qmp_input_visitor_cleanup(qiv);
> qdv = qapi_dealloc_visitor_new();
> v = qapi_dealloc_get_visitor(qdv);
> ''')
> else:
> - errarg = 'err'
> ret += mcgen('''
> v = qmp_input_get_visitor(qiv);
> ''')
>
> - ret += gen_visit_fields(arg_type.members, errarg=errarg)
> + ret += gen_visit_fields(arg_type.members, skiperr=dealloc)
>
> if dealloc:
> ret += mcgen('''
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index ada6380..7761b4b 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -1537,23 +1537,19 @@ def gen_params(arg_type, extra):
> return ret
>
>
> -def gen_err_check(err='err', label='out'):
> - if not err:
> +def gen_err_check(label='out', skiperr=False):
> + if skiperr:
> return ''
> return mcgen('''
> - if (%(err)s) {
> + if (err) {
> goto %(label)s;
> }
> ''',
> - err=err, label=label)
> + label=label)
>
>
> -def gen_visit_fields(members, prefix='', need_cast=False, errarg='err'):
> +def gen_visit_fields(members, prefix='', need_cast=False, skiperr=False):
> ret = ''
> - if errarg:
> - errparg = '&' + errarg
> - else:
> - errparg = 'NULL'
>
> for memb in members:
> if memb.optional:
> @@ -1561,8 +1557,9 @@ def gen_visit_fields(members, prefix='',
> need_cast=False, errarg='err'):
> visit_optional(v, &%(prefix)shas_%(c_name)s, "%(name)s", %(errp)s);
> ''',
> prefix=prefix, c_name=c_name(memb.name),
> - name=memb.name, errp=errparg)
> - ret += gen_err_check(err=errarg)
> + name=memb.name,
> + errp='&err' if not skiperr else 'NULL')
> + ret += gen_err_check(skiperr=skiperr)
> ret += mcgen('''
> if (%(prefix)shas_%(c_name)s) {
> ''',
> @@ -1580,8 +1577,8 @@ def gen_visit_fields(members, prefix='',
> need_cast=False, errarg='err'):
> ''',
> c_type=memb.type.c_name(), prefix=prefix, cast=cast,
> c_name=c_name(memb.name), name=memb.name,
> - errp=errparg)
> - ret += gen_err_check(err=errarg)
> + errp='&err' if not skiperr else 'NULL')
> + ret += gen_err_check(skiperr=skiperr)
>
> if memb.optional:
> pop_indent()
I'm not afraid of ternaries, but I guess I would've gone for the minimal
change here, i.e. something like:
-def gen_visit_fields(members, prefix='', need_cast=False, errarg='err'):
+def gen_visit_fields(members, prefix='', need_cast=False, skiperr=False):
ret = ''
- if errarg:
- errparg = '&' + errarg
- else:
+ if skiperr:
errparg = 'NULL'
+ else:
+ errparg = '&err'
for memb in members:
if memb.optional:
@@ -1562,7 +1562,7 @@ def gen_visit_fields(members, prefix='', need_cast=False,
errarg='err'):
''',
prefix=prefix, c_name=c_name(memb.name),
name=memb.name, errp=errparg)
- ret += gen_err_check(err=errarg)
+ ret += gen_err_check(skiperr=skiperr)
ret += mcgen('''
if (%(prefix)shas_%(c_name)s) {
''',
@@ -1581,7 +1581,7 @@ def gen_visit_fields(members, prefix='', need_cast=False,
errarg='err'):
c_type=memb.type.c_name(), prefix=prefix, cast=cast,
c_name=c_name(memb.name), name=memb.name,
errp=errparg)
- ret += gen_err_check(err=errarg)
+ ret += gen_err_check(skiperr=skiperr)
if memb.optional:
pop_indent()
Matter of taste.
- Re: [Qemu-devel] [PATCH v7 05/18] qapi: Test for various name collisions, (continued)
- Re: [Qemu-devel] [PATCH v7 05/18] qapi: Test for various name collisions, Eric Blake, 2015/10/08
- Re: [Qemu-devel] [PATCH v7 05/18] qapi: Test for various name collisions, Markus Armbruster, 2015/10/08
- Re: [Qemu-devel] [PATCH v7 05/18] qapi: Test for various name collisions, Eric Blake, 2015/10/08
- Re: [Qemu-devel] [PATCH v7 05/18] qapi: Test for various name collisions, Markus Armbruster, 2015/10/08
- Re: [Qemu-devel] [PATCH v7 05/18] qapi: Test for various name collisions, Eric Blake, 2015/10/08
- Re: [Qemu-devel] [PATCH v7 05/18] qapi: Test for various name collisions, Markus Armbruster, 2015/10/08
[Qemu-devel] [PATCH v7 13/18] qapi: Consistent generated code: prefer common indentation, Eric Blake, 2015/10/08
[Qemu-devel] [PATCH v7 11/18] qapi: Consistent generated code: prefer visitor 'v', Eric Blake, 2015/10/08
[Qemu-devel] [RFC PATCH v7 18/18] qapi: Use gen_err_check() in more places, Eric Blake, 2015/10/08
[Qemu-devel] [RFC PATCH v7 17/18] qapi: Simplify gen_visit_fields() error handling, Eric Blake, 2015/10/08
- Re: [Qemu-devel] [RFC PATCH v7 17/18] qapi: Simplify gen_visit_fields() error handling,
Markus Armbruster <=
[Qemu-devel] [PATCH v7 03/18] qapi: Invoke exception superclass initializer, Eric Blake, 2015/10/08
[Qemu-devel] [PATCH v7 09/18] qapi: Reuse code for flat union base validation, Eric Blake, 2015/10/08
[Qemu-devel] [PATCH v7 10/18] qapi: Consistent generated code: prefer error 'err', Eric Blake, 2015/10/08
[Qemu-devel] [PATCH v7 08/18] qapi: Test use of 'number' within alternates, Eric Blake, 2015/10/08