qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, armbru@redhat.com, lcapitulino@redhat.com,
	pbonzini@redhat.com, Wenchao Xia <xiawenc@linux.vnet.ibm.com>
Subject: [Qemu-devel] [PATCH RFC 03/10] qapi script: check correctness of discriminator values in union
Date: Tue,  5 Nov 2013 08:37:33 +0800	[thread overview]
Message-ID: <1383611860-9053-4-git-send-email-xiawenc@linux.vnet.ibm.com> (raw)
In-Reply-To: <1383611860-9053-1-git-send-email-xiawenc@linux.vnet.ibm.com>

It will check whether the values specfied are wrotten 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 do not check
that case.

Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
 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 c39e628..803d3eb 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -249,6 +249,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 = descriminator_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..235df4f 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 descriminator enum define, if discriminator is specified in
+# @expr and it is a pre-defined enum type
+def descriminator_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)
+
+    descriminator_type = base_fields.get(discriminator)
+
+    if not descriminator_type:
+        sys.stderr.write("Discriminator '%s' not found in schema\n"
+                         % discriminator)
+        sys.exit(1)
+
+    return find_enum(descriminator_type)
-- 
1.7.1

  parent reply	other threads:[~2013-11-05  8:40 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-05  0:37 [Qemu-devel] [PATCH RFC 00/10] qapi script: support enum as discriminator and other improves Wenchao Xia
2013-11-05  0:37 ` [Qemu-devel] [PATCH RFC 01/10] qapi: fix memleak by add implict struct functions in dealloc visitor Wenchao Xia
2013-11-05 13:17   ` Eric Blake
2013-11-05  0:37 ` [Qemu-devel] [PATCH RFC 02/10] qapi script: remember enum values Wenchao Xia
2013-11-05 13:30   ` Eric Blake
2013-11-05  0:37 ` Wenchao Xia [this message]
2013-11-05 13:25   ` [Qemu-devel] [PATCH RFC 03/10] qapi script: check correctness of discriminator values in union Eric Blake
2013-11-06  3:02     ` Wenchao Xia
2013-11-05  0:37 ` [Qemu-devel] [PATCH RFC 04/10] qapi script: code move for generate_enum_name() Wenchao Xia
2013-11-05  0:37 ` [Qemu-devel] [PATCH RFC 05/10] qapi script: use same function to generate enum string Wenchao Xia
2013-11-05  0:37 ` [Qemu-devel] [PATCH RFC 06/10] qapi script: not generate hidden enum type for pre-defined enum discriminator Wenchao Xia
2013-11-05  0:37 ` [Qemu-devel] [PATCH RFC 07/10] qapi script: support direct inheritance for struct Wenchao Xia
2013-11-05 13:41   ` Eric Blake
2013-11-06  3:20     ` Wenchao Xia
2013-11-06 13:33       ` Eric Blake
2013-11-07  2:33         ` Wenchao Xia
2013-11-05  0:37 ` [Qemu-devel] [PATCH RFC 08/10] qapi script: do not add "_" for every capitalized char in enum Wenchao Xia
2013-11-05  0:37 ` [Qemu-devel] [PATCH RFC 09/10] tests: fix memleak in error path test for input visitor Wenchao Xia
2013-11-05 13:20   ` Eric Blake
2013-11-06  2:18     ` Wenchao Xia
2013-11-05  0:37 ` [Qemu-devel] [PATCH RFC 10/10] tests: add cases for inherited struct and union with discriminator Wenchao Xia

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=1383611860-9053-4-git-send-email-xiawenc@linux.vnet.ibm.com \
    --to=xiawenc@linux.vnet.ibm.com \
    --cc=armbru@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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).