38 static void construct(PyObject *obj_ptr, boost::python::converter::rvalue_from_python_stage1_data *data) {
39 using func_t = std::function<R(Args...)>;
41 reinterpret_cast<boost::python::converter::rvalue_from_python_storage<func_t> *
>(data)->storage.bytes;
43 boost::python::handle<> hnd(boost::python::borrowed(obj_ptr));
44 boost::python::object cb(hnd);
46 new (storage) func_t([cb](Args... args) -> R {
47 PyGILState_STATE gstate = PyGILState_Ensure();
50 boost::python::object res = cb(wrap_for_python(std::forward<Args>(args))...);
51 R out = boost::python::extract<R>(res);
52 PyGILState_Release(gstate);
54 }
catch (boost::python::error_already_set &) {
55 PyGILState_Release(gstate);
60 data->convertible = storage;