[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 6 of 9] libxl: IDL: add helper to generate references to Aggregate type members
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1310646156 -3600 # Node ID df13bcff8d7ddedbce11f7e096d5756beb3f913b # Parent 5601d0ddb75d62643312dfc71da6715d42d7186f libxl: IDL: add helper to generate references to Aggregate type members. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> diff -r 5601d0ddb75d -r df13bcff8d7d tools/libxl/gentypes.py --- a/tools/libxl/gentypes.py Thu Jul 14 13:22:36 2011 +0100 +++ b/tools/libxl/gentypes.py Thu Jul 14 13:22:36 2011 +0100 @@ -76,27 +76,21 @@ def libxl_C_type_define(ty, indent = "") return s.replace("\n", "\n%s" % indent) def libxl_C_type_destroy(ty, v, indent = " ", parent = None): - if parent is None: - deref = v + "->" - else: - deref = v + "." s = "" if isinstance(ty, libxltypes.KeyedUnion): if parent is None: raise Exception("KeyedUnion type must have a parent") for f in ty.fields: + (nparent,fexpr) = ty.member(v, f, parent is None) keyvar_expr = f.keyvar_expr % (parent + ty.keyvar_name) s += "if (" + keyvar_expr + ") {\n" - s += libxl_C_type_destroy(f.type, deref + f.name, indent + " ", deref) + s += libxl_C_type_destroy(f.type, fexpr, indent + " ", nparent) s += "}\n" elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.destructor_fn is None): for f in [f for f in ty.fields if not f.const]: - - if f.name is None: # Anonymous struct - s += libxl_C_type_destroy(f.type, deref, "", deref) - else: - s += libxl_C_type_destroy(f.type, deref + f.name, "", deref) + (nparent,fexpr) = ty.member(v, f, parent is None) + s += libxl_C_type_destroy(f.type, fexpr, "", nparent) else: if ty.destructor_fn is not None: s += "%s(%s);\n" % (ty.destructor_fn, ty.pass_arg(v, parent is None)) diff -r 5601d0ddb75d -r df13bcff8d7d tools/libxl/libxltypes.py --- a/tools/libxl/libxltypes.py Thu Jul 14 13:22:36 2011 +0100 +++ b/tools/libxl/libxltypes.py Thu Jul 14 13:22:36 2011 +0100 @@ -147,6 +147,24 @@ class Aggregate(Type): n,t,const,comment = f self.fields.append(Field(t,n,const=const,comment=comment)) + # Returns a tuple (stem, field-expr) + # + # field-expr is a C expression for a field "f" within the struct + # "v". + # + # stem is the stem common to both "f" and any other sibbling field + # within the "v". + def member(self, v, f, isref): + if isref: + deref = v + "->" + else: + deref = v + "." + + if f.name is None: # Anonymous + return (deref, deref) + else: + return (deref, deref + f.name) + class Struct(Aggregate): def __init__(self, name, fields, **kwargs): kwargs.setdefault('passby', PASS_BY_REFERENCE) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |