[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.