qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: qemu-devel@nongnu.org
Cc: armbru@redhat.com, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: [Qemu-devel] [PATCH v6 16/16] qapi: Populate info['name'] for each entity
Date: Wed, 23 Dec 2015 13:55:45 -0700	[thread overview]
Message-ID: <1450904145-17721-17-git-send-email-eblake@redhat.com> (raw)
In-Reply-To: <1450904145-17721-1-git-send-email-eblake@redhat.com>

Every non-implicit entity is associated with an 'info'
dictionary, but it is not easy to reverse-engineer the name of
the top-most entity associated with that 'info'.  Our use of
'case_whitelist' (added in commit 893e1f2) is thus currently
tied to the owner of a member instead; but now that anonymous
types are starting to be used in more places such as CpuInfo,
this requires whitelist exceptions to know how an implicit name
will be generated.

While we have a ._pretty_owner() that maps from implicit names
back to a human readable phrase, that is more than just a plain
top-level entity name.  What's more, the .check_clash() method
may be called for the same member object more than once, with
different caller 'info' objects (such as a base and derived
object); if a clash is only introduced in the derived class,
reporting the error on behalf of the base class named in
member.owner seems wrong.

Add a new info['name'] field to track the information we need,
allowing us to change 'case_whitelist' to use only names present
in the qapi files.

Unfortunately, there is no one good place to add the mapping:
at the point 'info' is created in QAPISchemaParser.__init__(),
we don't know the name.  Info is then stored into
QAPISchemaParser.exprs, which then then gets fed to
QAPISchema.__init__() via the global check_exprs(), but we want
check_exprs() to go away.  And QAPISchema._def_exprs() sees
every entity, except that the various _def_FOO() helpers don't
return anything.  So we have to modify all of the _def_FOO()
methods.

Signed-off-by: Eric Blake <eblake@redhat.com>

---
v6 (subset E): sink later in series, and rework commit message
v14 (subset D): rearrange assignment, improve commit message
v13 (subset D): new patch
---
 scripts/qapi.py | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/scripts/qapi.py b/scripts/qapi.py
index d534d41..b8980e1 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -62,8 +62,8 @@ returns_whitelist = [
 # Whitelist of entities allowed to violate case conventions
 case_whitelist = [
     # From QMP:
-    ':obj-CpuInfo-base',    # CPU, visible through query-cpu
     'ACPISlotType',         # DIMM, visible through query-acpi-ospm-status
+    'CpuInfo',              # CPU and PC, visible through query-cpu
     'CpuInfoMIPS',          # PC, visible through query-cpu
     'CpuInfoTricore',       # PC, visible through query-cpu
     'InputAxis',            # TODO: drop when x-input-send-event is fixed
@@ -1029,7 +1029,7 @@ class QAPISchemaMember(object):

     def check_clash(self, info, seen):
         cname = c_name(self.name)
-        if cname.lower() != cname and self.owner not in case_whitelist:
+        if cname.lower() != cname and info['name'] not in case_whitelist:
             raise QAPIExprError(info,
                                 "%s should not use uppercase" % self.describe())
         if cname in seen:
@@ -1302,7 +1302,7 @@ class QAPISchema(object):
         return name

     def _def_enum_type(self, expr, info):
-        name = expr['enum']
+        name = info['name'] = expr['enum']
         data = expr['data']
         prefix = expr.get('prefix')
         self._def_entity(QAPISchemaEnumType(
@@ -1323,7 +1323,7 @@ class QAPISchema(object):
                 for (key, value) in data.iteritems()]

     def _def_struct_type(self, expr, info):
-        name = expr['struct']
+        name = info['name'] = expr['struct']
         base = expr.get('base', ':empty')
         data = expr['data']
         self._def_entity(QAPISchemaObjectType(name, info, base,
@@ -1342,7 +1342,7 @@ class QAPISchema(object):
         return QAPISchemaObjectTypeVariant(case, typ)

     def _def_union_type(self, expr, info):
-        name = expr['union']
+        name = info['name'] = expr['union']
         data = expr['data']
         base = expr.get('base', ':empty')
         tag_name = expr.get('discriminator')
@@ -1368,7 +1368,7 @@ class QAPISchema(object):
                                                               variants)))

     def _def_alternate_type(self, expr, info):
-        name = expr['alternate']
+        name = info['name'] = expr['alternate']
         data = expr['data']
         variants = [self._make_variant(key, value)
                     for (key, value) in data.iteritems()]
@@ -1380,7 +1380,7 @@ class QAPISchema(object):
                                                                  variants)))

     def _def_command(self, expr, info):
-        name = expr['command']
+        name = info['name'] = expr['command']
         data = expr.get('data', {})
         rets = expr.get('returns')
         gen = expr.get('gen', True)
@@ -1396,7 +1396,7 @@ class QAPISchema(object):
                                            success_response, box))

     def _def_event(self, expr, info):
-        name = expr['event']
+        name = info['name'] = expr['event']
         data = expr.get('data', {})
         box = expr.get('box', False)
         if isinstance(data, dict):
-- 
2.4.3

  parent reply	other threads:[~2015-12-23 20:56 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-23 20:55 [Qemu-devel] [PATCH v6 00/16] qapi netdev_add introspection (post-introspection cleanups subset F) Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 01/16] net: use Netdev instead of NetClientOptions in client init Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 02/16] qapi: Avoid use of 'data' member of qapi unions Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 03/16] qapi: Forbid empty unions and useless alternates Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 04/16] qapi: Drop useless 'data' member of unions Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 05/16] qapi: Hide tag_name data member of variants Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 06/16] qapi: Plumb in 'box' to qapi generator lower levels Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 07/16] qapi: Implement boxed types for commands/events Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 08/16] qapi: support implicit structs in OptsVisitor Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 09/16] qapi: Change Netdev into a flat union Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 10/16] net: Use correct type for bool flag Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 11/16] net: Complete qapi-fication of netdev_add Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 12/16] qapi: Allow anonymous base for flat union Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 13/16] qapi: Use anonymous base in SchemaInfo Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 14/16] qapi: Use anonymous base in Netdev Eric Blake
2015-12-23 20:55 ` [Qemu-devel] [PATCH v6 15/16] qapi: Use anonymous base in CpuInfo Eric Blake
2015-12-23 20:55 ` Eric Blake [this message]
2015-12-23 20:58 ` [Qemu-devel] [PATCH v6 00/16] qapi netdev_add introspection (post-introspection cleanups subset F) Eric Blake

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=1450904145-17721-17-git-send-email-eblake@redhat.com \
    --to=eblake@redhat.com \
    --cc=armbru@redhat.com \
    --cc=mdroth@linux.vnet.ibm.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).