From: José Fonseca Date: Thu, 5 Apr 2012 06:10:30 +0000 (+0100) Subject: Make obj pointers first class citizens. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=fbcf683ea1396da28ec31eeeec24dc64d197ab76;p=apitrace Make obj pointers first class citizens. --- diff --git a/retrace.py b/retrace.py index ebbbf44..96a53b3 100644 --- a/retrace.py +++ b/retrace.py @@ -120,6 +120,9 @@ class ValueDeserializer(stdapi.Visitor): def visitIntPointer(self, pointer, lvalue, rvalue): print ' %s = static_cast<%s>((%s).toPointer());' % (lvalue, pointer, rvalue) + def visitObjPointer(self, pointer, lvalue, rvalue): + print ' %s = static_cast<%s>((%s).toPointer());' % (lvalue, pointer, rvalue) + def visitLinearPointer(self, pointer, lvalue, rvalue): print ' %s = static_cast<%s>(retrace::toPointer(%s));' % (lvalue, pointer, rvalue) @@ -204,6 +207,9 @@ class SwizzledValueRegistrator(stdapi.Visitor): def visitIntPointer(self, pointer, lvalue, rvalue): pass + def visitObjPointer(self, pointer, lvalue, rvalue): + print r' _obj_map[(%s).toUIntPtr()] = %s;' % (rvalue, lvalue) + def visitLinearPointer(self, pointer, lvalue, rvalue): assert pointer.size is not None if pointer.size is not None: @@ -281,7 +287,7 @@ class Retracer: def deserializeThisPointer(self, interface): print ' %s *_this;' % (interface.name,) - # FIXME + print ' _this = static_cast<%s *>(_obj_map[call.arg(0).toUIntPtr()]);' % (interface.name,) def deserializeArgs(self, function): print ' retrace::ScopedAllocator _allocator;' @@ -322,6 +328,7 @@ class Retracer: try: self.regiterSwizzledValue(function.type, lvalue, rvalue) except NotImplementedError: + raise print ' // XXX: result' def failFunction(self, function): @@ -383,6 +390,9 @@ class Retracer: handle_names.add(handle.name) print + print 'static std::map _obj_map;' + print + functions = filter(self.filterFunction, api.functions) for function in functions: self.retraceFunction(function) diff --git a/specs/d3d9.py b/specs/d3d9.py index ac845b7..ccf0fd7 100644 --- a/specs/d3d9.py +++ b/specs/d3d9.py @@ -132,26 +132,26 @@ IDirect3D9Ex = Interface("IDirect3D9Ex", IDirect3D9) IDirect3DDevice9Ex = Interface("IDirect3DDevice9Ex", IDirect3DDevice9) IDirect3DSwapChain9Ex = Interface("IDirect3DSwapChain9Ex", IDirect3DSwapChain9) -PDIRECT3D9 = Pointer(IDirect3D9) -PDIRECT3DDEVICE9 = Pointer(IDirect3DDevice9) -PDIRECT3DSTATEBLOCK9 = Pointer(IDirect3DStateBlock9) -PDIRECT3DSWAPCHAIN9 = Pointer(IDirect3DSwapChain9) -PDIRECT3DRESOURCE9 = Pointer(IDirect3DResource9) -PDIRECT3DVERTEXDECLARATION9 = Pointer(IDirect3DVertexDeclaration9) -PDIRECT3DVERTEXSHADER9 = Pointer(IDirect3DVertexShader9) -PDIRECT3DPIXELSHADER9 = Pointer(IDirect3DPixelShader9) -PDIRECT3DBASETEXTURE9 = Pointer(IDirect3DBaseTexture9) -PDIRECT3DTEXTURE9 = Pointer(IDirect3DTexture9) -PDIRECT3DVOLUMETEXTURE9 = Pointer(IDirect3DVolumeTexture9) -PDIRECT3DCUBETEXTURE9 = Pointer(IDirect3DCubeTexture9) -PDIRECT3DVERTEXBUFFER9 = Pointer(IDirect3DVertexBuffer9) -PDIRECT3DINDEXBUFFER9 = Pointer(IDirect3DIndexBuffer9) -PDIRECT3DSURFACE9 = Pointer(IDirect3DSurface9) -PDIRECT3DVOLUME9 = Pointer(IDirect3DVolume9) -PDIRECT3DQUERY9 = Pointer(IDirect3DQuery9) -PDIRECT3D9EX = Pointer(IDirect3D9Ex) -PDIRECT3DDEVICE9EX = Pointer(IDirect3DDevice9Ex) -PDIRECT3DSWAPCHAIN9EX = Pointer(IDirect3DSwapChain9Ex) +PDIRECT3D9 = ObjPointer(IDirect3D9) +PDIRECT3DDEVICE9 = ObjPointer(IDirect3DDevice9) +PDIRECT3DSTATEBLOCK9 = ObjPointer(IDirect3DStateBlock9) +PDIRECT3DSWAPCHAIN9 = ObjPointer(IDirect3DSwapChain9) +PDIRECT3DRESOURCE9 = ObjPointer(IDirect3DResource9) +PDIRECT3DVERTEXDECLARATION9 = ObjPointer(IDirect3DVertexDeclaration9) +PDIRECT3DVERTEXSHADER9 = ObjPointer(IDirect3DVertexShader9) +PDIRECT3DPIXELSHADER9 = ObjPointer(IDirect3DPixelShader9) +PDIRECT3DBASETEXTURE9 = ObjPointer(IDirect3DBaseTexture9) +PDIRECT3DTEXTURE9 = ObjPointer(IDirect3DTexture9) +PDIRECT3DVOLUMETEXTURE9 = ObjPointer(IDirect3DVolumeTexture9) +PDIRECT3DCUBETEXTURE9 = ObjPointer(IDirect3DCubeTexture9) +PDIRECT3DVERTEXBUFFER9 = ObjPointer(IDirect3DVertexBuffer9) +PDIRECT3DINDEXBUFFER9 = ObjPointer(IDirect3DIndexBuffer9) +PDIRECT3DSURFACE9 = ObjPointer(IDirect3DSurface9) +PDIRECT3DVOLUME9 = ObjPointer(IDirect3DVolume9) +PDIRECT3DQUERY9 = ObjPointer(IDirect3DQuery9) +PDIRECT3D9EX = ObjPointer(IDirect3D9Ex) +PDIRECT3DDEVICE9EX = ObjPointer(IDirect3DDevice9Ex) +PDIRECT3DSWAPCHAIN9EX = ObjPointer(IDirect3DSwapChain9Ex) IDirect3D9.methods += [ Method(HRESULT, "RegisterSoftwareDevice", [(OpaquePointer(Void), "pInitializeFunction")], sideeffects=False), diff --git a/specs/stdapi.py b/specs/stdapi.py index 7aa60a1..a885122 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -134,8 +134,19 @@ class IntPointer(Type): return visitor.visitIntPointer(self, *args, **kwargs) +class ObjPointer(Type): + '''Pointer to an object.''' + + def __init__(self, type): + Type.__init__(self, type.expr + " *", 'P' + type.tag) + self.type = type + + def visit(self, visitor, *args, **kwargs): + return visitor.visitObjPointer(self, *args, **kwargs) + + class LinearPointer(Type): - '''Integer encoded as a pointer.''' + '''Pointer to a linear range of memory.''' def __init__(self, type, size = None): Type.__init__(self, type.expr + " *", 'P' + type.tag) @@ -483,6 +494,9 @@ class Visitor: def visitIntPointer(self, pointer, *args, **kwargs): raise NotImplementedError + def visitObjPointer(self, pointer, *args, **kwargs): + raise NotImplementedError + def visitLinearPointer(self, pointer, *args, **kwargs): raise NotImplementedError @@ -563,6 +577,10 @@ class Rebuilder(Visitor): def visitIntPointer(self, pointer): return pointer + def visitObjPointer(self, pointer): + type = self.visit(pointer.type) + return ObjPointer(type) + def visitLinearPointer(self, pointer): type = self.visit(pointer.type) return LinearPointer(type, pointer.size) @@ -640,6 +658,9 @@ class Collector(Visitor): def visitIntPointer(self, pointer): pass + def visitObjPointer(self, pointer): + self.visit(pointer.type) + def visitLinearPointer(self, pointer): self.visit(pointer.type) diff --git a/trace.py b/trace.py index 4f39129..7350d93 100644 --- a/trace.py +++ b/trace.py @@ -108,6 +108,9 @@ class ComplexValueSerializer(stdapi.OnceVisitor): def visitIntPointer(self, pointer): pass + def visitObjPointer(self, pointer): + self.visit(pointer.type) + def visitLinearPointer(self, pointer): self.visit(pointer.type) @@ -211,6 +214,9 @@ class ValueSerializer(stdapi.Visitor): def visitIntPointer(self, pointer, instance): print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + def visitObjPointer(self, pointer, instance): + print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + def visitLinearPointer(self, pointer, instance): print ' trace::localWriter.writeOpaque((const void *)%s);' % instance @@ -277,6 +283,11 @@ class ValueWrapper(stdapi.Visitor): def visitIntPointer(self, pointer, instance): pass + def visitObjPointer(self, pointer, instance): + print " if (%s) {" % instance + self.visit(pointer.type, "*" + instance) + print " }" + def visitLinearPointer(self, pointer, instance): pass