diff options
author | Andreas Kloeckner <inform@tiker.net> | 2013-07-08 23:11:03 -0400 |
---|---|---|
committer | Andreas Kloeckner <inform@tiker.net> | 2013-07-08 23:11:03 -0400 |
commit | 4441bdd95197ba10651eee8366e67176fb3b5b51 (patch) | |
tree | cb6a2b114b1120aeebd80da3106f348e1f8e4f2c /numpy/core/src | |
parent | 79188b21dd85e4115195971522be91a2fcb1a9d2 (diff) | |
download | numpy-4441bdd95197ba10651eee8366e67176fb3b5b51.tar.gz |
BUG: Check earlier for higher priority in binary operators, add test
Fixes #3375
Diffstat (limited to 'numpy/core/src')
-rw-r--r-- | numpy/core/src/multiarray/number.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/numpy/core/src/multiarray/number.c b/numpy/core/src/multiarray/number.c index 9e13d0f29..392370667 100644 --- a/numpy/core/src/multiarray/number.c +++ b/numpy/core/src/multiarray/number.c @@ -209,6 +209,26 @@ PyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op) Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } + + if (!PyArray_Check(m2)) { + /* + * Catch priority inversion and punt, but only if it's guaranteed + * that we were called through m1 and the other guy is not an array + * at all. Note that some arrays need to pass through here even + * with priorities inverted, for example: float(17) * np.matrix(...) + * + * See also: + * - https://github.com/numpy/numpy/issues/3502 + * - https://github.com/numpy/numpy/issues/3503 + */ + double m1_prio = PyArray_GetPriority(m1, NPY_SCALAR_PRIORITY); + double m2_prio = PyArray_GetPriority(m2, NPY_SCALAR_PRIORITY); + if (m1_prio < m2_prio) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + } + return PyObject_CallFunction(op, "OO", m1, m2); } |