summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wiebe <mwwiebe@gmail.com>2010-12-08 17:10:45 -0800
committerMark Wiebe <mwwiebe@gmail.com>2010-12-08 17:10:45 -0800
commit799179d1466f274dfef66d6aeea394b2c7cff729 (patch)
tree5750062a34618b27d73addaf4c8958361aec2d12
parent147f817eefd5efa56fa26b03953a51d533cc27ec (diff)
downloadnumpy-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.c22
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;
}