X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=specs%2Fstdapi.py;h=0b2fe828babdf11cd1cab3b5db6143b1aae9cc5c;hb=e935ee1015d5162e02d90be7b52267194231e038;hp=fa371cf2d8706d8286d88d9d9ee0065f18123eed;hpb=461611165f5088edf02c40dc1544dd5b78fa0c24;p=apitrace diff --git a/specs/stdapi.py b/specs/stdapi.py index fa371cf..0b2fe82 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -30,28 +30,36 @@ import debug class Type: + """Base class for all types.""" - __all = {} - __seq = 0 + __tags = set() - def __init__(self, expr, id = ''): + def __init__(self, expr, tag = None): self.expr = expr - - for char in id: - assert char.isalnum() or char in '_ ' - id = id.replace(' ', '_') - - if id in Type.__all: - Type.__seq += 1 - id += str(Type.__seq) - - assert id not in Type.__all - Type.__all[id] = self + # Generate a default tag, used when naming functions that will operate + # on this type, so it should preferrably be something representative of + # the type. + if tag is None: + tag = ''.join([c for c in expr if c.isalnum() or c in '_']) + else: + for c in tag: + assert c.isalnum() or c in '_' + + # Ensure it is unique. + if tag in Type.__tags: + suffix = 1 + while tag + str(suffix) in Type.__tags: + suffix += 1 + tag += str(suffix) + + assert tag not in Type.__tags + Type.__tags.add(tag) - self.id = id + self.tag = tag def __str__(self): + """Return the C/C++ type expression for this type.""" return self.expr def visit(self, visitor, *args, **kwargs): @@ -60,6 +68,7 @@ class Type: class _Void(Type): + """Singleton void type.""" def __init__(self): Type.__init__(self, "void") @@ -71,10 +80,14 @@ Void = _Void() class Literal(Type): + """Class to describe literal types. - def __init__(self, expr, format, base=10): + Types which are not defined in terms of other types, such as integers and + floats.""" + + def __init__(self, expr, kind): Type.__init__(self, expr) - self.format = format + self.kind = kind def visit(self, visitor, *args, **kwargs): return visitor.visit_literal(self, *args, **kwargs) @@ -96,7 +109,7 @@ class Const(Type): # The most legible expr = "const " + type.expr - Type.__init__(self, expr, 'C' + type.id) + Type.__init__(self, expr, 'C' + type.tag) self.type = type @@ -107,7 +120,7 @@ class Const(Type): class Pointer(Type): def __init__(self, type): - Type.__init__(self, type.expr + " *", 'P' + type.id) + Type.__init__(self, type.expr + " *", 'P' + type.tag) self.type = type def visit(self, visitor, *args, **kwargs): @@ -117,7 +130,7 @@ class Pointer(Type): class Handle(Type): def __init__(self, name, type, range=None, key=None): - Type.__init__(self, type.expr, 'P' + type.id) + Type.__init__(self, type.expr, 'P' + type.tag) self.name = name self.type = type self.range = range @@ -133,10 +146,16 @@ def ConstPointer(type): class Enum(Type): + __id = 0 + def __init__(self, name, values): Type.__init__(self, name) + + self.id = Enum.__id + Enum.__id += 1 + self.values = list(values) - + def visit(self, visitor, *args, **kwargs): return visitor.visit_enum(self, *args, **kwargs) @@ -147,8 +166,14 @@ def FakeEnum(type, values): class Bitmask(Type): + __id = 0 + def __init__(self, type, values): Type.__init__(self, type.expr) + + self.id = Bitmask.__id + Bitmask.__id += 1 + self.type = type self.values = values @@ -182,8 +207,14 @@ class Blob(Type): class Struct(Type): + __id = 0 + def __init__(self, name, members): Type.__init__(self, name) + + self.id = Struct.__id + Struct.__id += 1 + self.name = name self.members = members @@ -220,7 +251,8 @@ class Arg: class Function: - __id = 0 + # 0-3 are reserved to memcpy, malloc, free, and realloc + __id = 4 def __init__(self, type, name, args, call = '', fail = None, sideeffects=True): self.id = Function.__id