-
Notifications
You must be signed in to change notification settings - Fork 14
Open
Description
When release_GIL_and_enable_signal is switched on, the result object is created inside a nested try block (line 547 of wrap.cxx). Later, it is assumed to be visible in the enclosing scope of that try (line 563).
Lines 539 to 570 in a54c236
| try { | |
| ${overload._get_calling_pattern1()} | |
| %if overload.release_GIL_and_enable_signal : | |
| PyOS_sighandler_t sig = PyOS_getsig(SIGINT); | |
| cpp2py::signal_handler::start(); // start the C++ signal handler | |
| Py_BEGIN_ALLOW_THREADS; | |
| try { | |
| %endif | |
| ${overload._get_calling_pattern()}; // the call is here. It sets up "result" : sets up in the python layer. | |
| %if overload.release_GIL_and_enable_signal : | |
| } | |
| catch(...) { | |
| // an error has occurred : clean GIL, handler and rethrow | |
| Py_BLOCK_THREADS; // cf python include, ceval.h, line 72 comments and below. | |
| cpp2py::signal_handler::stop(); // stop the C++ signal handler | |
| PyOS_setsig(SIGINT, sig); | |
| throw; // | |
| } | |
| Py_END_ALLOW_THREADS; | |
| cpp2py::signal_handler::stop(); | |
| PyOS_setsig(SIGINT, sig); | |
| %endif | |
| %if not overload.is_constructor : | |
| %if overload.rtype != "void" : | |
| py_result = convert_to_python(std::move(result)); | |
| %else: | |
| Py_INCREF(Py_None); | |
| py_result = Py_None; | |
| %endif | |
| %endif | |
| return ${'py_result' if not py_meth.is_constructor else '0'}; | |
| } |
I wanted to prepare a minimal example based on an existing wrapping unit test, but those seem to have been disabled in both TRIQS unstable and cpp2py.
Metadata
Metadata
Assignees
Labels
No labels