diff --git a/example/example5.cpp b/example/example5.cpp index c601ed71..f6de5ba2 100644 --- a/example/example5.cpp +++ b/example/example5.cpp @@ -65,7 +65,7 @@ bool test_callback1(py::object func) { } int test_callback2(py::object func) { - py::object result = func.call("Hello", true, 5); + py::object result = func.call("Hello", 'x', true, 5); return result.cast(); } diff --git a/example/example5.py b/example/example5.py index c645af20..7e0dfd01 100755 --- a/example/example5.py +++ b/example/example5.py @@ -29,8 +29,8 @@ from example import Example5 def func1(): print('Callback function 1 called!') -def func2(a, b, c): - print('Callback function 2 called : ' + str(a) + ", " + str(b) + ", "+ str(c)) +def func2(a, b, c, d): + print('Callback function 2 called : ' + str(a) + ", " + str(b) + ", " + str(c) + ", "+ str(d)) return c class MyCallback(Example5): diff --git a/include/pybind/cast.h b/include/pybind/cast.h index 38b9d7f4..05e8fe1a 100644 --- a/include/pybind/cast.h +++ b/include/pybind/cast.h @@ -222,11 +222,14 @@ protected: template <> class type_caster { \ public: \ bool load(PyObject *src, bool) { \ - value = (type) from_type(src); \ - if (value == (type) -1 && PyErr_Occurred()) { \ + py_type py_value = from_type(src); \ + if ((py_value == (py_type) -1 && PyErr_Occurred()) || \ + py_value < std::numeric_limits::min() || \ + py_value > std::numeric_limits::max()) { \ PyErr_Clear(); \ return false; \ } \ + value = (type) py_value; \ return true; \ } \ static PyObject *cast(type src, return_value_policy /* policy */, PyObject * /* parent */) { \ @@ -235,6 +238,10 @@ protected: PYBIND_TYPE_CASTER(type, #type); \ }; +PYBIND_TYPE_CASTER_NUMBER(int8_t, long, PyLong_AsLong, PyLong_FromLong) +PYBIND_TYPE_CASTER_NUMBER(uint8_t, unsigned long, PyLong_AsUnsignedLong, PyLong_FromUnsignedLong) +PYBIND_TYPE_CASTER_NUMBER(int16_t, long, PyLong_AsLong, PyLong_FromLong) +PYBIND_TYPE_CASTER_NUMBER(uint16_t, unsigned long, PyLong_AsUnsignedLong, PyLong_FromUnsignedLong) PYBIND_TYPE_CASTER_NUMBER(int32_t, long, PyLong_AsLong, PyLong_FromLong) PYBIND_TYPE_CASTER_NUMBER(uint32_t, unsigned long, PyLong_AsUnsignedLong, PyLong_FromUnsignedLong) PYBIND_TYPE_CASTER_NUMBER(int64_t, PY_LONG_LONG, PyLong_AsLongLong, PyLong_FromLongLong)