qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v6 16/16] qapi: Populate info['name'] for each entit


From: Eric Blake
Subject: [Qemu-devel] [PATCH v6 16/16] qapi: Populate info['name'] for each entity
Date: Wed, 23 Dec 2015 13:55:45 -0700

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 <address@hidden>

---
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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]