[pywin32-checkins] pywin32/com/win32com/src univgw.cpp,1.14,1.15
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: Mark H. <mha...@us...> - 2010-11-16 04:46:52
|
Update of /cvsroot/pywin32/pywin32/com/win32com/src In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv11274 Modified Files: univgw.cpp Log Message: Use 'capsule' API instead of CObject in python 3.1 and later Index: univgw.cpp =================================================================== RCS file: /cvsroot/pywin32/pywin32/com/win32com/src/univgw.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** univgw.cpp 27 Aug 2010 07:32:02 -0000 1.14 --- univgw.cpp 16 Nov 2010 04:46:44 -0000 1.15 *************** *** 353,359 **** /* free the gw_vtbl object. also works on a partially constructed gw_vtbl. */ ! static void __cdecl free_vtbl(void * cobject) { ! gw_vtbl * vtbl = (gw_vtbl *)cobject; assert(vtbl->magic == GW_VTBL_MAGIC); Py_XDECREF(vtbl->dispatcher); --- 353,361 ---- /* free the gw_vtbl object. also works on a partially constructed gw_vtbl. */ ! static void free_vtbl(gw_vtbl * vtbl) { ! assert(vtbl); ! if (!vtbl) ! return; assert(vtbl->magic == GW_VTBL_MAGIC); Py_XDECREF(vtbl->dispatcher); *************** *** 366,369 **** --- 368,416 ---- } + #if PY_VERSION_HEX > 0x03010000 + // Use the new capsule API + const char *capsule_name = "win32com universal gateway"; + + static void __cdecl do_free_vtbl(PyObject *ob) { + free_vtbl((gw_vtbl *)PyCapsule_GetPointer(ob, capsule_name)); + } + + static PyObject *PyVTable_Create(void *vtbl) + { + return PyCapsule_New(vtbl, capsule_name, do_free_vtbl); + } + static gw_vtbl *PyVTable_Get(PyObject *ob) + { + return (gw_vtbl *)PyCapsule_GetPointer(ob, capsule_name); + } + + static bool PyVTable_Check(PyObject *ob) + { + return PyCapsule_IsValid(ob, capsule_name) != 0; + } + #else + // Use the old CObject API. + static void __cdecl do_free_vtbl(void * cobject) + { + gw_vtbl * vtbl = (gw_vtbl *)cobject; + free_vtbl(vtbl); + } + + static PyObject *PyVTable_Create(void *vtbl) + { + return PyCObject_FromVoidPtr(vtbl, do_free_vtbl); + } + + static gw_vtbl *PyVTable_Get(PyObject *ob) + { + return (gw_vtbl *)PyCObject_AsVoidPtr(ob); + } + + static bool PyVTable_Check(PyObject *ob) + { + return PyCObject_Check(ob) != 0; + } + #endif + static PyObject * univgw_CreateVTable(PyObject *self, PyObject *args) { *************** *** 493,497 **** PyObject *result; ! result = PyCObject_FromVoidPtr(vtbl, free_vtbl); if ( result == NULL ) { --- 540,544 ---- PyObject *result; ! result = PyVTable_Create(vtbl); if ( result == NULL ) { *************** *** 516,520 **** ) { ! gw_vtbl * vtbl = (gw_vtbl *)PyCObject_AsVoidPtr(obVTable); if ( vtbl->magic != GW_VTBL_MAGIC ) --- 563,569 ---- ) { ! gw_vtbl * vtbl = PyVTable_Get(obVTable); ! if (!vtbl) ! return NULL; if ( vtbl->magic != GW_VTBL_MAGIC ) *************** *** 556,560 **** // obVTable must be a CObject containing our vtbl ptr ! if ( !PyCObject_Check(obVTable) ) { PyErr_SetString(PyExc_ValueError, "argument is not a CObject/vtable"); --- 605,609 ---- // obVTable must be a CObject containing our vtbl ptr ! if ( !PyVTable_Check(obVTable) ) { PyErr_SetString(PyExc_ValueError, "argument is not a CObject/vtable"); *************** *** 615,619 **** // obVTable must be a CObject containing our vtbl ptr ! if ( !PyCObject_Check(obVTable) ) { assert(FALSE); --- 664,668 ---- // obVTable must be a CObject containing our vtbl ptr ! if ( !PyVTable_Check(obVTable) ) { assert(FALSE); *************** *** 659,663 **** // obVTable must be a CObject containing our vtbl ptr ! if ( !PyCObject_Check(obVTable) ) { PyErr_SetString(PyExc_ValueError, "argument is not a CObject/vtable"); --- 708,712 ---- // obVTable must be a CObject containing our vtbl ptr ! if ( !PyVTable_Check(obVTable) ) { PyErr_SetString(PyExc_ValueError, "argument is not a CObject/vtable"); |