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.
This commit is contained in:
Larry Hastings 2010-04-02 11:01:35 +00:00
parent f3eeca16cb
commit 5ac006dfd3
6 changed files with 62 additions and 3 deletions

View file

@ -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. /* 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 to other extension modules, so that extension modules can use the
Python import mechanism to link to one another. 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 #ifndef Py_COBJECT_H

View file

@ -184,7 +184,9 @@ C-API
is now removed (the macro was introduced in 1997!). is now removed (the macro was introduced in 1997!).
- Issue #7992: A replacement PyCObject API, PyCapsule, has been backported - 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 Tests
----- -----

View file

@ -9,11 +9,23 @@
typedef void (*destructor1)(void *); typedef void (*destructor1)(void *);
typedef void (*destructor2)(void *, 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 * PyObject *
PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *)) PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *))
{ {
PyCObject *self; PyCObject *self;
if (cobject_deprecation_warning()) {
return NULL;
}
self = PyObject_NEW(PyCObject, &PyCObject_Type); self = PyObject_NEW(PyCObject, &PyCObject_Type);
if (self == NULL) if (self == NULL)
return NULL; return NULL;
@ -30,6 +42,10 @@ PyCObject_FromVoidPtrAndDesc(void *cobj, void *desc,
{ {
PyCObject *self; PyCObject *self;
if (cobject_deprecation_warning()) {
return NULL;
}
if (!desc) { if (!desc) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"PyCObject_FromVoidPtrAndDesc called with null" "PyCObject_FromVoidPtrAndDesc called with null"
@ -50,6 +66,10 @@ void *
PyCObject_AsVoidPtr(PyObject *self) PyCObject_AsVoidPtr(PyObject *self)
{ {
if (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) if (self->ob_type == &PyCObject_Type)
return ((PyCObject *)self)->cobject; return ((PyCObject *)self)->cobject;
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,

View file

@ -257,6 +257,10 @@ SOURCE=..\..\Objects\bytes_methods.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\Objects\capsule.c
# End Source File
# Begin Source File
SOURCE=..\..\Objects\cellobject.c SOURCE=..\..\Objects\cellobject.c
# End Source File # End Source File
# Begin Source File # Begin Source File

View file

@ -384,6 +384,7 @@ SRC.OBJECT= $(addprefix $(TOP), \
Objects/bytes_methods.c \ Objects/bytes_methods.c \
Objects/cellobject.c \ Objects/cellobject.c \
Objects/classobject.c \ Objects/classobject.c \
Objects/capsule.c \
Objects/cobject.c \ Objects/cobject.c \
Objects/codeobject.c \ Objects/codeobject.c \
Objects/complexobject.c \ Objects/complexobject.c \

View file

@ -854,6 +854,10 @@
RelativePath="..\Include\pyarena.h" RelativePath="..\Include\pyarena.h"
> >
</File> </File>
<File
RelativePath="..\Include\pycapsule.h"
>
</File>
<File <File
RelativePath="..\Include\pyctype.h" RelativePath="..\Include\pyctype.h"
> >
@ -1422,6 +1426,10 @@
RelativePath="..\Objects\stringobject.c" RelativePath="..\Objects\stringobject.c"
> >
</File> </File>
<File
RelativePath="..\Objects\capsule.c"
>
</File>
<File <File
RelativePath="..\Objects\cellobject.c" RelativePath="..\Objects\cellobject.c"
> >