X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=stdapi.py;h=1f8b81e72bd8d632711fbeeb5dba5eee210c1610;hb=cefdd197f2f20d8afdbcac6e93680ac9aa8c0351;hp=8326a725ce9dab9eea221601cea7aef4e69c827f;hpb=9796b8463dc518eb0c6cf92b4daf92d080a6a896;p=apitrace diff --git a/stdapi.py b/stdapi.py index 8326a72..1f8b81e 100644 --- a/stdapi.py +++ b/stdapi.py @@ -1,6 +1,6 @@ ########################################################################## # -# Copyright 2008-2009 VMware, Inc. +# Copyright 2008-2010 VMware, Inc. # All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy @@ -29,120 +29,9 @@ import debug -all_types = {} - - -class Visitor: - - def visit(self, type, *args, **kwargs): - return type.visit(self, *args, **kwargs) - - def visit_void(self, void, *args, **kwargs): - raise NotImplementedError - - def visit_literal(self, literal, *args, **kwargs): - raise NotImplementedError - - def visit_string(self, string, *args, **kwargs): - raise NotImplementedError - - def visit_const(self, const, *args, **kwargs): - raise NotImplementedError - - def visit_struct(self, struct, *args, **kwargs): - raise NotImplementedError - - def visit_array(self, array, *args, **kwargs): - raise NotImplementedError - - def visit_blob(self, blob, *args, **kwargs): - raise NotImplementedError - - def visit_enum(self, enum, *args, **kwargs): - raise NotImplementedError - - def visit_bitmask(self, bitmask, *args, **kwargs): - raise NotImplementedError - - def visit_pointer(self, pointer, *args, **kwargs): - raise NotImplementedError - - def visit_handle(self, handle, *args, **kwargs): - raise NotImplementedError - - def visit_alias(self, alias, *args, **kwargs): - raise NotImplementedError - - def visit_opaque(self, opaque, *args, **kwargs): - raise NotImplementedError - - def visit_interface(self, interface, *args, **kwargs): - raise NotImplementedError - - -class OnceVisitor(Visitor): - - def __init__(self): - self.__visited = set() - - def visit(self, type, *args, **kwargs): - if type not in self.__visited: - self.__visited.add(type) - return type.visit(self, *args, **kwargs) - return None - - -class Rebuilder(Visitor): - - def visit_void(self, void): - return void - - def visit_literal(self, literal): - return literal - - def visit_string(self, string): - return string - - def visit_const(self, const): - return Const(const.type) - - def visit_struct(self, struct): - members = [self.visit(member) for member in struct.members] - return Struct(struct.name, members) - - def visit_array(self, array): - type = self.visit(array.type) - return Array(type, array.length) - - def visit_blob(self, blob): - type = self.visit(blob.type) - return Blob(type, blob.size) - - def visit_enum(self, enum): - return enum - - def visit_bitmask(self, bitmask): - type = self.visit(bitmask.type) - return Bitmask(type, bitmask.values) - - def visit_pointer(self, pointer): - type = self.visit(pointer.type) - return Pointer(type) - - def visit_handle(self, handle): - type = self.visit(handle.type) - return Handle(handle.name, type) - - def visit_alias(self, alias): - type = self.visit(alias.type) - return Alias(alias.expr, type) - - def visit_opaque(self, opaque): - return opaque - - class Type: + __all = {} __seq = 0 def __init__(self, expr, id = ''): @@ -153,12 +42,12 @@ class Type: id = id.replace(' ', '_') - if id in all_types: + if id in Type.__all: Type.__seq += 1 id += str(Type.__seq) - assert id not in all_types - all_types[id] = self + assert id not in Type.__all + Type.__all[id] = self self.id = id @@ -181,24 +70,6 @@ class _Void(Type): Void = _Void() -class Concrete(Type): - - def decl(self): - print 'static void Dump%s(const %s &value);' % (self.id, self.expr) - - def impl(self): - print 'static void Dump%s(const %s &value) {' % (self.id, self.expr) - self._dump("value"); - print '}' - print - - def _dump(self, instance): - raise NotImplementedError - - def dump(self, instance): - print ' Dump%s(%s);' % (self.id, instance) - - class Literal(Type): def __init__(self, expr, format, base=10): @@ -238,10 +109,12 @@ class Pointer(Type): class Handle(Type): - def __init__(self, name, type): + def __init__(self, name, type, range=None, key=None): Type.__init__(self, type.expr, 'P' + type.id) self.name = name self.type = type + self.range = range + self.key = key def visit(self, visitor, *args, **kwargs): return visitor.visit_handle(self, *args, **kwargs) @@ -251,11 +124,15 @@ def ConstPointer(type): return Pointer(Const(type)) -class Enum(Concrete): +class Enum(Type): + + __vid = 0 def __init__(self, name, values): - Concrete.__init__(self, name) - self.values = values + Type.__init__(self, name) + self.vid = Enum.__vid + Enum.__vid += len(values) + self.values = list(values) def visit(self, visitor, *args, **kwargs): return visitor.visit_enum(self, *args, **kwargs) @@ -265,10 +142,10 @@ def FakeEnum(type, values): return Enum(type.expr, values) -class Bitmask(Concrete): +class Bitmask(Type): def __init__(self, type, values): - Concrete.__init__(self, type.expr) + Type.__init__(self, type.expr) self.type = type self.values = values @@ -300,10 +177,10 @@ class Blob(Type): return visitor.visit_blob(self, *args, **kwargs) -class Struct(Concrete): +class Struct(Type): def __init__(self, name, members): - Concrete.__init__(self, name) + Type.__init__(self, name) self.name = name self.members = members @@ -340,7 +217,12 @@ class Arg: class Function: + __id = 0 + def __init__(self, type, name, args, call = '', fail = None, sideeffects=True, hidden=False): + self.id = Function.__id + Function.__id += 1 + self.type = type self.name = name @@ -380,12 +262,12 @@ class Function: def StdFunction(*args, **kwargs): - kwargs.setdefault('call', 'GLAPIENTRY') + kwargs.setdefault('call', '__stdcall') return Function(*args, **kwargs) def FunctionPointer(type, name, args, **kwargs): - # XXX + # XXX: We should probably treat function pointers (callbacks or not) in a generic fashion return Opaque(name) @@ -397,9 +279,12 @@ class Interface(Type): self.base = base self.methods = [] + def visit(self, visitor, *args, **kwargs): + return visitor.visit_interface(self, *args, **kwargs) + def itermethods(self): if self.base is not None: - for method in self.stdapi.itermethods(): + for method in self.base.itermethods(): yield method for method in self.methods: yield method @@ -410,9 +295,8 @@ class Method(Function): def __init__(self, type, name, args): Function.__init__(self, type, name, args, call = '__stdcall') - - -towrap = [] + for index in range(len(self.args)): + self.args[index].index = index + 1 def WrapPointer(type): @@ -428,6 +312,7 @@ class String(Type): def visit(self, visitor, *args, **kwargs): return visitor.visit_string(self, *args, **kwargs) +# C string (i.e., zero terminated) CString = String() @@ -441,10 +326,125 @@ class Opaque(Type): return visitor.visit_opaque(self, *args, **kwargs) -def OpaquePointer(type): +def OpaquePointer(type, *args): + return Opaque(type.expr + ' *') + +def OpaqueArray(type, size): + return Opaque(type.expr + ' *') + +def OpaqueBlob(type, size): return Opaque(type.expr + ' *') +class Visitor: + + def visit(self, type, *args, **kwargs): + return type.visit(self, *args, **kwargs) + + def visit_void(self, void, *args, **kwargs): + raise NotImplementedError + + def visit_literal(self, literal, *args, **kwargs): + raise NotImplementedError + + def visit_string(self, string, *args, **kwargs): + raise NotImplementedError + + def visit_const(self, const, *args, **kwargs): + raise NotImplementedError + + def visit_struct(self, struct, *args, **kwargs): + raise NotImplementedError + + def visit_array(self, array, *args, **kwargs): + raise NotImplementedError + + def visit_blob(self, blob, *args, **kwargs): + raise NotImplementedError + + def visit_enum(self, enum, *args, **kwargs): + raise NotImplementedError + + def visit_bitmask(self, bitmask, *args, **kwargs): + raise NotImplementedError + + def visit_pointer(self, pointer, *args, **kwargs): + raise NotImplementedError + + def visit_handle(self, handle, *args, **kwargs): + raise NotImplementedError + + def visit_alias(self, alias, *args, **kwargs): + raise NotImplementedError + + def visit_opaque(self, opaque, *args, **kwargs): + raise NotImplementedError + + def visit_interface(self, interface, *args, **kwargs): + raise NotImplementedError + + +class OnceVisitor(Visitor): + + def __init__(self): + self.__visited = set() + + def visit(self, type, *args, **kwargs): + if type not in self.__visited: + self.__visited.add(type) + return type.visit(self, *args, **kwargs) + return None + + +class Rebuilder(Visitor): + + def visit_void(self, void): + return void + + def visit_literal(self, literal): + return literal + + def visit_string(self, string): + return string + + def visit_const(self, const): + return Const(const.type) + + def visit_struct(self, struct): + members = [self.visit(member) for member in struct.members] + return Struct(struct.name, members) + + def visit_array(self, array): + type = self.visit(array.type) + return Array(type, array.length) + + def visit_blob(self, blob): + type = self.visit(blob.type) + return Blob(type, blob.size) + + def visit_enum(self, enum): + return enum + + def visit_bitmask(self, bitmask): + type = self.visit(bitmask.type) + return Bitmask(type, bitmask.values) + + def visit_pointer(self, pointer): + type = self.visit(pointer.type) + return Pointer(type) + + def visit_handle(self, handle): + type = self.visit(handle.type) + return Handle(handle.name, type, range=handle.range, key=handle.key) + + def visit_alias(self, alias): + type = self.visit(alias.type) + return Alias(alias.expr, type) + + def visit_opaque(self, opaque): + return opaque + + class Collector(Visitor): '''Collect.''' @@ -500,12 +500,17 @@ class Collector(Visitor): pass def visit_interface(self, interface): - pass + if interface.base is not None: + self.visit(interface.base) + for method in interface.itermethods(): + for arg in method.args: + self.visit(arg.type) + self.visit(method.type) class API: - def __init__(self, name): + def __init__(self, name = None): self.name = name self.headers = [] self.functions = [] @@ -519,7 +524,7 @@ class API: collector.visit(function.type) for interface in self.interfaces: collector.visit(interface) - for method in interface.methods: + for method in interface.itermethods(): for arg in method.args: collector.visit(arg.type) collector.visit(method.type) @@ -538,6 +543,17 @@ class API: def add_interfaces(self, interfaces): self.interfaces.extend(interfaces) + def add_api(self, api): + self.headers.extend(api.headers) + self.add_functions(api.functions) + self.add_interfaces(api.interfaces) + + def get_function_by_name(self, name): + for function in self.functions: + if function.name == name: + return function + return None + Bool = Literal("bool", "Bool") SChar = Literal("signed char", "SInt") @@ -555,3 +571,11 @@ Double = Literal("double", "Float") SizeT = Literal("size_t", "UInt") WString = Literal("wchar_t *", "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")