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)
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:
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;'
try:
self.regiterSwizzledValue(function.type, lvalue, rvalue)
except NotImplementedError:
+ raise
print ' // XXX: result'
def failFunction(self, function):
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)
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),
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)
def visitIntPointer(self, pointer, *args, **kwargs):
raise NotImplementedError
+ def visitObjPointer(self, pointer, *args, **kwargs):
+ raise NotImplementedError
+
def visitLinearPointer(self, pointer, *args, **kwargs):
raise NotImplementedError
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)
def visitIntPointer(self, pointer):
pass
+ def visitObjPointer(self, pointer):
+ self.visit(pointer.type)
+
def visitLinearPointer(self, pointer):
self.visit(pointer.type)
def visitIntPointer(self, pointer):
pass
+ def visitObjPointer(self, pointer):
+ self.visit(pointer.type)
+
def visitLinearPointer(self, pointer):
self.visit(pointer.type)
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
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