X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=specs%2Fstdapi.py;h=c652736a8383e9156e5bd7e88af34dde79760382;hb=999284fd424cbf7dde024f949cdece0f308d41db;hp=4b4808e458641173cf0b350a06a91cc715f85881;hpb=eb216e6bd676535a5668bf8c389433c657f51aad;p=apitrace diff --git a/specs/stdapi.py b/specs/stdapi.py index 4b4808e..c652736 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -292,35 +292,13 @@ class Struct(Type): 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)]) @@ -362,13 +340,7 @@ def InOut(type, name): 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 @@ -413,6 +385,12 @@ class Function: 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') @@ -855,6 +833,49 @@ class Collector(Traverser): 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.'''