[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
- [Qemu-devel] [PATCH v6 08/16] qapi: support implicit structs in OptsVisitor, (continued)
- [Qemu-devel] [PATCH v6 08/16] qapi: support implicit structs in OptsVisitor, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 07/16] qapi: Implement boxed types for commands/events, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 05/16] qapi: Hide tag_name data member of variants, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 02/16] qapi: Avoid use of 'data' member of qapi unions, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 06/16] qapi: Plumb in 'box' to qapi generator lower levels, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 11/16] net: Complete qapi-fication of netdev_add, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 14/16] qapi: Use anonymous base in Netdev, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 13/16] qapi: Use anonymous base in SchemaInfo, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 15/16] qapi: Use anonymous base in CpuInfo, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 10/16] net: Use correct type for bool flag, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 16/16] qapi: Populate info['name'] for each entity,
Eric Blake <=
- [Qemu-devel] [PATCH v6 12/16] qapi: Allow anonymous base for flat union, Eric Blake, 2015/12/23
- [Qemu-devel] [PATCH v6 09/16] qapi: Change Netdev into a flat union, Eric Blake, 2015/12/23
- Re: [Qemu-devel] [PATCH v6 00/16] qapi netdev_add introspection (post-introspection cleanups subset F), Eric Blake, 2015/12/23