pymain_err_print(int *exitcode_p)
{
int exitcode;
- if (_Py_HandleSystemExit(&exitcode)) {
+ if (_Py_HandleSystemExitAndKeyboardInterrupt(&exitcode)) {
*exitcode_p = exitcode;
return 1;
}
goto done;
}
if (!PyDict_SetItemString(kwargs, "pythonstartup", _PyLong_GetOne())) {
- _PyRuntime.signals.unhandled_keyboard_interrupt = 0;
console_result = PyObject_Call(console, empty_tuple, kwargs);
- if (!console_result && PyErr_Occurred() == PyExc_KeyboardInterrupt) {
- _PyRuntime.signals.unhandled_keyboard_interrupt = 1;
- }
if (console_result == NULL) {
res = pymain_exit_err_print();
}
Py_DECREF(module);
return pymain_exit_err_print();
}
- _PyRuntime.signals.unhandled_keyboard_interrupt = 0;
result = PyObject_Call(runmodule, runargs, NULL);
- if (!result && PyErr_Occurred() == PyExc_KeyboardInterrupt) {
- _PyRuntime.signals.unhandled_keyboard_interrupt = 1;
- }
Py_DECREF(runmodule);
Py_DECREF(module);
Py_DECREF(runargs);
{
int exitcode = 0;
+ _PyRuntime.signals.unhandled_keyboard_interrupt = 0;
+
pymain_run_python(&exitcode);
if (Py_FinalizeEx() < 0) {
}
int
-_Py_HandleSystemExit(int *exitcode_p)
+_Py_HandleSystemExitAndKeyboardInterrupt(int *exitcode_p)
{
+ if (PyErr_ExceptionMatches(PyExc_KeyboardInterrupt)) {
+ _Py_atomic_store_int(&_PyRuntime.signals.unhandled_keyboard_interrupt, 1);
+ return 0;
+ }
+
int inspect = _Py_GetConfig()->inspect;
if (inspect) {
/* Don't exit if -i flag was given. This flag is set to 0
handle_system_exit(void)
{
int exitcode;
- if (_Py_HandleSystemExit(&exitcode)) {
+ if (_Py_HandleSystemExitAndKeyboardInterrupt(&exitcode)) {
Py_Exit(exitcode);
}
}
}
}
- int unhandled_keyboard_interrupt = _PyRuntime.signals.unhandled_keyboard_interrupt;
-
// Try first with the stdlib traceback module
PyObject *print_exception_fn = PyImport_ImportModuleAttrString(
"traceback",
Py_XDECREF(print_exception_fn);
if (result) {
Py_DECREF(result);
- _PyRuntime.signals.unhandled_keyboard_interrupt = unhandled_keyboard_interrupt;
return;
}
fallback:
- _PyRuntime.signals.unhandled_keyboard_interrupt = unhandled_keyboard_interrupt;
#ifdef Py_DEBUG
if (PyErr_Occurred()) {
PyErr_FormatUnraisable(
static PyObject *
run_eval_code_obj(PyThreadState *tstate, PyCodeObject *co, PyObject *globals, PyObject *locals)
{
- PyObject *v;
- /*
- * We explicitly re-initialize _Py_UnhandledKeyboardInterrupt every eval
- * _just in case_ someone is calling into an embedded Python where they
- * don't care about an uncaught KeyboardInterrupt exception (why didn't they
- * leave config.install_signal_handlers set to 0?!?) but then later call
- * Py_Main() itself (which _checks_ this flag and dies with a signal after
- * its interpreter exits). We don't want a previous embedded interpreter's
- * uncaught exception to trigger an unexplained signal exit from a future
- * Py_Main() based one.
- */
- // XXX Isn't this dealt with by the move to _PyRuntimeState?
- _PyRuntime.signals.unhandled_keyboard_interrupt = 0;
-
/* Set globals['__builtins__'] if it doesn't exist */
if (!globals || !PyDict_Check(globals)) {
PyErr_SetString(PyExc_SystemError, "globals must be a real dict");
}
}
- v = PyEval_EvalCode((PyObject*)co, globals, locals);
- if (!v && _PyErr_Occurred(tstate) == PyExc_KeyboardInterrupt) {
- _PyRuntime.signals.unhandled_keyboard_interrupt = 1;
- }
- return v;
+ return PyEval_EvalCode((PyObject*)co, globals, locals);
}
static PyObject *
Python/pythonrun.c:PyId_stdout _Py_IDENTIFIER(stdout)
Python/pythonrun.c:PyRun_InteractiveOneObjectEx():PyId___main__ _Py_IDENTIFIER(__main__)
Python/pythonrun.c:PyRun_InteractiveOneObjectEx():PyId_encoding _Py_IDENTIFIER(encoding)
-Python/pythonrun.c:_Py_HandleSystemExit():PyId_code _Py_IDENTIFIER(code)
+Python/pythonrun.c:_Py_HandleSystemExitAndKeyboardInterrupt():PyId_code _Py_IDENTIFIER(code)
Python/pythonrun.c:parse_syntax_error():PyId_filename _Py_IDENTIFIER(filename)
Python/pythonrun.c:parse_syntax_error():PyId_lineno _Py_IDENTIFIER(lineno)
Python/pythonrun.c:parse_syntax_error():PyId_msg _Py_IDENTIFIER(msg)