Ian Campbell
2012-Nov-20 17:23 UTC
[PATCH 03 of 15] libxl: idl: Allow KeyedUnion members to be empty
# HG changeset patch # User Ian Campbell <ijc@hellion.org.uk> # Date 1353432141 0 # Node ID 739989dcd108c6dac61aa9c87be2a75feafb9871 # Parent 8195cb0ebac691ae94e97939362f4d345891b4a7 libxl: idl: Allow KeyedUnion members to be empty This is useful when the key enum has an "invalid" option and avoids the need to declare a dummy struct. Use this for domain_build_info resulting in the generated API changing like so: --- tools/libxl/_libxl_BACKUP_types.h +++ tools/libxl/_libxl_types.h @@ -377,8 +377,6 @@ typedef struct libxl_domain_build_info { const char * features; libxl_defbool e820_host; } pv; - struct { - } invalid; } u; } libxl_domain_build_info; void libxl_domain_build_info_dispose(libxl_domain_build_info *p); + a related change to the JSON generation. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 8195cb0ebac6 -r 739989dcd108 tools/libxl/gentest.py --- a/tools/libxl/gentest.py Tue Nov 20 17:22:21 2012 +0000 +++ b/tools/libxl/gentest.py Tue Nov 20 17:22:21 2012 +0000 @@ -46,7 +46,8 @@ def gen_rand_init(ty, v, indent = " " for f in ty.fields: (nparent,fexpr) = ty.member(v, f, parent is None) s += "case %s:\n" % f.enumname - s += gen_rand_init(f.type, fexpr, indent + " ", nparent) + if f.type is not None: + s += gen_rand_init(f.type, fexpr, indent + " ", nparent) s += " break;\n" s += "}\n" elif isinstance(ty, idl.Struct) \ diff -r 8195cb0ebac6 -r 739989dcd108 tools/libxl/gentypes.py --- a/tools/libxl/gentypes.py Tue Nov 20 17:22:21 2012 +0000 +++ b/tools/libxl/gentypes.py Tue Nov 20 17:22:21 2012 +0000 @@ -45,6 +45,8 @@ def libxl_C_type_define(ty, indent = "") s += "typedef %s %s {\n" % (ty.kind, ty.typename) for f in ty.fields: + if isinstance(ty, idl.KeyedUnion) and f.type is None: continue + x = libxl_C_instance_of(f.type, f.name) if f.const: x = "const " + x @@ -67,7 +69,8 @@ def libxl_C_type_dispose(ty, v, indent for f in ty.fields: (nparent,fexpr) = ty.member(v, f, parent is None) s += "case %s:\n" % f.enumname - s += libxl_C_type_dispose(f.type, fexpr, indent + " ", nparent) + if f.type is not None: + s += libxl_C_type_dispose(f.type, fexpr, indent + " ", nparent) s += " break;\n" s += "}\n" elif isinstance(ty, idl.Array): @@ -115,7 +118,8 @@ def _libxl_C_type_init(ty, v, indent = " for f in ty.fields: (nparent,fexpr) = ty.member(v, f, parent is None) s += "case %s:\n" % f.enumname - s += _libxl_C_type_init(f.type, fexpr, " ", nparent) + if f.type is not None: + s += _libxl_C_type_init(f.type, fexpr, " ", nparent) s += " break;\n" s += "}\n" else: @@ -214,7 +218,8 @@ def libxl_C_type_gen_json(ty, v, indent for f in ty.fields: (nparent,fexpr) = ty.member(v, f, parent is None) s += "case %s:\n" % f.enumname - s += libxl_C_type_gen_json(f.type, fexpr, indent + " ", nparent) + if f.type is not None: + s += libxl_C_type_gen_json(f.type, fexpr, indent + " ", nparent) s += " break;\n" s += "}\n" elif isinstance(ty, idl.Struct) and (parent is None or ty.json_fn is None): diff -r 8195cb0ebac6 -r 739989dcd108 tools/libxl/libxl_types.idl --- a/tools/libxl/libxl_types.idl Tue Nov 20 17:22:21 2012 +0000 +++ b/tools/libxl/libxl_types.idl Tue Nov 20 17:22:21 2012 +0000 @@ -338,7 +338,7 @@ libxl_domain_build_info = Struct("domain # Use host''s E820 for PCI passthrough. ("e820_host", libxl_defbool), ])), - ("invalid", Struct(None, [])), + ("invalid", None), ], keyvar_init_val = "LIBXL_DOMAIN_TYPE_INVALID")), ], dir=DIR_IN )