summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2010-02-25 17:49:24 +0000
committerCharles Harris <charlesr.harris@gmail.com>2010-02-25 17:49:24 +0000
commit7004a5a3652d5131ef9144ead7bc7cc549f0fae2 (patch)
treee685fbb193c5a8039fef07b1c84d0a1820b5a5c7 /numpy
parentf3580687a3f3752a8a8bebbcbe5b594055beb299 (diff)
downloadnumpy-7004a5a3652d5131ef9144ead7bc7cc549f0fae2.tar.gz
BUG: Make sure that the errors set by the PyCapsule functions are cleared. The
PyCObject functions don't set errors. Note that the error handling in the current code is spotty and needs to be fixed at some point.
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarray/arraytypes.c.src9
-rw-r--r--numpy/core/src/multiarray/ctors.c9
-rw-r--r--numpy/core/src/multiarray/descriptor.c18
-rw-r--r--numpy/core/src/multiarray/getset.c9
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c21
-rw-r--r--numpy/core/src/multiarray/scalarapi.c12
-rw-r--r--numpy/core/src/multiarray/scalartypes.c.src8
-rw-r--r--numpy/core/src/multiarray/usertypes.c3
-rw-r--r--numpy/core/src/umath/ufunc_object.c12
-rw-r--r--numpy/core/src/umath/umathmodule.c.src3
10 files changed, 98 insertions, 6 deletions
diff --git a/numpy/core/src/multiarray/arraytypes.c.src b/numpy/core/src/multiarray/arraytypes.c.src
index 3a9356edf..992164f06 100644
--- a/numpy/core/src/multiarray/arraytypes.c.src
+++ b/numpy/core/src/multiarray/arraytypes.c.src
@@ -3533,10 +3533,17 @@ _init_datetime_descr(PyArray_Descr *descr)
dt_data->den = 1;
dt_data->events = 1;
+/* FIXME
+ * 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, _pya_free);
+ cobj = PyCObject_FromVoidPtr((void *)dt_data, simple_capsule_dtor);
#endif
descr->metadata = PyDict_New();
PyDict_SetItemString(descr->metadata, NPY_METADATA_DTSTR, cobj);
diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors.c
index 844aacd71..745cfdb4d 100644
--- a/numpy/core/src/multiarray/ctors.c
+++ b/numpy/core/src/multiarray/ctors.c
@@ -1144,6 +1144,9 @@ discover_depth(PyObject *s, int max, int stop_at_string, int stop_at_tuple)
if (PyCapsule_CheckExact(e)) {
PyArrayInterface *inter;
inter = (PyArrayInterface *)PyCapsule_GetPointer(e, NULL);
+ if (inter == NULL) {
+ PyErr_Clear();
+ }
#else
if (PyCObject_Check(e)) {
PyArrayInterface *inter;
@@ -1576,6 +1579,9 @@ PyArray_NewFromDescr(PyTypeObject *subtype, PyArray_Descr *descr, int nd,
/* A C-function is stored here */
PyArray_FinalizeFunc *cfunc;
cfunc = PyCapsule_GetPointer(func, NULL);
+ if (cfunc == NULL) {
+ PyErr_Clear();
+ }
#else
if PyCObject_Check(func) {
/* A C-function is stored here */
@@ -2127,6 +2133,9 @@ PyArray_FromStructInterface(PyObject *input)
goto fail;
}
inter = PyCapsule_GetPointer(attr, NULL);
+ if (inter == NULL) {
+ PyErr_Clear();
+ }
#else
if (!PyCObject_Check(attr)) {
goto fail;
diff --git a/numpy/core/src/multiarray/descriptor.c b/numpy/core/src/multiarray/descriptor.c
index 9a1e60b0e..3cc2f28ac 100644
--- a/numpy/core/src/multiarray/descriptor.c
+++ b/numpy/core/src/multiarray/descriptor.c
@@ -648,6 +648,9 @@ _get_datetime_tuple_from_cobj(PyObject *cobj)
#if defined(NPY_PY3K)
dt_data = PyCapsule_GetPointer(cobj, NULL);
+ if (dt_data == NULL) {
+ PyErr_Clear();
+ }
#else
dt_data = PyCObject_AsVoidPtr(cobj);
#endif
@@ -669,6 +672,7 @@ static PyObject *
_convert_datetime_tuple_to_cobj(PyObject *tuple)
{
PyArray_DatetimeMetaData *dt_data;
+ PyObject *ret;
dt_data = _pya_malloc(sizeof(PyArray_DatetimeMetaData));
dt_data->base = _unit_from_str(
@@ -685,11 +689,18 @@ _convert_datetime_tuple_to_cobj(PyObject *tuple)
}
}
+/* FIXME
+ * There is no error handling here.
+ */
#if defined(NPY_PY3K)
- return PyCapsule_New((void *)dt_data, NULL, simple_capsule_dtor);
+ ret = PyCapsule_New((void *)dt_data, NULL, simple_capsule_dtor);
+ if (ret == NULL) {
+ PyErr_Clear();
+ }
#else
- return PyCObject_FromVoidPtr((void *)dt_data, _pya_free);
+ ret = PyCObject_FromVoidPtr((void *)dt_data, simple_capsule_dtor);
#endif
+ return ret;
}
static PyArray_Descr *
@@ -1554,6 +1565,9 @@ _append_to_datetime_typestr(PyArray_Descr *self, PyObject *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
diff --git a/numpy/core/src/multiarray/getset.c b/numpy/core/src/multiarray/getset.c
index 4200569af..211327bfe 100644
--- a/numpy/core/src/multiarray/getset.c
+++ b/numpy/core/src/multiarray/getset.c
@@ -554,7 +554,14 @@ array_struct_get(PyArrayObject *self)
Py_INCREF(self);
#if defined(NPY_PY3K)
ret = PyCapsule_New(inter, NULL, gentype_struct_free);
- PyCapsule_SetContext(ret, self);
+ 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
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index 5c707779d..f06c266fe 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -1350,9 +1350,18 @@ _equivalent_units(PyObject *meta1, PyObject *meta2)
return 1;
}
+/* 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);
@@ -3050,8 +3059,14 @@ PyMODINIT_FUNC initmultiarray(void) {
if (PyType_Ready(&PyArrayFlags_Type) < 0) {
return RETVAL;
}
+/* 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
@@ -3085,8 +3100,14 @@ PyMODINIT_FUNC initmultiarray(void) {
PyDict_SetItemString(d, "METADATA_DTSTR", s);
Py_DECREF(s);
+/* 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
diff --git a/numpy/core/src/multiarray/scalarapi.c b/numpy/core/src/multiarray/scalarapi.c
index 5b0ecd2c5..74193f4f0 100644
--- a/numpy/core/src/multiarray/scalarapi.c
+++ b/numpy/core/src/multiarray/scalarapi.c
@@ -536,8 +536,11 @@ PyArray_DescrFromScalar(PyObject *sc)
}
#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, _pya_free);
+ cobj = PyCObject_FromVoidPtr((void *)dt_data, simple_capsule_dtor);
#endif
/* Add correct meta-data to the data-type */
@@ -670,8 +673,15 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
PyObject *cobj;
PyArray_DatetimeMetaData *dt_data;
cobj = PyDict_GetItemString(descr->metadata, NPY_METADATA_DTSTR);
+
+/* 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
diff --git a/numpy/core/src/multiarray/scalartypes.c.src b/numpy/core/src/multiarray/scalartypes.c.src
index 96a3abeed..173416b08 100644
--- a/numpy/core/src/multiarray/scalartypes.c.src
+++ b/numpy/core/src/multiarray/scalartypes.c.src
@@ -859,7 +859,13 @@ gentype_struct_get(PyObject *self)
#if defined(NPY_PY3K)
ret = PyCapsule_New(inter, NULL, gentype_struct_free);
- PyCapsule_SetContext(ret, arr);
+ 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
diff --git a/numpy/core/src/multiarray/usertypes.c b/numpy/core/src/multiarray/usertypes.c
index 07bca8b92..5105c48a6 100644
--- a/numpy/core/src/multiarray/usertypes.c
+++ b/numpy/core/src/multiarray/usertypes.c
@@ -208,6 +208,9 @@ PyArray_RegisterCastFunc(PyArray_Descr *descr, int totype,
}
#if defined(NPY_PY3K)
cobj = PyCapsule_New((void *)castfunc, NULL, NULL);
+ if (cobj == NULL) {
+ PyErr_Clear();
+ }
#else
cobj = PyCObject_FromVoidPtr((void *)castfunc, NULL);
#endif
diff --git a/numpy/core/src/umath/ufunc_object.c b/numpy/core/src/umath/ufunc_object.c
index e2479ed50..843e6abde 100644
--- a/numpy/core/src/umath/ufunc_object.c
+++ b/numpy/core/src/umath/ufunc_object.c
@@ -374,6 +374,9 @@ _find_matching_userloop(PyObject *obj, int *arg_types,
#if defined(NPY_PY3K)
funcdata = (PyUFunc_Loop1d *)PyCapsule_GetPointer(obj, NULL);
+ if (funcdata == NULL) {
+ PyErr_Clear();
+ }
#else
funcdata = (PyUFunc_Loop1d *)PyCObject_AsVoidPtr(obj);
#endif
@@ -523,6 +526,9 @@ extract_specified_loop(PyUFuncObject *self, int *arg_types,
*/
#if defined(NPY_PY3K)
funcdata = (PyUFunc_Loop1d *)PyCapsule_GetPointer(obj, NULL);
+ if (funcdata == NULL) {
+ PyErr_Clear();
+ }
#else
funcdata = (PyUFunc_Loop1d *)PyCObject_AsVoidPtr(obj);
#endif
@@ -3976,6 +3982,9 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc,
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
@@ -3998,6 +4007,9 @@ PyUFunc_RegisterLoopForType(PyUFuncObject *ufunc,
*/
#if defined(NPY_PY3K)
current = (PyUFunc_Loop1d *)PyCapsule_GetPointer(cobj, NULL);
+ if (current == NULL) {
+ PyErr_Clear();
+ }
#else
current = (PyUFunc_Loop1d *)PyCObject_AsVoidPtr(cobj);
#endif
diff --git a/numpy/core/src/umath/umathmodule.c.src b/numpy/core/src/umath/umathmodule.c.src
index f105b90bd..39240cec2 100644
--- a/numpy/core/src/umath/umathmodule.c.src
+++ b/numpy/core/src/umath/umathmodule.c.src
@@ -307,6 +307,9 @@ PyMODINIT_FUNC initumath(void)
#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