 Merged revisions 56467-56482 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
................
r56477 | martin.v.loewis | 2007-07-21 09:04:38 +0200 (Sa, 21 Jul 2007) | 11 lines
Merged revisions 56466-56476 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r56476 | martin.v.loewis | 2007-07-21 08:55:02 +0200 (Sa, 21 Jul 2007) | 4 lines
PEP 3123: Provide forward compatibility with Python 3.0, while keeping
backwards compatibility. Add Py_Refcnt, Py_Type, Py_Size, and
PyVarObject_HEAD_INIT.
........
................
r56478 | martin.v.loewis | 2007-07-21 09:47:23 +0200 (Sa, 21 Jul 2007) | 2 lines
PEP 3123: Use proper C inheritance for PyObject.
................
r56479 | martin.v.loewis | 2007-07-21 10:06:55 +0200 (Sa, 21 Jul 2007) | 3 lines
Add longintrepr.h to Python.h, so that the compiler can
see that PyFalse is really some kind of PyObject*.
................
r56480 | martin.v.loewis | 2007-07-21 10:47:18 +0200 (Sa, 21 Jul 2007) | 2 lines
Qualify SHIFT, MASK, BASE.
................
r56482 | martin.v.loewis | 2007-07-21 19:10:57 +0200 (Sa, 21 Jul 2007) | 2 lines
Correctly refer to _ob_next.
................
19 years ago |
|
/* Wrap void* pointers to be passed between C modules */
#include "Python.h"
/* Declarations for objects of type PyCObject */
typedef void (*destructor1)(void *);typedef void (*destructor2)(void *, void*);
static int deprecation_exception(void){ return PyErr_WarnEx(PyExc_PendingDeprecationWarning, "The CObject API is deprecated as of Python 3.1. " "Please convert to using the Capsule API.", 1);}
PyObject *PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *)){ PyCObject *self;
if (deprecation_exception()) { return NULL; }
self = PyObject_NEW(PyCObject, &PyCObject_Type); if (self == NULL) return NULL; self->cobject=cobj; self->destructor=destr; self->desc=NULL;
return (PyObject *)self;}
PyObject *PyCObject_FromVoidPtrAndDesc(void *cobj, void *desc, void (*destr)(void *, void *)){ PyCObject *self;
if (deprecation_exception()) { return NULL; }
if (!desc) { PyErr_SetString(PyExc_TypeError, "PyCObject_FromVoidPtrAndDesc called with null" " description"); return NULL; } self = PyObject_NEW(PyCObject, &PyCObject_Type); if (self == NULL) return NULL; self->cobject = cobj; self->destructor = (destructor1)destr; self->desc = desc;
return (PyObject *)self;}
void *PyCObject_AsVoidPtr(PyObject *self){ if (self) { if (self->ob_type == &PyCObject_Type) return ((PyCObject *)self)->cobject; PyErr_SetString(PyExc_TypeError, "PyCObject_AsVoidPtr with non-C-object"); } if (!PyErr_Occurred()) PyErr_SetString(PyExc_TypeError, "PyCObject_AsVoidPtr called with null pointer"); return NULL;}
void *PyCObject_GetDesc(PyObject *self){ if (self) { if (self->ob_type == &PyCObject_Type) return ((PyCObject *)self)->desc; PyErr_SetString(PyExc_TypeError, "PyCObject_GetDesc with non-C-object"); } if (!PyErr_Occurred()) PyErr_SetString(PyExc_TypeError, "PyCObject_GetDesc called with null pointer"); return NULL;}
void *PyCObject_Import(char *module_name, char *name){ PyObject *m, *c; void *r = NULL;
if ((m = PyImport_ImportModule(module_name))) { if ((c = PyObject_GetAttrString(m,name))) { r = PyCObject_AsVoidPtr(c); Py_DECREF(c); } Py_DECREF(m); } return r;}
intPyCObject_SetVoidPtr(PyObject *self, void *cobj){ PyCObject* cself = (PyCObject*)self; if (cself == NULL || !PyCObject_Check(cself) || cself->destructor != NULL) { PyErr_SetString(PyExc_TypeError, "Invalid call to PyCObject_SetVoidPtr"); return 0; } cself->cobject = cobj; return 1;}
static voidPyCObject_dealloc(PyCObject *self){ if (self->destructor) { if(self->desc) ((destructor2)(self->destructor))(self->cobject, self->desc); else (self->destructor)(self->cobject); } PyObject_DEL(self);}
PyDoc_STRVAR(PyCObject_Type__doc__,"C objects to be exported from one extension module to another\n\
\n\C objects are used for communication between extension modules. They\n\provide a way for an extension module to export a C interface to other\n\extension modules, so that extension modules can use the Python import\n\mechanism to link to one another.");
PyTypeObject PyCObject_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "PyCObject", /*tp_name*/ sizeof(PyCObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ (destructor)PyCObject_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_reserved*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ 0, /*tp_flags*/ PyCObject_Type__doc__ /*tp_doc*/};
|