+++ /dev/null
-\r
-/* Wrap void* pointers to be passed between C modules */\r
-\r
-#include "Python.h"\r
-\r
-\r
-/* Declarations for objects of type PyCObject */\r
-\r
-typedef void (*destructor1)(void *);\r
-typedef void (*destructor2)(void *, void*);\r
-\r
-static int cobject_deprecation_warning(void)\r
-{\r
- return PyErr_WarnPy3k("CObject type is not supported in 3.x. "\r
- "Please use capsule objects instead.", 1);\r
-}\r
-\r
-\r
-PyObject *\r
-PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *))\r
-{\r
- PyCObject *self;\r
-\r
- if (cobject_deprecation_warning()) {\r
- return NULL;\r
- }\r
-\r
- self = PyObject_NEW(PyCObject, &PyCObject_Type);\r
- if (self == NULL)\r
- return NULL;\r
- self->cobject=cobj;\r
- self->destructor=destr;\r
- self->desc=NULL;\r
-\r
- return (PyObject *)self;\r
-}\r
-\r
-PyObject *\r
-PyCObject_FromVoidPtrAndDesc(void *cobj, void *desc,\r
- void (*destr)(void *, void *))\r
-{\r
- PyCObject *self;\r
-\r
- if (cobject_deprecation_warning()) {\r
- return NULL;\r
- }\r
-\r
- if (!desc) {\r
- PyErr_SetString(PyExc_TypeError,\r
- "PyCObject_FromVoidPtrAndDesc called with null"\r
- " description");\r
- return NULL;\r
- }\r
- self = PyObject_NEW(PyCObject, &PyCObject_Type);\r
- if (self == NULL)\r
- return NULL;\r
- self->cobject = cobj;\r
- self->destructor = (destructor1)destr;\r
- self->desc = desc;\r
-\r
- return (PyObject *)self;\r
-}\r
-\r
-void *\r
-PyCObject_AsVoidPtr(PyObject *self)\r
-{\r
- if (self) {\r
- if (PyCapsule_CheckExact(self)) {\r
- const char *name = PyCapsule_GetName(self);\r
- return (void *)PyCapsule_GetPointer(self, name);\r
- }\r
- if (self->ob_type == &PyCObject_Type)\r
- return ((PyCObject *)self)->cobject;\r
- PyErr_SetString(PyExc_TypeError,\r
- "PyCObject_AsVoidPtr with non-C-object");\r
- }\r
- if (!PyErr_Occurred())\r
- PyErr_SetString(PyExc_TypeError,\r
- "PyCObject_AsVoidPtr called with null pointer");\r
- return NULL;\r
-}\r
-\r
-void *\r
-PyCObject_GetDesc(PyObject *self)\r
-{\r
- if (self) {\r
- if (self->ob_type == &PyCObject_Type)\r
- return ((PyCObject *)self)->desc;\r
- PyErr_SetString(PyExc_TypeError,\r
- "PyCObject_GetDesc with non-C-object");\r
- }\r
- if (!PyErr_Occurred())\r
- PyErr_SetString(PyExc_TypeError,\r
- "PyCObject_GetDesc called with null pointer");\r
- return NULL;\r
-}\r
-\r
-void *\r
-PyCObject_Import(char *module_name, char *name)\r
-{\r
- PyObject *m, *c;\r
- void *r = NULL;\r
-\r
- if ((m = PyImport_ImportModule(module_name))) {\r
- if ((c = PyObject_GetAttrString(m,name))) {\r
- r = PyCObject_AsVoidPtr(c);\r
- Py_DECREF(c);\r
- }\r
- Py_DECREF(m);\r
- }\r
- return r;\r
-}\r
-\r
-int\r
-PyCObject_SetVoidPtr(PyObject *self, void *cobj)\r
-{\r
- PyCObject* cself = (PyCObject*)self;\r
- if (cself == NULL || !PyCObject_Check(cself) ||\r
- cself->destructor != NULL) {\r
- PyErr_SetString(PyExc_TypeError, \r
- "Invalid call to PyCObject_SetVoidPtr");\r
- return 0;\r
- }\r
- cself->cobject = cobj;\r
- return 1;\r
-}\r
-\r
-static void\r
-PyCObject_dealloc(PyCObject *self)\r
-{\r
- if (self->destructor) {\r
- if(self->desc)\r
- ((destructor2)(self->destructor))(self->cobject, self->desc);\r
- else\r
- (self->destructor)(self->cobject);\r
- }\r
- PyObject_DEL(self);\r
-}\r
-\r
-\r
-PyDoc_STRVAR(PyCObject_Type__doc__,\r
-"C objects to be exported from one extension module to another\n\\r
-\n\\r
-C objects are used for communication between extension modules. They\n\\r
-provide a way for an extension module to export a C interface to other\n\\r
-extension modules, so that extension modules can use the Python import\n\\r
-mechanism to link to one another.");\r
-\r
-PyTypeObject PyCObject_Type = {\r
- PyVarObject_HEAD_INIT(&PyType_Type, 0)\r
- "PyCObject", /*tp_name*/\r
- sizeof(PyCObject), /*tp_basicsize*/\r
- 0, /*tp_itemsize*/\r
- /* methods */\r
- (destructor)PyCObject_dealloc, /*tp_dealloc*/\r
- 0, /*tp_print*/\r
- 0, /*tp_getattr*/\r
- 0, /*tp_setattr*/\r
- 0, /*tp_compare*/\r
- 0, /*tp_repr*/\r
- 0, /*tp_as_number*/\r
- 0, /*tp_as_sequence*/\r
- 0, /*tp_as_mapping*/\r
- 0, /*tp_hash*/\r
- 0, /*tp_call*/\r
- 0, /*tp_str*/\r
- 0, /*tp_getattro*/\r
- 0, /*tp_setattro*/\r
- 0, /*tp_as_buffer*/\r
- 0, /*tp_flags*/\r
- PyCObject_Type__doc__ /*tp_doc*/\r
-};\r