diff options
-rw-r--r-- | numpy/core/src/common/ufunc_override.c | 12 | ||||
-rw-r--r-- | numpy/core/src/multiarray/methods.c | 9 |
2 files changed, 18 insertions, 3 deletions
diff --git a/numpy/core/src/common/ufunc_override.c b/numpy/core/src/common/ufunc_override.c index b67422132..3bc34c3f5 100644 --- a/numpy/core/src/common/ufunc_override.c +++ b/numpy/core/src/common/ufunc_override.c @@ -93,8 +93,16 @@ PyUFuncOverride_GetOutObjects(PyObject *kwds, PyObject **out_kwd_obj, PyObject * return 0; } if (PyTuple_CheckExact(*out_kwd_obj)) { - *out_objs = PySequence_Fast_ITEMS(*out_kwd_obj); - return PySequence_Fast_GET_SIZE(*out_kwd_obj); + PyObject *seq = PySequence_Fast(*out_kwd_obj, "cannot convert"); + int ret; + if (seq == NULL) { + return -1; + } + Py_DECREF(*out_kwd_obj); + *out_objs = PySequence_Fast_ITEMS(seq); + ret = PySequence_Fast_GET_SIZE(seq); + *out_kwd_obj = seq; + return ret; } else { *out_objs = out_kwd_obj; diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c index 231bd86dc..be66cc24f 100644 --- a/numpy/core/src/multiarray/methods.c +++ b/numpy/core/src/multiarray/methods.c @@ -1003,6 +1003,7 @@ any_array_ufunc_overrides(PyObject *args, PyObject *kwds) int i; int nin, nout; PyObject *out_kwd_obj; + PyObject *fast; PyObject **in_objs, **out_objs; /* check inputs */ @@ -1010,12 +1011,18 @@ any_array_ufunc_overrides(PyObject *args, PyObject *kwds) if (nin < 0) { return -1; } - in_objs = PySequence_Fast_ITEMS(args); + fast = PySequence_Fast(args, "could not convert args for fast access"); + if (fast == NULL) { + return -1; + } + in_objs = PySequence_Fast_ITEMS(fast); for (i = 0; i < nin; ++i) { if (PyUFunc_HasOverride(in_objs[i])) { + Py_DECREF(fast); return 1; } } + Py_DECREF(fast); /* check outputs, if any */ nout = PyUFuncOverride_GetOutObjects(kwds, &out_kwd_obj, &out_objs); if (nout < 0) { |