| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <pybind11/pybind11.h> |
| |
|
| | |
| | |
| | |
| |
|
| | namespace { |
| |
|
| | namespace py = pybind11; |
| |
|
| | void interleaved_error_already_set() { |
| | py::set_error(PyExc_RuntimeError, "1st error."); |
| | try { |
| | throw py::error_already_set(); |
| | } catch (const py::error_already_set &) { |
| | |
| | py::set_error(PyExc_RuntimeError, "2nd error."); |
| | } |
| | |
| | |
| | if (PyErr_Occurred()) { |
| | throw py::error_already_set(); |
| | } |
| | } |
| |
|
| | constexpr char kModuleName[] = "cross_module_interleaved_error_already_set"; |
| |
|
| | struct PyModuleDef moduledef = { |
| | PyModuleDef_HEAD_INIT, kModuleName, nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr}; |
| |
|
| | } |
| |
|
| | extern "C" PYBIND11_EXPORT PyObject *PyInit_cross_module_interleaved_error_already_set() { |
| | PyObject *m = PyModule_Create(&moduledef); |
| | if (m != nullptr) { |
| | static_assert(sizeof(&interleaved_error_already_set) == sizeof(void *), |
| | "Function pointer must have the same size as void *"); |
| | PyModule_AddObject( |
| | m, |
| | "funcaddr", |
| | PyLong_FromVoidPtr(reinterpret_cast<void *>(&interleaved_error_already_set))); |
| | } |
| | return m; |
| | } |
| |
|