Loading docs/devel/qapi-code-gen.txt +3 −1 Original line number Diff line number Diff line Loading @@ -234,7 +234,9 @@ Syntax: '*features': FEATURES } MEMBERS = { MEMBER, ... } MEMBER = STRING : TYPE-REF | STRING : { 'type': TYPE-REF, '*if': COND } | STRING : { 'type': TYPE-REF, '*if': COND, '*features': FEATURES } Member 'struct' names the struct type. Loading qapi/introspect.json +5 −1 Original line number Diff line number Diff line Loading @@ -206,11 +206,15 @@ # Future extension: if present and non-null, the parameter # is optional, and defaults to this value. # # @features: names of features associated with the member, in no # particular order. (since 5.0) # # Since: 2.5 ## { 'struct': 'SchemaInfoObjectMember', 'data': { 'name': 'str', 'type': 'str', '*default': 'any' } } 'data': { 'name': 'str', 'type': 'str', '*default': 'any', # @default's type must be null or match @type '*features': [ 'str' ] } } ## # @SchemaInfoObjectVariant: Loading scripts/qapi/expr.py +2 −1 Original line number Diff line number Diff line Loading @@ -167,8 +167,9 @@ def check_type(value, info, source, allow_optional=True, permit_upper=permit_upper) if c_name(key, False) == 'u' or c_name(key, False).startswith('has_'): raise QAPISemError(info, "%s uses reserved name" % key_source) check_keys(arg, info, key_source, ['type'], ['if']) check_keys(arg, info, key_source, ['type'], ['if', 'features']) check_if(arg, info, key_source) check_features(arg.get('features'), info) check_type(arg['type'], info, key_source, allow_array=True) Loading scripts/qapi/introspect.py +1 −1 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ const QLitObject %(c_name)s = %(c_string)s; obj = {'name': member.name, 'type': self._use_type(member.type)} if member.optional: obj['default'] = None return _make_tree(obj, member.ifcond, None) return _make_tree(obj, member.ifcond, member.features) def _gen_variants(self, tag_name, variants): return {'tag': tag_name, Loading scripts/qapi/schema.py +20 −5 Original line number Diff line number Diff line Loading @@ -668,18 +668,31 @@ class QAPISchemaFeature(QAPISchemaMember): class QAPISchemaObjectTypeMember(QAPISchemaMember): def __init__(self, name, info, typ, optional, ifcond=None): def __init__(self, name, info, typ, optional, ifcond=None, features=None): super().__init__(name, info, ifcond) assert isinstance(typ, str) assert isinstance(optional, bool) for f in features or []: assert isinstance(f, QAPISchemaFeature) f.set_defined_in(name) self._type_name = typ self.type = None self.optional = optional self.features = features or [] def check(self, schema): assert self.defined_in self.type = schema.resolve_type(self._type_name, self.info, self.describe) seen = {} for f in self.features: f.check_clash(self.info, seen) def connect_doc(self, doc): super().connect_doc(doc) if doc: for f in self.features: doc.connect_feature(f) class QAPISchemaVariant(QAPISchemaObjectTypeMember): Loading Loading @@ -962,7 +975,7 @@ class QAPISchema: name, info, doc, ifcond, features, self._make_enum_members(data, info), prefix)) def _make_member(self, name, typ, ifcond, info): def _make_member(self, name, typ, ifcond, features, info): optional = False if name.startswith('*'): name = name[1:] Loading @@ -970,10 +983,12 @@ class QAPISchema: if isinstance(typ, list): assert len(typ) == 1 typ = self._make_array_type(typ[0], info) return QAPISchemaObjectTypeMember(name, info, typ, optional, ifcond) return QAPISchemaObjectTypeMember(name, info, typ, optional, ifcond, self._make_features(features, info)) def _make_members(self, data, info): return [self._make_member(key, value['type'], value.get('if'), info) return [self._make_member(key, value['type'], value.get('if'), value.get('features'), info) for (key, value) in data.items()] def _def_struct_type(self, expr, info, doc): Loading @@ -996,7 +1011,7 @@ class QAPISchema: typ = self._make_array_type(typ[0], info) typ = self._make_implicit_object_type( typ, info, self.lookup_type(typ), 'wrapper', [self._make_member('data', typ, None, info)]) 'wrapper', [self._make_member('data', typ, None, None, info)]) return QAPISchemaVariant(case, info, typ, ifcond) def _def_union_type(self, expr, info, doc): Loading Loading
docs/devel/qapi-code-gen.txt +3 −1 Original line number Diff line number Diff line Loading @@ -234,7 +234,9 @@ Syntax: '*features': FEATURES } MEMBERS = { MEMBER, ... } MEMBER = STRING : TYPE-REF | STRING : { 'type': TYPE-REF, '*if': COND } | STRING : { 'type': TYPE-REF, '*if': COND, '*features': FEATURES } Member 'struct' names the struct type. Loading
qapi/introspect.json +5 −1 Original line number Diff line number Diff line Loading @@ -206,11 +206,15 @@ # Future extension: if present and non-null, the parameter # is optional, and defaults to this value. # # @features: names of features associated with the member, in no # particular order. (since 5.0) # # Since: 2.5 ## { 'struct': 'SchemaInfoObjectMember', 'data': { 'name': 'str', 'type': 'str', '*default': 'any' } } 'data': { 'name': 'str', 'type': 'str', '*default': 'any', # @default's type must be null or match @type '*features': [ 'str' ] } } ## # @SchemaInfoObjectVariant: Loading
scripts/qapi/expr.py +2 −1 Original line number Diff line number Diff line Loading @@ -167,8 +167,9 @@ def check_type(value, info, source, allow_optional=True, permit_upper=permit_upper) if c_name(key, False) == 'u' or c_name(key, False).startswith('has_'): raise QAPISemError(info, "%s uses reserved name" % key_source) check_keys(arg, info, key_source, ['type'], ['if']) check_keys(arg, info, key_source, ['type'], ['if', 'features']) check_if(arg, info, key_source) check_features(arg.get('features'), info) check_type(arg['type'], info, key_source, allow_array=True) Loading
scripts/qapi/introspect.py +1 −1 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ const QLitObject %(c_name)s = %(c_string)s; obj = {'name': member.name, 'type': self._use_type(member.type)} if member.optional: obj['default'] = None return _make_tree(obj, member.ifcond, None) return _make_tree(obj, member.ifcond, member.features) def _gen_variants(self, tag_name, variants): return {'tag': tag_name, Loading
scripts/qapi/schema.py +20 −5 Original line number Diff line number Diff line Loading @@ -668,18 +668,31 @@ class QAPISchemaFeature(QAPISchemaMember): class QAPISchemaObjectTypeMember(QAPISchemaMember): def __init__(self, name, info, typ, optional, ifcond=None): def __init__(self, name, info, typ, optional, ifcond=None, features=None): super().__init__(name, info, ifcond) assert isinstance(typ, str) assert isinstance(optional, bool) for f in features or []: assert isinstance(f, QAPISchemaFeature) f.set_defined_in(name) self._type_name = typ self.type = None self.optional = optional self.features = features or [] def check(self, schema): assert self.defined_in self.type = schema.resolve_type(self._type_name, self.info, self.describe) seen = {} for f in self.features: f.check_clash(self.info, seen) def connect_doc(self, doc): super().connect_doc(doc) if doc: for f in self.features: doc.connect_feature(f) class QAPISchemaVariant(QAPISchemaObjectTypeMember): Loading Loading @@ -962,7 +975,7 @@ class QAPISchema: name, info, doc, ifcond, features, self._make_enum_members(data, info), prefix)) def _make_member(self, name, typ, ifcond, info): def _make_member(self, name, typ, ifcond, features, info): optional = False if name.startswith('*'): name = name[1:] Loading @@ -970,10 +983,12 @@ class QAPISchema: if isinstance(typ, list): assert len(typ) == 1 typ = self._make_array_type(typ[0], info) return QAPISchemaObjectTypeMember(name, info, typ, optional, ifcond) return QAPISchemaObjectTypeMember(name, info, typ, optional, ifcond, self._make_features(features, info)) def _make_members(self, data, info): return [self._make_member(key, value['type'], value.get('if'), info) return [self._make_member(key, value['type'], value.get('if'), value.get('features'), info) for (key, value) in data.items()] def _def_struct_type(self, expr, info, doc): Loading @@ -996,7 +1011,7 @@ class QAPISchema: typ = self._make_array_type(typ[0], info) typ = self._make_implicit_object_type( typ, info, self.lookup_type(typ), 'wrapper', [self._make_member('data', typ, None, info)]) 'wrapper', [self._make_member('data', typ, None, None, info)]) return QAPISchemaVariant(case, info, typ, ifcond) def _def_union_type(self, expr, info, doc): Loading