xgl.py: add more methods to Param and Proto
diff --git a/xgl.py b/xgl.py
index 5755855..544b362 100644
--- a/xgl.py
+++ b/xgl.py
@@ -37,6 +37,28 @@
else:
return "%s %s" % (self.ty, self.name)
+ def indirection_level(self):
+ """Return the level of indirection."""
+ return self.ty.count("*") + self.ty.count("[")
+
+ def dereferenced_type(self, level=0):
+ """Return the type after dereferencing."""
+ if not level:
+ level = self.indirection_level()
+
+ deref = self.ty if level else ""
+ while level > 0:
+ idx = deref.rfind("[")
+ if idx < 0:
+ idx = deref.rfind("*")
+ if idx < 0:
+ deref = ""
+ break
+ deref = deref[:idx]
+ level -= 1;
+
+ return deref.rstrip()
+
def __repr__(self):
return "Param(\"%s\", \"%s\")" % (self.ty, self.name)
@@ -108,6 +130,15 @@
"""Return a call to the prototype in C."""
return "%s(%s)" % (self.name, self.c_params(need_type=False))
+ def object_in_params(self):
+ """Return the params that are simple XGL objects and are inputs."""
+ return [param for param in self.params if param.ty in objects]
+
+ def object_out_params(self):
+ """Return the params that are simple XGL objects and are outputs."""
+ return [param for param in self.params
+ if param.dereferenced_type() in objects]
+
def __repr__(self):
param_strs = []
for param in self.params: