[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 12/46] qapi: Track location that created an impli
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PATCH v5 12/46] qapi: Track location that created an implicit type |
Date: |
Mon, 21 Sep 2015 15:57:28 -0600 |
A future patch will enable error detection in the various
QapiSchema check() methods. But since all errors have to
have an associated 'info' location, we need a location to
be associated with all implicit types. Easiest is to reuse
the location of the enclosing entity that includes the
dictionary defining the implicit type.
While at it, we were always passing None as the location of
array types, making that parameter useless; sharing the
location (if any) of the underlying element type makes sense.
Signed-off-by: Eric Blake <address@hidden>
---
scripts/qapi.py | 22 ++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 1dc7641..e982970 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -908,8 +908,8 @@ class QAPISchemaEnumType(QAPISchemaType):
class QAPISchemaArrayType(QAPISchemaType):
- def __init__(self, name, info, element_type):
- QAPISchemaType.__init__(self, name, info)
+ def __init__(self, name, element_type):
+ QAPISchemaType.__init__(self, name, None)
assert isinstance(element_type, str)
self._element_type_name = element_type
self.element_type = None
@@ -917,6 +917,7 @@ class QAPISchemaArrayType(QAPISchemaType):
def check(self, schema):
self.element_type = schema.lookup_type(self._element_type_name)
assert self.element_type
+ self._info = self.element_type._info
def json_type(self):
return 'array'
@@ -928,6 +929,7 @@ class QAPISchemaArrayType(QAPISchemaType):
class QAPISchemaObjectType(QAPISchemaType):
def __init__(self, name, info, base, local_members, variants):
QAPISchemaType.__init__(self, name, info)
+ assert info or name == ':empty'
assert base is None or isinstance(base, str)
for m in local_members:
assert isinstance(m, QAPISchemaObjectTypeMember)
@@ -1165,15 +1167,15 @@ class QAPISchema(object):
def _make_array_type(self, element_type):
name = element_type + 'List'
if not self.lookup_type(name):
- self._def_entity(QAPISchemaArrayType(name, None, element_type))
+ self._def_entity(QAPISchemaArrayType(name, element_type))
return name
- def _make_implicit_object_type(self, name, role, members):
+ def _make_implicit_object_type(self, name, info, role, members):
if not members:
return None
name = ':obj-%s-%s' % (name, role)
if not self.lookup_entity(name, QAPISchemaObjectType):
- self._def_entity(QAPISchemaObjectType(name, None, None,
+ self._def_entity(QAPISchemaObjectType(name, info, None,
members, None))
return name
@@ -1210,11 +1212,11 @@ class QAPISchema(object):
def _make_variant(self, case, typ):
return QAPISchemaObjectTypeVariant(case, typ)
- def _make_simple_variant(self, case, typ):
+ def _make_simple_variant(self, info, case, typ):
if isinstance(typ, list):
assert len(typ) == 1
typ = self._make_array_type(typ[0])
- typ = self._make_implicit_object_type(typ, 'wrapper',
+ typ = self._make_implicit_object_type(typ, info, 'wrapper',
[self._make_member('data', typ)])
return QAPISchemaObjectTypeVariant(case, typ)
@@ -1232,7 +1234,7 @@ class QAPISchema(object):
variants = [self._make_variant(key, value)
for (key, value) in data.iteritems()]
else:
- variants = [self._make_simple_variant(key, value)
+ variants = [self._make_simple_variant(info, key, value)
for (key, value) in data.iteritems()]
tag_enum = self._make_tag_enum(name, variants)
self._def_entity(
@@ -1263,7 +1265,7 @@ class QAPISchema(object):
gen = expr.get('gen', True)
success_response = expr.get('success-response', True)
if isinstance(data, OrderedDict):
- data = self._make_implicit_object_type(name, 'arg',
+ data = self._make_implicit_object_type(name, info, 'arg',
self._make_members(data))
if isinstance(rets, list):
assert len(rets) == 1
@@ -1275,7 +1277,7 @@ class QAPISchema(object):
name = expr['event']
data = expr.get('data')
if isinstance(data, OrderedDict):
- data = self._make_implicit_object_type(name, 'arg',
+ data = self._make_implicit_object_type(name, info, 'arg',
self._make_members(data))
self._def_entity(QAPISchemaEvent(name, info, data))
--
2.4.3
- Re: [Qemu-devel] [PATCH v5 08/46] qapi: Reuse code for flat union base validation, (continued)
- [Qemu-devel] [PATCH v5 09/46] qapi: Use consistent generated code patterns, Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 10/46] qapi: Merge generation of per-member visits, Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 11/46] qapi: Don't use info as witness of implicit object type, Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 12/46] qapi: Track location that created an implicit type,
Eric Blake <=
- [Qemu-devel] [PATCH v5 14/46] qapi: Detect collisions in C member names, Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 16/46] qapi: Detect base class loops, Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 15/46] qapi: Defer duplicate member checks to schema check(), Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 13/46] qapi: Track owner of each object member, Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 17/46] qapi: Provide nicer array names in introspection, Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 18/46] qapi-introspect: Guarantee particular sorting, Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 20/46] qapi: Fix alternates that accept 'number' but not 'int', Eric Blake, 2015/09/21
- [Qemu-devel] [PATCH v5 21/46] qmp: Fix reference-counting of qnull on empty output visit, Eric Blake, 2015/09/21