# 0-3 are reserved to memcpy, malloc, free, and realloc
__id = 4
- def __init__(self, type, name, args, call = '', fail = None, sideeffects=True):
+ def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, internal=False):
self.id = Function.__id
Function.__id += 1
self.call = call
self.fail = fail
self.sideeffects = sideeffects
+ self.internal = internal
def prototype(self, name=None):
if name is not None:
def visit(self, visitor, *args, **kwargs):
return visitor.visitInterface(self, *args, **kwargs)
+ def getMethodByName(self, name):
+ for method in self.iterMethods():
+ if method.name == name:
+ return method
+ return None
+
def iterMethods(self):
if self.base is not None:
for method in self.base.iterMethods():
class Polymorphic(Type):
- def __init__(self, defaultType, switchExpr, switchTypes):
+ def __init__(self, switchExpr, switchTypes, defaultType, contextLess=True):
Type.__init__(self, defaultType.expr)
- self.defaultType = defaultType
self.switchExpr = switchExpr
self.switchTypes = switchTypes
+ self.defaultType = defaultType
+ self.contextLess = contextLess
def visit(self, visitor, *args, **kwargs):
return visitor.visitPolymorphic(self, *args, **kwargs)
return zip(cases, types)
+def EnumPolymorphic(enumName, switchExpr, switchTypes, defaultType, contextLess=True):
+ enumValues = [expr for expr, type in switchTypes]
+ enum = Enum(enumName, enumValues)
+ polymorphic = Polymorphic(switchExpr, switchTypes, defaultType, contextLess)
+ return enum, polymorphic
+
+
class Visitor:
'''Abstract visitor for the type hierarchy.'''
return interface
def visitPolymorphic(self, polymorphic):
- defaultType = self.visit(polymorphic.defaultType)
switchExpr = polymorphic.switchExpr
switchTypes = [(expr, self.visit(type)) for expr, type in polymorphic.switchTypes]
- return Polymorphic(defaultType, switchExpr, switchTypes)
+ defaultType = self.visit(polymorphic.defaultType)
+ return Polymorphic(switchExpr, switchTypes, defaultType, polymorphic.contextLess)
class MutableRebuilder(Rebuilder):