X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=specs%2Fstdapi.py;h=8a5a5a7fa5b647f3e45a29fbe3c06db114d87b6c;hb=cb9d2e002ba98b743851db4016dc68ba3ddbd845;hp=ff7508b7021257e4c57f6edd6660bd33e35ec6fc;hpb=bd0863402aa31ad674ca248ba82dfcc1ee90afea;p=apitrace diff --git a/specs/stdapi.py b/specs/stdapi.py index ff7508b..8a5a5a7 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -102,17 +102,43 @@ class Literal(Type): return visitor.visitLiteral(self, *args, **kwargs) +Bool = Literal("bool", "Bool") +SChar = Literal("signed char", "SInt") +UChar = Literal("unsigned char", "UInt") +Short = Literal("short", "SInt") +Int = Literal("int", "SInt") +Long = Literal("long", "SInt") +LongLong = Literal("long long", "SInt") +UShort = Literal("unsigned short", "UInt") +UInt = Literal("unsigned int", "UInt") +ULong = Literal("unsigned long", "UInt") +ULongLong = Literal("unsigned long long", "UInt") +Float = Literal("float", "Float") +Double = Literal("double", "Double") +SizeT = Literal("size_t", "UInt") + +Char = Literal("char", "SInt") +WChar = Literal("wchar_t", "SInt") + +Int8 = Literal("int8_t", "SInt") +UInt8 = Literal("uint8_t", "UInt") +Int16 = Literal("int16_t", "SInt") +UInt16 = Literal("uint16_t", "UInt") +Int32 = Literal("int32_t", "SInt") +UInt32 = Literal("uint32_t", "UInt") +Int64 = Literal("int64_t", "SInt") +UInt64 = Literal("uint64_t", "UInt") + +IntPtr = Literal("intptr_t", "SInt") +UIntPtr = Literal("uintptr_t", "UInt") + class Const(Type): def __init__(self, type): # While "const foo" and "foo const" are synonymous, "const foo *" and # "foo * const" are not quite the same, and some compilers do enforce # strict const correctness. - if isinstance(type, String) or type is WString: - # For strings we never intend to say a const pointer to chars, but - # rather a point to const chars. - expr = "const " + type.expr - elif type.expr.startswith("const ") or '*' in type.expr: + if type.expr.startswith("const ") or '*' in type.expr: expr = type.expr + " const" else: # The most legible @@ -332,7 +358,7 @@ 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): + def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, internal=False): self.id = Function.__id Function.__id += 1 @@ -356,6 +382,7 @@ class Function: self.call = call self.fail = fail self.sideeffects = sideeffects + self.internal = internal def prototype(self, name=None): if name is not None: @@ -402,9 +429,9 @@ class Interface(Type): return visitor.visitInterface(self, *args, **kwargs) def getMethodByName(self, name): - for methods in self.methods: - if methods.name == name: - return methods + for method in self.iterMethods(): + if method.name == name: + return method return None def iterMethods(self): @@ -452,11 +479,14 @@ def StdMethod(*args, **kwargs): class String(Type): + '''Human-legible character string.''' - def __init__(self, expr = "char *", length = None, kind = 'String'): - Type.__init__(self, expr) + def __init__(self, type = Char, length = None, wide = False): + assert isinstance(type, Type) + Type.__init__(self, type.expr + ' *') + self.type = type self.length = length - self.kind = kind + self.wide = wide def visit(self, visitor, *args, **kwargs): return visitor.visitString(self, *args, **kwargs) @@ -609,7 +639,11 @@ class Rebuilder(Visitor): return literal def visitString(self, string): - return string + string_type = self.visit(string.type) + if string_type is string.type: + return string + else: + return String(string_type, string.length, string.wide) def visitConst(self, const): const_type = self.visit(const.type) @@ -698,6 +732,9 @@ class Rebuilder(Visitor): class MutableRebuilder(Rebuilder): '''Type visitor which derives a mutable type.''' + def visitString(self, string): + return string + def visitConst(self, const): # Strip out const qualifier return const.type @@ -858,30 +895,8 @@ class API: return None -Bool = Literal("bool", "Bool") -SChar = Literal("signed char", "SInt") -UChar = Literal("unsigned char", "UInt") -Short = Literal("short", "SInt") -Int = Literal("int", "SInt") -Long = Literal("long", "SInt") -LongLong = Literal("long long", "SInt") -UShort = Literal("unsigned short", "UInt") -UInt = Literal("unsigned int", "UInt") -ULong = Literal("unsigned long", "UInt") -ULongLong = Literal("unsigned long long", "UInt") -Float = Literal("float", "Float") -Double = Literal("double", "Double") -SizeT = Literal("size_t", "UInt") - # C string (i.e., zero terminated) -CString = String() -WString = String("wchar_t *", kind="WString") - -Int8 = Literal("int8_t", "SInt") -UInt8 = Literal("uint8_t", "UInt") -Int16 = Literal("int16_t", "SInt") -UInt16 = Literal("uint16_t", "UInt") -Int32 = Literal("int32_t", "SInt") -UInt32 = Literal("uint32_t", "UInt") -Int64 = Literal("int64_t", "SInt") -UInt64 = Literal("uint64_t", "UInt") +CString = String(Char) +WString = String(WChar, wide=True) +ConstCString = String(Const(Char)) +ConstWString = String(Const(WChar), wide=True)