X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=specs%2Fstdapi.py;h=d9fd5455bbdf381d7dbcf008cc851f07f0a30764;hb=4220b1bd2f3baccc2d4cbb63dda6413e093a2954;hp=35257a3571ffdacc71c86d666637f4393a4fff4c;hpb=568ecc29ff1a22d8ad059bade28ac79728b92958;p=apitrace diff --git a/specs/stdapi.py b/specs/stdapi.py index 35257a3..d9fd545 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -127,6 +127,25 @@ class Pointer(Type): return visitor.visitPointer(self, *args, **kwargs) +class IntPointer(Type): + '''Integer encoded as a pointer.''' + + def visit(self, visitor, *args, **kwargs): + return visitor.visitIntPointer(self, *args, **kwargs) + + +class LinearPointer(Type): + '''Integer encoded as a pointer.''' + + def __init__(self, type, size = None): + Type.__init__(self, type.expr + " *", 'P' + type.tag) + self.type = type + self.size = size + + def visit(self, visitor, *args, **kwargs): + return visitor.visitLinearPointer(self, *args, **kwargs) + + class Handle(Type): def __init__(self, name, type, range=None, key=None): @@ -331,6 +350,14 @@ class Interface(Type): yield method raise StopIteration + def iterBaseMethods(self): + if self.base is not None: + for iface, method in self.base.iterBaseMethods(): + yield iface, method + for method in self.methods: + yield self, method + raise StopIteration + class Method(Function): @@ -342,16 +369,14 @@ class Method(Function): class String(Type): - def __init__(self, expr = "char *", length = None): + def __init__(self, expr = "char *", length = None, kind = 'String'): Type.__init__(self, expr) self.length = length + self.kind = kind def visit(self, visitor, *args, **kwargs): return visitor.visitString(self, *args, **kwargs) -# C string (i.e., zero terminated) -CString = String() - class Opaque(Type): '''Opaque pointer.''' @@ -437,6 +462,12 @@ class Visitor: def visitPointer(self, pointer, *args, **kwargs): raise NotImplementedError + def visitIntPointer(self, pointer, *args, **kwargs): + raise NotImplementedError + + def visitLinearPointer(self, pointer, *args, **kwargs): + raise NotImplementedError + def visitHandle(self, handle, *args, **kwargs): raise NotImplementedError @@ -508,6 +539,13 @@ class Rebuilder(Visitor): type = self.visit(pointer.type) return Pointer(type) + def visitIntPointer(self, pointer): + return pointer + + def visitLinearPointer(self, pointer): + type = self.visit(pointer.type) + return LinearPointer(type, pointer.size) + def visitHandle(self, handle): type = self.visit(handle.type) return Handle(handle.name, type, range=handle.range, key=handle.key) @@ -519,6 +557,9 @@ class Rebuilder(Visitor): def visitOpaque(self, opaque): return opaque + def visitInterface(self, interface, *args, **kwargs): + return interface + def visitPolymorphic(self, polymorphic): defaultType = self.visit(polymorphic.defaultType) switchExpr = polymorphic.switchExpr @@ -571,6 +612,12 @@ class Collector(Visitor): def visitPointer(self, pointer): self.visit(pointer.type) + def visitIntPointer(self, pointer): + pass + + def visitLinearPointer(self, pointer): + self.visit(pointer.type) + def visitHandle(self, handle): self.visit(handle.type) @@ -606,7 +653,7 @@ class API: self.functions = [] self.interfaces = [] - def all_types(self): + def getAllTypes(self): collector = Collector() for function in self.functions: for arg in function.args: @@ -620,6 +667,14 @@ class API: collector.visit(method.type) return collector.types + def getAllInterfaces(self): + types = self.getAllTypes() + interfaces = [type for type in types if isinstance(type, Interface)] + for interface in self.interfaces: + if interface not in interfaces: + interfaces.append(interface) + return interfaces + def addFunction(self, function): self.functions.append(function) @@ -659,7 +714,10 @@ ULongLong = Literal("unsigned long long", "UInt") Float = Literal("float", "Float") Double = Literal("double", "Double") SizeT = Literal("size_t", "UInt") -WString = Literal("wchar_t *", "WString") + +# C string (i.e., zero terminated) +CString = String() +WString = String("wchar_t *", kind="WString") Int8 = Literal("int8_t", "SInt") UInt8 = Literal("uint8_t", "UInt")