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