[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH V6 03/10] qapi script: check correctness of disc
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH V6 03/10] qapi script: check correctness of discriminator values in union |
Date: |
Thu, 13 Feb 2014 16:14:01 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.2 (gnu/linux) |
Wenchao Xia <address@hidden> writes:
> It will check whether the values specified are written correctly,
> and whether all enum values are covered, when discriminator is a
> pre-defined enum type
>
> Signed-off-by: Wenchao Xia <address@hidden>
> Reviewed-by: Eric Blake <address@hidden>
> ---
> scripts/qapi-visit.py | 17 +++++++++++++++++
> scripts/qapi.py | 31 +++++++++++++++++++++++++++++++
> 2 files changed, 48 insertions(+), 0 deletions(-)
>
> diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
> index 65f1a54..c0efb5f 100644
> --- a/scripts/qapi-visit.py
> +++ b/scripts/qapi-visit.py
> @@ -255,6 +255,23 @@ def generate_visit_union(expr):
> assert not base
> return generate_visit_anon_union(name, members)
>
> + # If discriminator is specified and it is a pre-defined enum in schema,
> + # check its correctness
> + enum_define = discriminator_find_enum_define(expr)
> + if enum_define:
> + for key in members:
> + if not key in enum_define["enum_values"]:
> + sys.stderr.write("Discriminator value '%s' is not found in "
> + "enum '%s'\n" %
> + (key, enum_define["enum_name"]))
> + sys.exit(1)
Can this happen? If yes, why isn't it diagnosed in qapi.py, like all
the other semantic errors?
> + for key in enum_define["enum_values"]:
> + if not key in members:
> + sys.stderr.write("Enum value '%s' is not covered by a branch
> "
> + "of union '%s'\n" %
> + (key, name))
> + sys.exit(1)
> +
Likewise.
> ret = generate_visit_enum('%sKind' % name, members.keys())
>
> if base:
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index cf34768..0a3ab80 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -385,3 +385,34 @@ def guardend(name):
>
> ''',
> name=guardname(name))
> +
> +# This function can be used to check whether "base" is valid
> +def find_base_fields(base):
> + base_struct_define = find_struct(base)
> + if not base_struct_define:
> + return None
> + return base_struct_define.get('data')
> +
> +# Return the discriminator enum define, if discriminator is specified in
> +# @expr and it is a pre-defined enum type
> +def discriminator_find_enum_define(expr):
> + discriminator = expr.get('discriminator')
> + base = expr.get('base')
> +
> + # Only support discriminator when base present
> + if not (discriminator and base):
> + return None
> +
> + base_fields = find_base_fields(base)
> +
> + if not base_fields:
> + raise StandardError("Base '%s' is not a valid type\n"
> + % base)
Why not QAPISchemaError, like for other semantic errors?
> +
> + discriminator_type = base_fields.get(discriminator)
> +
> + if not discriminator_type:
> + raise StandardError("Discriminator '%s' not found in schema\n"
> + % discriminator)
Likewise.
> +
> + return find_enum(discriminator_type)
All errors should have a test in tests/qapi-schema/. I can try to add
tests for you when I rebase your 09/10.
- [Qemu-devel] [PATCH V6 05/10] qapi script: use same function to generate enum string, (continued)
- [Qemu-devel] [PATCH V6 10/10] qapi script: do not add "_" for every capitalized char in enum, Wenchao Xia, 2014/02/11
- [Qemu-devel] [PATCH V6 03/10] qapi script: check correctness of discriminator values in union, Wenchao Xia, 2014/02/11
- Re: [Qemu-devel] [PATCH V6 03/10] qapi script: check correctness of discriminator values in union,
Markus Armbruster <=
- Re: [Qemu-devel] [PATCH V6 03/10] qapi script: check correctness of discriminator values in union, Wenchao Xia, 2014/02/13
- Re: [Qemu-devel] [PATCH V6 03/10] qapi script: check correctness of discriminator values in union, Markus Armbruster, 2014/02/14
- Re: [Qemu-devel] [PATCH V6 03/10] qapi script: check correctness of discriminator values in union, Wenchao Xia, 2014/02/16
- Re: [Qemu-devel] [PATCH V6 03/10] qapi script: check correctness of discriminator values in union, Markus Armbruster, 2014/02/17
- Re: [Qemu-devel] [PATCH V6 03/10] qapi script: check correctness of discriminator values in union, Luiz Capitulino, 2014/02/17
Re: [Qemu-devel] [PATCH V6 00/10] qapi script: support enum as discriminator and better enum name, Eric Blake, 2014/02/11
Re: [Qemu-devel] [PATCH V6 00/10] qapi script: support enum as discriminator and better enum name, Luiz Capitulino, 2014/02/11
Re: [Qemu-devel] [PATCH V6 00/10] qapi script: support enum as discriminator and better enum name, Markus Armbruster, 2014/02/13