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");
|