mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
libxl: IDL: handle generation of pass-by-reference arguments.
Up until now everything with a destructor function happened to be pass-by-reference so the current code worked but this will not be the case for *_to_string and *_to_json. Put some infrastructure in place and use it. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Committed-by: Ian Jackson <ian.jackson.citrix.com>
This commit is contained in:
1 parent
2cbaaf0d42
commit
48db030b86
3 files changed
+14
-6
No files matched your search
@@ -178,10 +178,10 @@ if __name__ == '__main__':
|
||||
for ty in types:
|
||||
f.write(libxl_C_type_define(ty) + ";\n")
|
||||
if ty.destructor_fn is not None:
|
||||
f.write("void %s(%s *p);\n" % (ty.destructor_fn, ty.typename))
|
||||
f.write("void %s(%s);\n" % (ty.destructor_fn, ty.make_arg("p")))
|
||||
if isinstance(ty, libxltypes.Enumeration):
|
||||
f.write("const char *%s_to_string(%s e);\n" % (ty.typename, ty.typename))
|
||||
f.write("int %s_from_string(const char *s, %s *e);\n" % (ty.typename, ty.typename))
|
||||
f.write("const char *%s_to_string(%s);\n" % (ty.typename, ty.make_arg("p")))
|
||||
f.write("int %s_from_string(const char *s, %s);\n" % (ty.typename, ty.make_arg("e", passby=libxltypes.PASS_BY_REFERENCE)))
|
||||
f.write("extern libxl_enum_string_table %s_string_table[];\n" % (ty.typename))
|
||||
f.write("\n")
|
||||
|
||||
@@ -213,7 +213,7 @@ if __name__ == '__main__':
|
||||
""" % " ".join(sys.argv))
|
||||
|
||||
for ty in [t for t in types if t.destructor_fn is not None and t.autogenerate_destructor]:
|
||||
f.write("void %s(%s *p)\n" % (ty.destructor_fn, ty.typename))
|
||||
f.write("void %s(%s)\n" % (ty.destructor_fn, ty.make_arg("p")))
|
||||
f.write("{\n")
|
||||
f.write(libxl_C_type_destroy(ty, "p"))
|
||||
f.write(" memset(p, LIBXL_DTOR_POISON, sizeof(*p));\n")
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
#
|
||||
|
||||
libxl_domid = Builtin("domid")
|
||||
libxl_uuid = Builtin("uuid")
|
||||
libxl_mac = Builtin("mac")
|
||||
libxl_uuid = Builtin("uuid", passby=PASS_BY_REFERENCE)
|
||||
libxl_mac = Builtin("mac", passby=PASS_BY_REFERENCE)
|
||||
libxl_cpumap = Builtin("cpumap", destructor_fn="libxl_cpumap_destroy", passby=PASS_BY_REFERENCE)
|
||||
libxl_cpuarray = Builtin("cpuarray", destructor_fn="libxl_cpuarray_destroy", passby=PASS_BY_REFERENCE)
|
||||
libxl_cpuid_policy_list = Builtin("cpuid_policy_list", destructor_fn="libxl_cpuid_destroy", passby=PASS_BY_REFERENCE)
|
||||
|
||||
@@ -42,6 +42,14 @@ class Type(object):
|
||||
def marshal_out(self):
|
||||
return self.dir in [DIR_OUT, DIR_BOTH]
|
||||
|
||||
def make_arg(self, n, passby=None):
|
||||
if passby is None: passby = self.passby
|
||||
|
||||
if passby == PASS_BY_REFERENCE:
|
||||
return "%s *%s" % (self.typename, n)
|
||||
else:
|
||||
return "%s %s" % (self.typename, n)
|
||||
|
||||
class Builtin(Type):
|
||||
"""Builtin type"""
|
||||
def __init__(self, typename, **kwargs):
|
||||
|
||||