summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2010-05-03 07:50:02 +0000
committerCharles Harris <charlesr.harris@gmail.com>2010-05-03 07:50:02 +0000
commitbc656ee7cb00a6c4ad0d43f1cdd36bf8c9a026ed (patch)
tree43db63bf9d9ad272bb252705de933c8a9ad3940c
parent82d8d97ac30e20f9ae605df228bee43d89ef72a2 (diff)
downloadnumpy-bc656ee7cb00a6c4ad0d43f1cdd36bf8c9a026ed.tar.gz
ENH, BUG: PyCObject will be deprecated in python 2.7. So use the NpyCapsule
compatibility functions in npy_3kcompat.h to replace the current calls. This gets rid of a number of version checks and is easier to maintain. Fix bug that was present in the ufunc _loop1d_list_free destructor in the python3k case.
-rw-r--r--numpy/core/code_generators/generate_numpy_api.py2
-rw-r--r--numpy/core/code_generators/generate_ufunc_api.py2
-rw-r--r--numpy/core/include/numpy/ndarrayobject.h14
-rw-r--r--numpy/core/src/multiarray/arraytypes.c.src9
-rw-r--r--numpy/core/src/multiarray/common.c15
-rw-r--r--numpy/core/src/multiarray/convert_datatype.c8
-rw-r--r--numpy/core/src/multiarray/ctors.c41
-rw-r--r--numpy/core/src/multiarray/descriptor.c27
-rw-r--r--numpy/core/src/multiarray/getset.c14
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c33
-rw-r--r--numpy/core/src/multiarray/scalarapi.c18
-rw-r--r--numpy/core/src/multiarray/scalartypes.c.src15
-rw-r--r--numpy/core/src/multiarray/scalartypes.h2
-rw-r--r--numpy/core/src/multiarray/usertypes.c9
-rw-r--r--numpy/core/src/private/npy_3kcompat.h2
-rw-r--r--numpy/core/src/umath/ufunc_object.c71
-rw-r--r--numpy/core/src/umath/umathmodule.c.src9
-rw-r--r--numpy/f2py/src/fortranobject.c8
-rw-r--r--numpy/f2py/src/fortranobject.h4
-rw-r--r--numpy/lib/type_check.py2
-rw-r--r--numpy/numarray/_capi.c2
-rw-r--r--numpy/numarray/include/numpy/libnumarray.h2
-rw-r--r--numpy/random/mtrand/Python.pxi3
23 files changed, 71 insertions, 241 deletions
diff --git a/numpy/core/code_generators/generate_numpy_api.py b/numpy/core/code_generators/generate_numpy_api.py
index 9c1a3ec9a..2997647ac 100644
--- a/numpy/core/code_generators/generate_numpy_api.py
+++ b/numpy/core/code_generators/generate_numpy_api.py
@@ -64,7 +64,7 @@ _import_array(void)
}
Py_DECREF(numpy);
-#if PY_VERSION_HEX >= 0x03010000
+#if PY_VERSION_HEX >= 0x02070000
if (!PyCapsule_CheckExact(c_api)) {
PyErr_SetString(PyExc_RuntimeError, "_ARRAY_API is not PyCapsule object");
Py_DECREF(c_api);
diff --git a/numpy/core/code_generators/generate_ufunc_api.py b/numpy/core/code_generators/generate_ufunc_api.py
index 65dd72180..2af2030c6 100644
--- a/numpy/core/code_generators/generate_ufunc_api.py
+++ b/numpy/core/code_generators/generate_ufunc_api.py
@@ -53,7 +53,7 @@ _import_umath(void)
}
Py_DECREF(numpy);
-#if PY_VERSION_HEX >= 0x03010000
+#if PY_VERSION_HEX >= 0x02070000
if (!PyCapsule_CheckExact(c_api)) {
PyErr_SetString(PyExc_RuntimeError, "_UFUNC_API is not PyCapsule object");
Py_DECREF(c_api);
diff --git a/numpy/core/include/numpy/ndarrayobject.h b/numpy/core/include/numpy/ndarrayobject.h
index 204306333..421a4515f 100644
--- a/numpy/core/include/numpy/ndarrayobject.h
+++ b/numpy/core/include/numpy/ndarrayobject.h
@@ -598,8 +598,18 @@ typedef struct {
int sec, us, ps, as;
} npy_timedeltastruct;
-
-#define PyDataType_GetDatetimeMetaData(descr) ((descr->metadata == NULL) ? NULL : ((PyArray_DatetimeMetaData *)(PyCObject_AsVoidPtr(PyDict_GetItemString(descr->metadata, NPY_METADATA_DTSTR)))))
+#if PY_VERSION_HEX >= 0x02070000
+#define PyDataType_GetDatetimeMetaData(descr) \
+ ((descr->metadata == NULL) ? NULL : \
+ ((PyArray_DatetimeMetaData *)(PyCapsule_GetPointer( \
+ PyDict_GetItemString( \
+ descr->metadata, NPY_METADATA_DTSTR), NULL))))
+#else
+#define PyDataType_GetDatetimeMetaData(descr) \
+ ((descr->metadata == NULL) ? NULL : \
+ ((PyArray_DatetimeMetaData *)(PyCObject_AsVoidPtr( \
+ PyDict_GetItemString(descr->metadata, NPY_METADATA_DTSTR)))))
+#endif
typedef int (PyArray_FinalizeFunc)(PyArrayObject *, PyObject *);
diff --git a/numpy/core/src/multiarray/arraytypes.c.src b/numpy/core/src/multiarray/arraytypes.c.src
index 812cf88b9..40ed09da1 100644
--- a/numpy/core/src/multiarray/arraytypes.c.src
+++ b/numpy/core/src/multiarray/arraytypes.c.src
@@ -3537,14 +3537,7 @@ _init_datetime_descr(PyArray_Descr *descr)
* There is no error check here and no way to indicate an error
* until the metadata turns up NULL.
*/
-#if defined(NPY_PY3K)
- cobj = PyCapsule_New((void *)dt_data, NULL, simple_capsule_dtor);
- if (cobj == NULL) {
- PyErr_Clear();
- }
-#else
- cobj = PyCObject_FromVoidPtr((void *)dt_data, simple_capsule_dtor);
-#endif
+ cobj = NpyCapsule_FromVoidPtr((void *)dt_data, simple_capsule_dtor);
descr->metadata = PyDict_New();
PyDict_SetItemString(descr->metadata, NPY_METADATA_DTSTR, cobj);
Py_DECREF(cobj);
diff --git a/numpy/core/src/multiarray/common.c b/numpy/core/src/multiarray/common.c
index 1f5f98af9..ca3409e7b 100644
--- a/numpy/core/src/multiarray/common.c
+++ b/numpy/core/src/multiarray/common.c
@@ -258,25 +258,14 @@ _array_find_type(PyObject *op, PyArray_Descr *minitype, int max)
PyArrayInterface *inter;
char buf[40];
-#if defined(NPY_PY3K)
- if (PyCapsule_CheckExact(ip)) {
- inter = (PyArrayInterface *)PyCapsule_GetPointer(ip, NULL);
+ if (NpyCapsule_Check(ip)) {
+ inter = (PyArrayInterface *)NpyCapsule_AsVoidPtr(ip);
if (inter->two == 2) {
PyOS_snprintf(buf, sizeof(buf),
"|%c%d", inter->typekind, inter->itemsize);
chktype = _array_typedescr_fromstr(buf);
}
}
-#else
- if (PyCObject_Check(ip)) {
- inter = (PyArrayInterface *)PyCObject_AsVoidPtr(ip);
- if (inter->two == 2) {
- PyOS_snprintf(buf, sizeof(buf),
- "|%c%d", inter->typekind, inter->itemsize);
- chktype = _array_typedescr_fromstr(buf);
- }
- }
-#endif
Py_DECREF(ip);
if (chktype) {
goto finish;
diff --git a/numpy/core/src/multiarray/convert_datatype.c b/numpy/core/src/multiarray/convert_datatype.c
index 896c5e573..ea43a4233 100644
--- a/numpy/core/src/multiarray/convert_datatype.c
+++ b/numpy/core/src/multiarray/convert_datatype.c
@@ -102,15 +102,9 @@ PyArray_GetCastFunc(PyArray_Descr *descr, int type_num)
key = PyInt_FromLong(type_num);
cobj = PyDict_GetItem(obj, key);
Py_DECREF(key);
-#if defined(NPY_PY3K)
- if (PyCapsule_CheckExact(cobj)) {
- castfunc = PyCapsule_GetPointer(cobj, NULL);
- }
-#else
- if (PyCObject_Check(cobj)) {
+ if (NpyCapsule_Check(cobj)) {
castfunc = PyCObject_AsVoidPtr(cobj);
}
-#endif
}
}
if (PyTypeNum_ISCOMPLEX(descr->type_num) &&
diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors.c
index c4a1740ad..30399c754 100644
--- a/numpy/core/src/multiarray/ctors.c
+++ b/numpy/core/src/multiarray/ctors.c
@@ -1140,18 +1140,9 @@ discover_depth(PyObject *s, int max, int stop_at_string, int stop_at_tuple)
#endif
if ((e = PyObject_GetAttrString(s, "__array_struct__")) != NULL) {
d = -1;
-#if defined(NPY_PY3K)
- if (PyCapsule_CheckExact(e)) {
- PyArrayInterface *inter;
- inter = (PyArrayInterface *)PyCapsule_GetPointer(e, NULL);
- if (inter == NULL) {
- PyErr_Clear();
- }
-#else
- if (PyCObject_Check(e)) {
+ if (NpyCapsule_Check(e)) {
PyArrayInterface *inter;
- inter = (PyArrayInterface *)PyCObject_AsVoidPtr(e);
-#endif
+ inter = (PyArrayInterface *)NpyCapsule_AsVoidPtr(e);
if (inter->two == 2) {
d = inter->nd;
}
@@ -1574,20 +1565,10 @@ PyArray_NewFromDescr(PyTypeObject *subtype, PyArray_Descr *descr, int nd,
*/
PyArray_UpdateFlags(self, UPDATE_ALL);
}
-#if defined(NPY_PY3K)
- if PyCapsule_CheckExact(func) {
- /* A C-function is stored here */
- PyArray_FinalizeFunc *cfunc;
- cfunc = PyCapsule_GetPointer(func, NULL);
- if (cfunc == NULL) {
- PyErr_Clear();
- }
-#else
- if PyCObject_Check(func) {
+ if (NpyCapsule_Check(func)) {
/* A C-function is stored here */
PyArray_FinalizeFunc *cfunc;
- cfunc = PyCObject_AsVoidPtr(func);
-#endif
+ cfunc = NpyCapsule_AsVoidPtr(func);
Py_DECREF(func);
if (cfunc(self, obj) < 0) {
goto fail;
@@ -2129,20 +2110,10 @@ PyArray_FromStructInterface(PyObject *input)
PyErr_Clear();
return Py_NotImplemented;
}
-#if defined(NPY_PY3K)
- if (!PyCapsule_CheckExact(attr)) {
- goto fail;
- }
- inter = PyCapsule_GetPointer(attr, NULL);
- if (inter == NULL) {
- PyErr_Clear();
- }
-#else
- if (!PyCObject_Check(attr)) {
+ if (!NpyCapsule_Check(attr)) {
goto fail;
}
- inter = PyCObject_AsVoidPtr(attr);
-#endif
+ inter = NpyCapsule_AsVoidPtr(attr);
if (inter->two != 2) {
goto fail;
}
diff --git a/numpy/core/src/multiarray/descriptor.c b/numpy/core/src/multiarray/descriptor.c
index 10b93d3dd..ec2777e9d 100644
--- a/numpy/core/src/multiarray/descriptor.c
+++ b/numpy/core/src/multiarray/descriptor.c
@@ -646,14 +646,7 @@ _get_datetime_tuple_from_cobj(PyObject *cobj)
PyArray_DatetimeMetaData *dt_data;
PyObject *dt_tuple;
-#if defined(NPY_PY3K)
- dt_data = PyCapsule_GetPointer(cobj, NULL);
- if (dt_data == NULL) {
- PyErr_Clear();
- }
-#else
- dt_data = PyCObject_AsVoidPtr(cobj);
-#endif
+ dt_data = NpyCapsule_AsVoidPtr(cobj);
dt_tuple = PyTuple_New(4);
PyTuple_SET_ITEM(dt_tuple, 0,
@@ -692,14 +685,7 @@ _convert_datetime_tuple_to_cobj(PyObject *tuple)
/* FIXME
* There is no error handling here.
*/
-#if defined(NPY_PY3K)
- ret = PyCapsule_New((void *)dt_data, NULL, simple_capsule_dtor);
- if (ret == NULL) {
- PyErr_Clear();
- }
-#else
- ret = PyCObject_FromVoidPtr((void *)dt_data, simple_capsule_dtor);
-#endif
+ ret = NpyCapsule_FromVoidPtr((void *)dt_data, simple_capsule_dtor);
return ret;
}
@@ -1563,14 +1549,7 @@ _append_to_datetime_typestr(PyArray_Descr *self, PyObject *ret)
return ret;
}
tmp = PyDict_GetItemString(self->metadata, NPY_METADATA_DTSTR);
-#if defined(NPY_PY3K)
- dt_data = PyCapsule_GetPointer(tmp, NULL);
- if (dt_data == NULL) {
- PyErr_Clear();
- }
-#else
- dt_data = PyCObject_AsVoidPtr(tmp);
-#endif
+ dt_data = NpyCapsule_AsVoidPtr(tmp);
num = dt_data->num;
den = dt_data->den;
events = dt_data->events;
diff --git a/numpy/core/src/multiarray/getset.c b/numpy/core/src/multiarray/getset.c
index 211327bfe..7b75ab9fd 100644
--- a/numpy/core/src/multiarray/getset.c
+++ b/numpy/core/src/multiarray/getset.c
@@ -552,19 +552,7 @@ array_struct_get(PyArrayObject *self)
inter->descr = NULL;
}
Py_INCREF(self);
-#if defined(NPY_PY3K)
- ret = PyCapsule_New(inter, NULL, gentype_struct_free);
- if (ret == NULL) {
- PyErr_Clear();
- }
- else if (PyCapsule_SetContext(ret, self) != 0) {
- PyErr_Clear();
- Py_DECREF(ret);
- ret = NULL;
- }
-#else
- ret = PyCObject_FromVoidPtrAndDesc(inter, self, gentype_struct_free);
-#endif
+ ret = NpyCapsule_FromVoidPtrAndDesc(inter, self, gentype_struct_free);
return ret;
}
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index f06c266fe..b9168a18a 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -1353,19 +1353,8 @@ _equivalent_units(PyObject *meta1, PyObject *meta2)
/* FIXME
* There is no err handling here.
*/
-#if defined(NPY_PY3K)
- data1 = PyCapsule_GetPointer(cobj1, NULL);
- if (data1 == NULL) {
- PyErr_Clear();
- }
- data2 = PyCapsule_GetPointer(cobj2, NULL);
- if (data2 == NULL) {
- PyErr_Clear();
- }
-#else
- data1 = PyCObject_AsVoidPtr(cobj1);
- data2 = PyCObject_AsVoidPtr(cobj2);
-#endif
+ data1 = NpyCapsule_AsVoidPtr(cobj1);
+ data2 = NpyCapsule_AsVoidPtr(cobj2);
return ((data1->base == data2->base)
&& (data1->num == data2->num)
&& (data1->den == data2->den)
@@ -3062,14 +3051,7 @@ PyMODINIT_FUNC initmultiarray(void) {
/* FIXME
* There is no error handling here
*/
-#if defined(NPY_PY3K)
- c_api = PyCapsule_New((void *)PyArray_API, NULL, NULL);
- if (c_api == NULL) {
- PyErr_Clear();
- }
-#else
- c_api = PyCObject_FromVoidPtr((void *)PyArray_API, NULL);
-#endif
+ c_api = NpyCapsule_FromVoidPtr((void *)PyArray_API, NULL);
PyDict_SetItemString(d, "_ARRAY_API", c_api);
Py_DECREF(c_api);
if (PyErr_Occurred()) {
@@ -3103,14 +3085,7 @@ PyMODINIT_FUNC initmultiarray(void) {
/* FIXME
* There is no error handling here
*/
-#if defined(NPY_PY3K)
- s = PyCapsule_New((void *)_datetime_strings, NULL, NULL);
- if (s == NULL) {
- PyErr_Clear();
- }
-#else
- s = PyCObject_FromVoidPtr((void *)_datetime_strings, NULL);
-#endif
+ s = NpyCapsule_FromVoidPtr((void *)_datetime_strings, NULL);
PyDict_SetItemString(d, "DATETIMEUNITS", s);
Py_DECREF(s);
diff --git a/numpy/core/src/multiarray/scalarapi.c b/numpy/core/src/multiarray/scalarapi.c
index 74193f4f0..6f451c71a 100644
--- a/numpy/core/src/multiarray/scalarapi.c
+++ b/numpy/core/src/multiarray/scalarapi.c
@@ -534,14 +534,7 @@ PyArray_DescrFromScalar(PyObject *sc)
memcpy(dt_data, &((PyTimedeltaScalarObject *)sc)->obmeta,
sizeof(PyArray_DatetimeMetaData));
}
-#if defined(NPY_PY3K)
- cobj = PyCapsule_New((void *)dt_data, NULL, simple_capsule_dtor);
- if (cobj == NULL) {
- PyErr_Clear();
- }
-#else
- cobj = PyCObject_FromVoidPtr((void *)dt_data, simple_capsule_dtor);
-#endif
+ cobj = NpyCapsule_FromVoidPtr((void *)dt_data, simple_capsule_dtor);
/* Add correct meta-data to the data-type */
if (descr == NULL) {
@@ -677,14 +670,7 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
/* FIXME
* There is no error handling here.
*/
-#if defined(NPY_PY3K)
- dt_data = PyCapsule_GetPointer(cobj, NULL);
- if (dt_data == NULL) {
- PyErr_Clear();
- }
-#else
- dt_data = PyCObject_AsVoidPtr(cobj);
-#endif
+ dt_data = NpyCapsule_AsVoidPtr(cobj);
memcpy(&(((PyDatetimeScalarObject *)obj)->obmeta), dt_data,
sizeof(PyArray_DatetimeMetaData));
}
diff --git a/numpy/core/src/multiarray/scalartypes.c.src b/numpy/core/src/multiarray/scalartypes.c.src
index 107633b0d..c95749c53 100644
--- a/numpy/core/src/multiarray/scalartypes.c.src
+++ b/numpy/core/src/multiarray/scalartypes.c.src
@@ -810,7 +810,7 @@ gentype_size_get(PyObject *NPY_UNUSED(self))
return PyInt_FromLong(1);
}
-#if defined(NPY_PY3K)
+#if PY_VERSION_HEX >= 0x02070000
NPY_NO_EXPORT void
gentype_struct_free(PyObject *ptr)
{
@@ -857,18 +857,7 @@ gentype_struct_get(PyObject *self)
inter->data = arr->data;
inter->descr = NULL;
-#if defined(NPY_PY3K)
- ret = PyCapsule_New(inter, NULL, gentype_struct_free);
- if (ret == NULL) {
- PyErr_Clear();
- }
- else if (PyCapsule_SetContext(ret, arr) != 0) {
- PyErr_Clear();
- ret == NULL;
- }
-#else
- ret = PyCObject_FromVoidPtrAndDesc(inter, arr, gentype_struct_free);
-#endif
+ ret = NpyCapsule_FromVoidPtrAndDesc(inter, arr, gentype_struct_free);
return ret;
}
diff --git a/numpy/core/src/multiarray/scalartypes.h b/numpy/core/src/multiarray/scalartypes.h
index fbc2908e7..ce3b1ca2c 100644
--- a/numpy/core/src/multiarray/scalartypes.h
+++ b/numpy/core/src/multiarray/scalartypes.h
@@ -7,7 +7,7 @@ initialize_numeric_types(void);
NPY_NO_EXPORT void
format_longdouble(char *buf, size_t buflen, longdouble val, unsigned int prec);
-#if defined(NPY_PY3K)
+#if PY_VERSION_HEX >= 0x02070000
NPY_NO_EXPORT void
gentype_struct_free(PyObject *ptr);
#else
diff --git a/numpy/core/src/multiarray/usertypes.c b/numpy/core/src/multiarray/usertypes.c
index 5105c48a6..8df582fbd 100644
--- a/numpy/core/src/multiarray/usertypes.c
+++ b/numpy/core/src/multiarray/usertypes.c
@@ -206,14 +206,7 @@ PyArray_RegisterCastFunc(PyArray_Descr *descr, int totype,
if (PyErr_Occurred()) {
return -1;
}
-#if defined(NPY_PY3K)
- cobj = PyCapsule_New((void *)castfunc, NULL, NULL);
- if (cobj == NULL) {
- PyErr_Clear();
- }
-#else
- cobj = PyCObject_FromVoidPtr((void *)castfunc, NULL);
-#endif
+ cobj = NpyCapsule_FromVoidPtr((void *)castfunc, NULL);
if (cobj == NULL) {
Py_DECREF(key);
return -1;
diff --git a/numpy/core/src/private/npy_3kcompat.h b/numpy/core/src/private/npy_3kcompat.h
index 464c8d8c9..fad2f1fd3 100644
--- a/numpy/core/src/private/npy_3kcompat.h
+++ b/numpy/core/src/private/npy_3kcompat.h
@@ -219,7 +219,7 @@ PyObject_Cmp(PyObject *i1, PyObject *i2, int *cmp)
* The main job here is to get rid of the improved error handling
* of PyCapsules. It's a shame...
*/
-#if defined(NPY_PY3K)
+#if PY_VERSION_HEX >= 0x02070000
static NPY_INLINE PyObject *
NpyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *))
diff --git a/numpy/core/src/umath/ufunc_object.c b/numpy/core/src/umath/ufunc_object.c
index 843e6abde..d3fd73fc5 100644
--- a/numpy/core/src/umath/ufunc_object.c
+++ b/numpy/core/src/umath/ufunc_object.c
@@ -372,14 +372,7 @@ _find_matching_userloop(PyObject *obj, int *arg_types,
PyUFunc_Loop1d *funcdata;
int i;
-#if defined(NPY_PY3K)
- funcdata = (PyUFunc_Loop1d *)PyCapsule_GetPointer(obj, NULL);
- if (funcdata == NULL) {
- PyErr_Clear();
- }
-#else
- funcdata = (PyUFunc_Loop1d *)PyCObject_AsVoidPtr(obj);
-#endif
+ funcdata = (PyUFunc_Loop1d *)NpyCapsule_AsVoidPtr(obj);
while (funcdata != NULL) {
for (i = 0; i < nin; i++) {
if (!PyArray_CanCoerceScalar(arg_types[i],
@@ -524,14 +517,7 @@ extract_specified_loop(PyUFuncObject *self, int *arg_types,
* extract the correct function
* data and argtypes
*/
-#if defined(NPY_PY3K)
- funcdata = (PyUFunc_Loop1d *)PyCapsule_GetPointer(obj, NULL);
- if (funcdata == NULL) {
- PyErr_Clear();
- }
-#else
- funcdata = (PyUFunc_Loop1d *)PyCObject_AsVoidPtr(obj);
-#endif
+ funcdata = (PyUFunc_Loop1d *)NpyCapsule_AsVoidPtr(obj);
while (funcdata != NULL) {
if (n != 1) {
for (i = 0; i < nargs; i++) {
@@ -3890,36 +3876,31 @@ cmp_arg_types(int *arg1, int *arg2, int n)
* This frees the linked-list structure when the CObject
* is destroyed (removed from the internal dictionary)
*/
-#if defined(NPY_PY3K)
static void
-_loop1d_list_free(PyObject *ptr)
+_free_loop1d_list(PyUFunc_Loop1d *data)
{
- PyUFunc_Loop1d *funcdata;
-
- funcdata = (PyUFunc_Loop1d *)PyCapsule_GetPointer(ptr, NULL);
- if (funcdata == NULL) {
+ if (data == NULL) {
return;
}
- _pya_free(funcdata->arg_types);
- _loop1d_list_free(funcdata->next);
- _pya_free(funcdata);
+ _pya_free(data->arg_types);
+ _free_loop1d_list(data->next);
+ _pya_free(data);
+}
+
+#if PY_VERSION_HEX >= 0x02070000
+static void
+_loop1d_list_free(PyObject *ptr)
+{
+ PyUFunc_Loop1d *data = (PyUFunc_Loop1d *)PyCapsule_GetPointer(ptr, NULL);
+ _free_loop1d_list(data);
}
#else
static void
_loop1d_list_free(void *ptr)
{
- PyUFunc_Loop1d *funcdata;
- if (ptr == NULL) {
- return;
- }
- funcdata = (PyUFunc_Loop1d *)ptr;
- if (funcdata == NULL) {
- return;
- }
- _pya_free(funcdata->arg_types);
- _loop1d_list_free(funcdata->next);
- _pya_free(funcdata);
+ PyUFunc_Loop1d *data = (PyUFunc_Loop1d *)ptr;
+ _free_loop1d_list(data);
}
#endif
@@ -3980,14 +3961,7 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc,
cobj = PyDict_GetItem(ufunc->userloops, key);
/* If it's not there, then make one and return. */
if (cobj == NULL) {
-#if defined(NPY_PY3K)
- cobj = PyCapsule_New((void *)funcdata, NULL, _loop1d_list_free);
- if (cobj == NULL) {
- PyErr_Clear();
- }
-#else
- cobj = PyCObject_FromVoidPtr((void *)funcdata, _loop1d_list_free);
-#endif
+ cobj = NpyCapsule_FromVoidPtr((void *)funcdata, _loop1d_list_free);
if (cobj == NULL) {
goto fail;
}
@@ -4005,14 +3979,7 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc,
* is exactly like this one, then just replace.
* Otherwise insert.
*/
-#if defined(NPY_PY3K)
- current = (PyUFunc_Loop1d *)PyCapsule_GetPointer(cobj, NULL);
- if (current == NULL) {
- PyErr_Clear();
- }
-#else
- current = (PyUFunc_Loop1d *)PyCObject_AsVoidPtr(cobj);
-#endif
+ current = (PyUFunc_Loop1d *)NpyCapsule_AsVoidPtr(cobj);
while (current != NULL) {
cmp = cmp_arg_types(current->arg_types, newtypes, ufunc->nargs);
if (cmp >= 0) {
diff --git a/numpy/core/src/umath/umathmodule.c.src b/numpy/core/src/umath/umathmodule.c.src
index 5d2d9c98d..802e45d77 100644
--- a/numpy/core/src/umath/umathmodule.c.src
+++ b/numpy/core/src/umath/umathmodule.c.src
@@ -304,14 +304,7 @@ PyMODINIT_FUNC initumath(void)
/* Add some symbolic constants to the module */
d = PyModule_GetDict(m);
-#if defined(NPY_PY3K)
- c_api = PyCapsule_New((void *)PyUFunc_API, NULL, NULL);
- if (c_api == NULL) {
- PyErr_Clear();
- }
-#else
- c_api = PyCObject_FromVoidPtr((void *)PyUFunc_API, NULL);
-#endif
+ c_api = NpyCapsule_FromVoidPtr((void *)PyUFunc_API, NULL);
if (PyErr_Occurred()) {
goto err;
}
diff --git a/numpy/f2py/src/fortranobject.c b/numpy/f2py/src/fortranobject.c
index 1cd3d3f31..05ecd1383 100644
--- a/numpy/f2py/src/fortranobject.c
+++ b/numpy/f2py/src/fortranobject.c
@@ -913,11 +913,11 @@ int copy_ND_array(const PyArrayObject *arr, PyArrayObject *out)
return PyArray_CopyInto(out, (PyArrayObject *)arr);
}
-/*******************************************/
-/* Compatibility functions for Python 3.1 */
-/*******************************************/
+/*********************************************/
+/* Compatibility functions for Python >= 2.7 */
+/*********************************************/
-#if PY_VERSION_HEX >= 0X03010000
+#if PY_VERSION_HEX >= 0X02070000
PyObject *
F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *))
diff --git a/numpy/f2py/src/fortranobject.h b/numpy/f2py/src/fortranobject.h
index 54a386514..e4ebc4664 100644
--- a/numpy/f2py/src/fortranobject.h
+++ b/numpy/f2py/src/fortranobject.h
@@ -76,7 +76,7 @@ extern "C" {
123456789-123456789-123456789-123456789-123456789-123456789-123456789-12
PyFortranObject represents various Fortran objects:
-Fortran (module) routines, COMMON blocks, module data.
+Fortran (module) routines, COMMON blocks, module data.
Author: Pearu Peterson <pearu@cens.ioc.ee>
*/
@@ -121,7 +121,7 @@ typedef struct {
extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);
extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);
-#if PY_VERSION_HEX >= 0x03010000
+#if PY_VERSION_HEX >= 0x02070000
PyObject * F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *));
void * F2PyCapsule_AsVoidPtr(PyObject *obj);
diff --git a/numpy/lib/type_check.py b/numpy/lib/type_check.py
index 05070b3ba..ecc575e89 100644
--- a/numpy/lib/type_check.py
+++ b/numpy/lib/type_check.py
@@ -620,7 +620,7 @@ def datetime_data(dtype):
('events', ctypes.c_int)]
import sys
- if sys.version_info[:2] >= (3,1):
+ if sys.version_info[:2] >= (2,7):
func = ctypes.pythonapi.PyCapsule_GetPointer
func.argtypes = [ctypes.py_object, ctypes.c_char_p]
func.restype = ctypes.c_void_p
diff --git a/numpy/numarray/_capi.c b/numpy/numarray/_capi.c
index 875e383ea..534057095 100644
--- a/numpy/numarray/_capi.c
+++ b/numpy/numarray/_capi.c
@@ -3402,7 +3402,7 @@ PyMODINIT_FUNC init_capi(void)
_Error = PyErr_NewException("numpy.numarray._capi.error", NULL, NULL);
/* Create a CObject containing the API pointer array's address */
-#if PY_VERSION_HEX >= 0x03010000
+#if PY_VERSION_HEX >= 0x02070000
m = PyModule_Create(&moduledef);
c_api_object = PyCapsule_New((void *)libnumarray_API, NULL, NULL);
if (c_api_object == NULL) {
diff --git a/numpy/numarray/include/numpy/libnumarray.h b/numpy/numarray/include/numpy/libnumarray.h
index 738b5f1cc..08fe159f7 100644
--- a/numpy/numarray/include/numpy/libnumarray.h
+++ b/numpy/numarray/include/numpy/libnumarray.h
@@ -40,7 +40,7 @@ static void **libnumarray_API;
#endif
#endif
-#if PY_VERSION_HEX >= 0x03010000
+#if PY_VERSION_HEX >= 0x02070000
#define _import_libnumarray() \
{ \
PyObject *module = PyImport_ImportModule("numpy.numarray._capi"); \
diff --git a/numpy/random/mtrand/Python.pxi b/numpy/random/mtrand/Python.pxi
index 4628be93d..2f7adf096 100644
--- a/numpy/random/mtrand/Python.pxi
+++ b/numpy/random/mtrand/Python.pxi
@@ -29,6 +29,9 @@ cdef extern from "Python.h":
void Py_XINCREF(object obj)
# CObject API
+# If this is uncommented it needs to be fixed to use PyCapsule
+# for Python >= 2.7
+#
# ctypedef void (*destructor1)(void* cobj)
# ctypedef void (*destructor2)(void* cobj, void* desc)
# int PyCObject_Check(object p)