enum_: fix implicit conversion on Python 2.7

Enumerations on Python 2.7 were not always implicitly converted to
integers (depending on the target size). This patch adds a __long__
conversion function (only enabled on 2.7) which fixes this issue.

The attached test case fails without this patch.
This commit is contained in:
Wenzel Jakob
2017-04-28 14:46:52 +02:00
parent 51d18aa252
commit e6fd2cd5ab
4 changed files with 19 additions and 1 deletions

View File

@@ -561,7 +561,7 @@ public:
(std::is_integral<T>::value && sizeof(py_type) != sizeof(T) &&
(py_value < (py_type) std::numeric_limits<T>::min() ||
py_value > (py_type) std::numeric_limits<T>::max()))) {
#if PY_VERSION_HEX < 0x03000000
#if PY_VERSION_HEX < 0x03000000 && !defined(PYPY_VERSION)
bool type_error = PyErr_ExceptionMatches(PyExc_SystemError);
#else
bool type_error = PyErr_ExceptionMatches(PyExc_TypeError);

View File

@@ -1197,6 +1197,9 @@ public:
}, return_value_policy::copy);
def("__init__", [](Type& value, Scalar i) { value = (Type)i; });
def("__int__", [](Type value) { return (Scalar) value; });
#if PY_MAJOR_VERSION < 3
def("__long__", [](Type value) { return (Scalar) value; });
#endif
def("__eq__", [](const Type &value, Type *value2) { return value2 && value == *value2; });
def("__ne__", [](const Type &value, Type *value2) { return !value2 || value != *value2; });
if (is_arithmetic) {