]> git.cworth.org Git - apitrace/commitdiff
Make obj pointers first class citizens.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 5 Apr 2012 06:10:30 +0000 (07:10 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 5 Apr 2012 06:10:30 +0000 (07:10 +0100)
retrace.py
specs/d3d9.py
specs/stdapi.py
trace.py

index ebbbf44c77a40202f3458c9cd87425a2512e06d0..96a53b37adad90cd6c317a63d91a5bfd15184a8a 100644 (file)
@@ -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<unsigned long long, void *> _obj_map;'
+        print
+
         functions = filter(self.filterFunction, api.functions)
         for function in functions:
             self.retraceFunction(function)
index ac845b74b8e9617e8a4cc23558e015b9524f5954..ccf0fd78f926b814481af13bf51cf4db59f23888 100644 (file)
@@ -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),
index 7aa60a111f6331c33f3fad03a0ab672355cb2f6d..a885122e3d0b3eeef1b6dfaa128b94bf571983a3 100644 (file)
@@ -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)
 
index 4f39129add7c782a754f226f81dd5a6d1db82d39..7350d932421e6572b1c4caae15fca059d408d7fb 100644 (file)
--- 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