[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 3/8] qapi script: check correctness of discriminator
From: |
Wenchao Xia |
Subject: |
[Qemu-devel] [PATCH 3/8] qapi script: check correctness of discriminator values in union |
Date: |
Thu, 7 Nov 2013 03:33:35 +0800 |
It will check whether the values specified are written correctly when
discriminator is a pre-defined enum type, which help check whether the
schema is in good form.
It is allowed, that not every value in enum is used, so does not check
that case.
Signed-off-by: Wenchao Xia <address@hidden>
---
scripts/qapi-visit.py | 11 +++++++++++
scripts/qapi.py | 33 +++++++++++++++++++++++++++++++++
2 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index b3d3af8..612dc4d 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -251,6 +251,17 @@ 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' not found in "
+ "enum '%s'\n" %
+ (key, enum_define["enum_name"]))
+ sys.exit(1)
+
ret = generate_visit_enum('%sKind' % name, members.keys())
if base:
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 82f586e..f93bda1 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -383,3 +383,36 @@ 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:
+ sys.stderr.write("Base '%s' is not a valid type\n"
+ % base)
+ sys.exit(1)
+
+ discriminator_type = base_fields.get(discriminator)
+
+ if not discriminator_type:
+ sys.stderr.write("Discriminator '%s' not found in schema\n"
+ % discriminator)
+ sys.exit(1)
+
+ return find_enum(discriminator_type)
--
1.7.1
- [Qemu-devel] [PATCH 0/8] qapi script: support enum as discriminator and better enum name, Wenchao Xia, 2013/11/06
- [Qemu-devel] [PATCH 4/8] qapi script: code move for generate_enum_name(), Wenchao Xia, 2013/11/06
- [Qemu-devel] [PATCH 5/8] qapi script: use same function to generate enum string, Wenchao Xia, 2013/11/06
- [Qemu-devel] [PATCH 1/8] qapi script: remember enum values, Wenchao Xia, 2013/11/06
- [Qemu-devel] [PATCH 6/8] qapi script: not generate hidden enum type for pre-defined enum discriminator, Wenchao Xia, 2013/11/06
- [Qemu-devel] [PATCH 3/8] qapi script: check correctness of discriminator values in union,
Wenchao Xia <=
- [Qemu-devel] [PATCH 2/8] qapi script: report error for default case in union visit, Wenchao Xia, 2013/11/06
- [Qemu-devel] [PATCH 7/8] qapi script: do not add "_" for every capitalized char in enum, Wenchao Xia, 2013/11/06
- [Qemu-devel] [PATCH 8/8] tests: add cases for inherited struct and union with discriminator, Wenchao Xia, 2013/11/06