| |
| |
| |
| |
| |
| |
|
|
| #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; |
| } |
|
|