return visitor.visitArray(self, *args, **kwargs)
+class AttribArray(Type):
+
+ def __init__(self, keyType, valueTypes, isConst = True, punType = None, terminator = '0'):
+ self.baseType = Int
+ if punType is not None:
+ self.baseType = punType
+ if isConst:
+ Type.__init__(self, (Pointer(Const(self.baseType))).expr)
+ else:
+ Type.__init__(self, (Pointer(self.baseType)).expr)
+ self.keyType = keyType
+ self.valueTypes = valueTypes
+ self.terminator = terminator
+ self.hasKeysWithoutValues = False
+ for key, value in valueTypes:
+ if value is None:
+ self.hasKeysWithoutValues = True
+
+ def visit(self, visitor, *args, **kwargs):
+ return visitor.visitAttribArray(self, *args, **kwargs)
+
+
class Blob(Type):
def __init__(self, type, size):
Struct.__id += 1
self.name = name
- self.members = []
-
- # Eliminate anonymous unions
- for type, name in members:
- if name is not None or isinstance(type, Polymorphic):
- self.members.append((type, name))
- else:
- assert isinstance(type, Union)
- assert type.name is None
- self.members.extend(type.members)
+ self.members = members
def visit(self, visitor, *args, **kwargs):
return visitor.visitStruct(self, *args, **kwargs)
-class Union(Type):
-
- __id = 0
-
- def __init__(self, name, members):
- Type.__init__(self, name)
-
- self.id = Union.__id
- Union.__id += 1
-
- self.name = name
- self.members = members
-
-def Union_(kindExpr, kindTypes, contextLess=True):
+def Union(kindExpr, kindTypes, contextLess=True):
switchTypes = []
for kindCase, kindType, kindMemberName in kindTypes:
switchType = Struct(None, [(kindType, kindMemberName)])
class Function:
- # 0-3 are reserved to memcpy, malloc, free, and realloc
- __id = 4
-
def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, internal=False):
- self.id = Function.__id
- Function.__id += 1
-
self.type = type
self.name = name
def argNames(self):
return [arg.name for arg in self.args]
+ def getArgByName(self, name):
+ for arg in self.args:
+ if arg.name == name:
+ return arg
+ return None
+
def StdFunction(*args, **kwargs):
kwargs.setdefault('call', '__stdcall')
iface = iface.base
raise StopIteration
+ def hasBase(self, *bases):
+ for iface in self.iterBases():
+ if iface in bases:
+ return True
+ return False
+
def iterBaseMethods(self):
if self.base is not None:
for iface, method in self.base.iterBaseMethods():
def visitArray(self, array, *args, **kwargs):
raise NotImplementedError
+ def visitAttribArray(self, array, *args, **kwargs):
+ raise NotImplementedError
+
def visitBlob(self, blob, *args, **kwargs):
raise NotImplementedError
def visitArray(self, array, *args, **kwargs):
self.visit(array.type, *args, **kwargs)
+ def visitAttribArray(self, attribs, *args, **kwargs):
+ for key, valueType in attribs.valueTypes:
+ if valueType is not None:
+ self.visit(valueType, *args, **kwargs)
+
def visitBlob(self, array, *args, **kwargs):
pass
self.types.append(type)
+class ExpanderMixin:
+ '''Mixin class that provides a bunch of methods to expand C expressions
+ from the specifications.'''
+
+ __structs = None
+ __indices = None
+
+ def expand(self, expr):
+ # Expand a C expression, replacing certain variables
+ if not isinstance(expr, basestring):
+ return expr
+ variables = {}
+
+ if self.__structs is not None:
+ variables['self'] = '(%s)' % self.__structs[0]
+ if self.__indices is not None:
+ variables['i'] = self.__indices[0]
+
+ expandedExpr = expr.format(**variables)
+ if expandedExpr != expr and 0:
+ sys.stderr.write(" %r -> %r\n" % (expr, expandedExpr))
+ return expandedExpr
+
+ def visitMember(self, member, structInstance, *args, **kwargs):
+ memberType, memberName = member
+ if memberName is None:
+ # Anonymous structure/union member
+ memberInstance = structInstance
+ else:
+ memberInstance = '(%s).%s' % (structInstance, memberName)
+ self.__structs = (structInstance, self.__structs)
+ try:
+ return self.visit(memberType, memberInstance, *args, **kwargs)
+ finally:
+ _, self.__structs = self.__structs
+
+ def visitElement(self, elementIndex, elementType, *args, **kwargs):
+ self.__indices = (elementIndex, self.__indices)
+ try:
+ return self.visit(elementType, *args, **kwargs)
+ finally:
+ _, self.__indices = self.__indices
+
class Module:
'''A collection of functions.'''