Commit 5ac006df authored by Larry Hastings's avatar Larry Hastings

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.
parent f3eeca16
/*
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 @@ ...@@ -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
......
...@@ -184,7 +184,9 @@ C-API ...@@ -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
----- -----
......
...@@ -9,11 +9,23 @@ ...@@ -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, ...@@ -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 * ...@@ -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,
......
...@@ -257,6 +257,10 @@ SOURCE=..\..\Objects\bytes_methods.c ...@@ -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
......
...@@ -384,6 +384,7 @@ SRC.OBJECT= $(addprefix $(TOP), \ ...@@ -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 \
......
...@@ -854,6 +854,10 @@ ...@@ -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 @@ ...@@ -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"
> >
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment