Mailing List Archive

[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
)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel