On Tue, Jul 23, 2013 at 03:03:10PM +0200, Kevin Wolf wrote: > The new 'base' key in a union definition refers to a struct type, which > is inlined into the union definition and can represent fields common to > all kinds. > > For example the following schema definition... > > { 'type': 'BlockOptionsBase', 'data': { 'read-only': 'bool' } } > > { 'union': 'BlockOptions', > 'base': 'BlockOptionsBase', > 'data': { > 'raw': 'BlockOptionsRaw' > 'qcow2': 'BlockOptionsQcow2' > } } > > ...would result in this generated C struct: > > struct BlockOptions > { > BlockOptionsKind kind; > union { > void *data; > BlockOptionsRaw * raw; > BlockOptionsQcow2 * qcow2; > }; > bool read_only; > }; > > Signed-off-by: Kevin Wolf <kw...@redhat.com> > --- > scripts/qapi-types.py | 16 ++++++++++++++-- > 1 file changed, 14 insertions(+), 2 deletions(-) > > diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py > index e1239e1..9882b95 100644 > --- a/scripts/qapi-types.py > +++ b/scripts/qapi-types.py > @@ -157,7 +157,12 @@ typedef enum %(name)s > > return lookup_decl + enum_decl > > -def generate_union(name, typeinfo): > +def generate_union(expr): > + > + name = expr['union'] > + typeinfo = expr['data'] > + base = expr.get('base') > + > ret = mcgen(''' > struct %(name)s > { > @@ -176,6 +181,13 @@ struct %(name)s > > ret += mcgen(''' > }; > +''') > + > + if base: > + struct = find_struct(base) > + ret += generate_struct_fields(struct['data'])
generate_struct_fields() doesn't exist in upstream. [qemu-upstream]$ grep generate_struct_fields -r * scripts/qapi-types.py: ret += generate_struct_fields(struct['data']) [qemu-upstream]$ > + > + ret += mcgen(''' > }; > ''') > > @@ -359,7 +371,7 @@ for expr in exprs: > ret += generate_type_cleanup_decl(expr['type']) > fdef.write(generate_type_cleanup(expr['type']) + "\n") > elif expr.has_key('union'): > - ret += generate_union(expr['union'], expr['data']) > + ret += generate_union(expr) > ret += generate_type_cleanup_decl(expr['union'] + "List") > fdef.write(generate_type_cleanup(expr['union'] + "List") + "\n") > ret += generate_type_cleanup_decl(expr['union']) > -- > 1.8.1.4 > -- Amos.