diff options
author | Charles Harris <charlesr.harris@gmail.com> | 2010-05-03 07:50:02 +0000 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2010-05-03 07:50:02 +0000 |
commit | bc656ee7cb00a6c4ad0d43f1cdd36bf8c9a026ed (patch) | |
tree | 43db63bf9d9ad272bb252705de933c8a9ad3940c | |
parent | 82d8d97ac30e20f9ae605df228bee43d89ef72a2 (diff) | |
download | numpy-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.
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) |