From 5ac006dfd3aacd50d43b8837ca71dff4288ce3df Mon Sep 17 00:00:00 2001 From: Larry Hastings Date: Fri, 2 Apr 2010 11:01:35 +0000 Subject: Capsule-related changes: * PyCObject_AsVoidPtr() can now open capsules. This addresses most of the remaining backwards-compatibility concerns about the conversion of Python 2.7 from CObjects to capsules. * CObjects were marked Pending Deprecation. * Documentation about this pending deprecation was added to cobject.h. * The capsule source files were added to the legacy PC build processes. --- Include/cobject.h | 28 ++++++++++++++++++++++++++-- Misc/NEWS | 4 +++- Objects/cobject.c | 20 ++++++++++++++++++++ PC/VC6/pythoncore.dsp | 4 ++++ PC/os2emx/Makefile | 1 + PCbuild/pythoncore.vcproj | 8 ++++++++ 6 files changed, 62 insertions(+), 3 deletions(-) diff --git a/Include/cobject.h b/Include/cobject.h index e5e246b..ad3cd9c 100644 --- a/Include/cobject.h +++ b/Include/cobject.h @@ -1,3 +1,29 @@ +/* + CObjects are marked Pending Deprecation as of Python 2.7. + The full schedule for 2.x is as follows: + - CObjects are marked Pending Deprecation in Python 2.7. + - CObjects will be marked Deprecated in Python 2.8 + (if there is one). + - CObjects will be removed in Python 2.9 (if there is one). + + Additionally, for the Python 3.x series: + - CObjects were marked Deprecated in Python 3.1. + - CObjects will be removed in Python 3.2. + + You should switch all use of CObjects to capsules. Capsules + have a safer and more consistent API. For more information, + see Include/pycapsule.h, or read the "Capsules" topic in + the "Python/C API Reference Manual". + + Python 2.7 no longer uses CObjects itself; all objects which + were formerly CObjects are now capsules. Note that this change + does not by itself break binary compatibility with extensions + built for previous versions of Python--PyCObject_AsVoidPtr() + has been changed to also understand capsules. + +*/ + +/* original file header comment follows: */ /* C objects to be exported from one extension module to another. @@ -6,8 +32,6 @@ to other extension modules, so that extension modules can use the Python import mechanism to link to one another. - DEPRECATED - Use PyCapsule objects instead. - CObject will be removed in 2.8 (if there is one). */ #ifndef Py_COBJECT_H diff --git a/Misc/NEWS b/Misc/NEWS index 8f36109..38c7083 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -184,7 +184,9 @@ C-API is now removed (the macro was introduced in 1997!). - Issue #7992: A replacement PyCObject API, PyCapsule, has been backported - from Python 3.1. + from Python 3.1. All existing Python CObjects in the main distribution + have been converted to capsules. To address backwards-compatibility + concerns, PyCObject_AsVoidPtr() was changed to understand capsules. Tests ----- diff --git a/Objects/cobject.c b/Objects/cobject.c index c437491..72123f4 100644 --- a/Objects/cobject.c +++ b/Objects/cobject.c @@ -9,11 +9,23 @@ typedef void (*destructor1)(void *); typedef void (*destructor2)(void *, void*); +static int cobject_deprecation_warning(void) +{ + return PyErr_WarnEx(PyExc_PendingDeprecationWarning, + "The CObject type is marked Pending Deprecation in Python 2.7. " + "Please use capsule objects instead.", 1); +} + + PyObject * PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *)) { PyCObject *self; + if (cobject_deprecation_warning()) { + return NULL; + } + self = PyObject_NEW(PyCObject, &PyCObject_Type); if (self == NULL) return NULL; @@ -30,6 +42,10 @@ PyCObject_FromVoidPtrAndDesc(void *cobj, void *desc, { PyCObject *self; + if (cobject_deprecation_warning()) { + return NULL; + } + if (!desc) { PyErr_SetString(PyExc_TypeError, "PyCObject_FromVoidPtrAndDesc called with null" @@ -50,6 +66,10 @@ void * PyCObject_AsVoidPtr(PyObject *self) { if (self) { + if (PyCapsule_CheckExact(self)) { + const char *name = PyCapsule_GetName(self); + return (void *)PyCapsule_GetPointer(self, name); + } if (self->ob_type == &PyCObject_Type) return ((PyCObject *)self)->cobject; PyErr_SetString(PyExc_TypeError, diff --git a/PC/VC6/pythoncore.dsp b/PC/VC6/pythoncore.dsp index 28ff8c8..9373298 100644 --- a/PC/VC6/pythoncore.dsp +++ b/PC/VC6/pythoncore.dsp @@ -257,6 +257,10 @@ SOURCE=..\..\Objects\bytes_methods.c # End Source File # Begin Source File +SOURCE=..\..\Objects\capsule.c +# End Source File +# Begin Source File + SOURCE=..\..\Objects\cellobject.c # End Source File # Begin Source File diff --git a/PC/os2emx/Makefile b/PC/os2emx/Makefile index 09ed1a7..bf2e486 100644 --- a/PC/os2emx/Makefile +++ b/PC/os2emx/Makefile @@ -384,6 +384,7 @@ SRC.OBJECT= $(addprefix $(TOP), \ Objects/bytes_methods.c \ Objects/cellobject.c \ Objects/classobject.c \ + Objects/capsule.c \ Objects/cobject.c \ Objects/codeobject.c \ Objects/complexobject.c \ diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj index ac3dc26..02ed0b1 100644 --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -855,6 +855,10 @@ > + + @@ -1423,6 +1427,10 @@ > + + -- cgit v0.12