[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v5 12/46] qapi: Track location that created an i
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v5 12/46] qapi: Track location that created an implicit type |
Date: |
Mon, 28 Sep 2015 14:56:05 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) |
Eric Blake <address@hidden> writes:
> 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.
The parameter is useless only because all array types are implicit.
Once we change that, it won't be anymore.
>
> 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'
Implicit array type's info is the element type's info. Okay.
> @@ -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'
I think what we really want to assert is "we got info unless this is a
built-in entity", in QAPISchemaEntity.__init__().
Built-in entities are exactly the types defined by
QAPISchema._def_predefineds(), currently the built-in types and
':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(
A simple union type's implicit wrapper types' info is the simple union
type's info. Okay.
> @@ -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
A command's implicit argument type's info is the command's info. Okay.
> @@ -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))
An event's implicit argument type's info is the event's info. Okay.
Missing: implicit enum types' info.
- [Qemu-devel] [PATCH v5 09/46] qapi: Use consistent generated code patterns, (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, 2015/09/21
- Re: [Qemu-devel] [PATCH v5 12/46] qapi: Track location that created an implicit type,
Markus Armbruster <=
- [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
- [Qemu-devel] [PATCH v5 19/46] qapi: Simplify visiting of alternate types, Eric Blake, 2015/09/21