diff options
author | Georg Brandl <georg@python.org> | 2007-03-07 00:34:46 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2007-03-07 00:34:46 (GMT) |
commit | 49aafc9f2ce7d41be677cdefbcf0af6d9bd1e752 (patch) | |
tree | a5bcc5b8ae7b3a3c639510619726f680cf241c37 | |
parent | 8537c303c796f42b0375922d2d8a17f3ebcb465a (diff) | |
download | cpython-49aafc9f2ce7d41be677cdefbcf0af6d9bd1e752.zip cpython-49aafc9f2ce7d41be677cdefbcf0af6d9bd1e752.tar.gz cpython-49aafc9f2ce7d41be677cdefbcf0af6d9bd1e752.tar.bz2 |
Variant of patch #697613: don't exit the interpreter on a SystemExit
exception if the -i command line option or PYTHONINSPECT environment
variable is given, but break into the interactive interpreter just like
on other exceptions or normal program exit.
(backport)
-rw-r--r-- | Include/pydebug.h | 1 | ||||
-rw-r--r-- | Misc/NEWS | 5 | ||||
-rw-r--r-- | Modules/main.c | 22 | ||||
-rw-r--r-- | Python/pythonrun.c | 6 |
4 files changed, 23 insertions, 11 deletions
diff --git a/Include/pydebug.h b/Include/pydebug.h index f49a98e..db3b656 100644 --- a/Include/pydebug.h +++ b/Include/pydebug.h @@ -8,6 +8,7 @@ extern "C" { PyAPI_DATA(int) Py_DebugFlag; PyAPI_DATA(int) Py_VerboseFlag; PyAPI_DATA(int) Py_InteractiveFlag; +PyAPI_DATA(int) Py_InspectFlag; PyAPI_DATA(int) Py_OptimizeFlag; PyAPI_DATA(int) Py_NoSiteFlag; PyAPI_DATA(int) Py_UseClassExceptionsFlag; @@ -12,6 +12,11 @@ What's New in Python 2.6 alpha 1? Core and builtins ----------------- +- Variant of patch #697613: don't exit the interpreter on a SystemExit + exception if the -i command line option or PYTHONINSPECT environment + variable is given, but break into the interactive interpreter just like + on other exceptions or normal program exit. + - Patch #1638879: don't accept strings with embedded NUL bytes in long(). - Bug #1674503: close the file opened by execfile() in an error condition. diff --git a/Modules/main.c b/Modules/main.c index 7594a76..2dbdfe9 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -216,13 +216,11 @@ Py_Main(int argc, char **argv) char *module = NULL; FILE *fp = stdin; char *p; - int inspect = 0; int unbuffered = 0; int skipfirstline = 0; int stdin_is_interactive = 0; int help = 0; int version = 0; - int saw_inspect_flag = 0; int saw_unbuffered_flag = 0; PyCompilerFlags cf; @@ -297,8 +295,7 @@ Py_Main(int argc, char **argv) /* NOTREACHED */ case 'i': - inspect++; - saw_inspect_flag = 1; + Py_InspectFlag++; Py_InteractiveFlag++; break; @@ -369,9 +366,9 @@ Py_Main(int argc, char **argv) return 0; } - if (!saw_inspect_flag && + if (!Py_InspectFlag && (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') - inspect = 1; + Py_InspectFlag = 1; if (!saw_unbuffered_flag && (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0') unbuffered = 1; @@ -499,7 +496,7 @@ Py_Main(int argc, char **argv) PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind); - if ((inspect || (command == NULL && filename == NULL && module == NULL)) && + if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) && isatty(fileno(stdin))) { PyObject *v; v = PyImport_ImportModule("readline"); @@ -518,6 +515,7 @@ Py_Main(int argc, char **argv) } else { if (filename == NULL && stdin_is_interactive) { + Py_InspectFlag = 0; /* do exit on SystemExit */ RunStartupFile(&cf); } /* XXX */ @@ -530,16 +528,18 @@ Py_Main(int argc, char **argv) /* Check this environment variable at the end, to give programs the * opportunity to set it from Python. */ - if (!saw_inspect_flag && + if (!Py_InspectFlag && (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') { - inspect = 1; + Py_InspectFlag = 1; } - if (inspect && stdin_is_interactive && - (filename != NULL || command != NULL || module != NULL)) + if (Py_InspectFlag && stdin_is_interactive && + (filename != NULL || command != NULL || module != NULL)) { + Py_InspectFlag = 0; /* XXX */ sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0; + } WaitForThreadShutdown(); diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 3d0c68f..aa7e624 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -69,6 +69,7 @@ extern void _PyGILState_Fini(void); int Py_DebugFlag; /* Needed by parser.c */ int Py_VerboseFlag; /* Needed by import.c */ int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */ +int Py_InspectFlag; /* Needed to determine whether to exit at SystemError */ int Py_NoSiteFlag; /* Suppress 'import site' */ int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */ int Py_FrozenFlag; /* Needed by getpath.c */ @@ -1019,6 +1020,11 @@ handle_system_exit(void) PyObject *exception, *value, *tb; int exitcode = 0; + if (Py_InspectFlag) + /* Don't exit if -i flag was given. This flag is set to 0 + * when entering interactive mode for inspecting. */ + return; + PyErr_Fetch(&exception, &value, &tb); if (Py_FlushLine()) PyErr_Clear(); |