diff options
author | Mark Wiebe <mwwiebe@gmail.com> | 2010-12-08 17:10:45 -0800 |
---|---|---|
committer | Mark Wiebe <mwwiebe@gmail.com> | 2010-12-08 17:10:45 -0800 |
commit | 799179d1466f274dfef66d6aeea394b2c7cff729 (patch) | |
tree | 5750062a34618b27d73addaf4c8958361aec2d12 | |
parent | 147f817eefd5efa56fa26b03953a51d533cc27ec (diff) | |
download | numpy-799179d1466f274dfef66d6aeea394b2c7cff729.tar.gz |
BUG: core: PyArray_ObjectToScalar converts True/False to int
In CPython, boolean is a subtype of integer, so the PyInt_Check
was catching booleans as well.
-rw-r--r-- | numpy/core/src/multiarray/scalarapi.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/numpy/core/src/multiarray/scalarapi.c b/numpy/core/src/multiarray/scalarapi.c index 87e140c4e..3d2fae39c 100644 --- a/numpy/core/src/multiarray/scalarapi.c +++ b/numpy/core/src/multiarray/scalarapi.c @@ -354,7 +354,19 @@ PyArray_ScalarFromObject(PyObject *object) if (PyArray_IsZeroDim(object)) { return PyArray_ToScalar(PyArray_DATA(object), object); } - if (PyInt_Check(object)) { + /* + * Booleans in Python are implemented as a subclass of integers, + * so PyBool_Check must be called before PyInt_Check. + */ + if (PyBool_Check(object)) { + if (object == Py_True) { + PyArrayScalar_RETURN_TRUE; + } + else { + PyArrayScalar_RETURN_FALSE; + } + } + else if (PyInt_Check(object)) { ret = PyArrayScalar_New(Long); if (ret == NULL) { return NULL; @@ -389,14 +401,6 @@ PyArray_ScalarFromObject(PyObject *object) } PyArrayScalar_VAL(ret, LongLong) = val; } - else if (PyBool_Check(object)) { - if (object == Py_True) { - PyArrayScalar_RETURN_TRUE; - } - else { - PyArrayScalar_RETURN_FALSE; - } - } return ret; } |