summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Kirkham <kirkhamj@janelia.hhmi.org>2016-01-10 17:11:28 -0500
committerJohn Kirkham <kirkhamj@janelia.hhmi.org>2016-01-11 19:42:27 -0500
commitbab118da49f051aecf35296bb9d8a00edd5b4198 (patch)
tree9d68478ef7d7a00a7cab076710ae4e74305532aa
parent67592d34fa0bc09fb20686cc76565e3153c0c958 (diff)
downloadnumpy-bab118da49f051aecf35296bb9d8a00edd5b4198.tar.gz
BUG: Clear error before constructing error message using calls to `PyObject_Repr`. Also, do a better job of handling any errors raised while constructing the error message.
-rw-r--r--numpy/core/src/multiarray/ctors.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors.c
index e23cbe3c9..2b8c35234 100644
--- a/numpy/core/src/multiarray/ctors.c
+++ b/numpy/core/src/multiarray/ctors.c
@@ -1926,14 +1926,34 @@ PyArray_FromArray(PyArrayObject *arr, PyArray_Descr *newtype, int flags)
/* Raise an error if the casting rule isn't followed */
if (!PyArray_CanCastArrayTo(arr, newtype, casting)) {
PyObject *errmsg;
+ PyArray_Descr *arr_descr = NULL;
+ PyObject *arr_descr_repr = NULL;
+ PyObject *newtype_repr = NULL;
+ PyErr_Clear();
errmsg = PyUString_FromString("Cannot cast array data from ");
- PyUString_ConcatAndDel(&errmsg,
- PyObject_Repr((PyObject *)PyArray_DESCR(arr)));
+ arr_descr = PyArray_DESCR(arr);
+ if (arr_descr == NULL) {
+ Py_DECREF(newtype);
+ Py_DECREF(errmsg);
+ return NULL;
+ }
+ arr_descr_repr = PyObject_Repr((PyObject *)arr_descr);
+ if (arr_descr_repr == NULL) {
+ Py_DECREF(newtype);
+ Py_DECREF(errmsg);
+ return NULL;
+ }
+ PyUString_ConcatAndDel(&errmsg, arr_descr_repr);
PyUString_ConcatAndDel(&errmsg,
PyUString_FromString(" to "));
- PyUString_ConcatAndDel(&errmsg,
- PyObject_Repr((PyObject *)newtype));
+ newtype_repr = PyObject_Repr((PyObject *)newtype);
+ if (newtype_repr == NULL) {
+ Py_DECREF(newtype);
+ Py_DECREF(errmsg);
+ return NULL;
+ }
+ PyUString_ConcatAndDel(&errmsg, newtype_repr);
PyUString_ConcatAndDel(&errmsg,
PyUString_FromFormat(" according to the rule %s",
npy_casting_to_string(casting)));