]> granicus.if.org Git - python/commitdiff
Variant of patch #697613: don't exit the interpreter on a SystemExit
authorGeorg Brandl <georg@python.org>
Wed, 7 Mar 2007 00:34:46 +0000 (00:34 +0000)
committerGeorg Brandl <georg@python.org>
Wed, 7 Mar 2007 00:34:46 +0000 (00:34 +0000)
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)

Include/pydebug.h
Misc/NEWS
Modules/main.c
Python/pythonrun.c

index f49a98e4c41550f852291cbca0720a486e5690be..db3b65676d612e91f4f4e3935b42c703708b36c6 100644 (file)
@@ -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;
index aeae50784857090b636444b1c63824d5c1d33d1e..a783add959de81dc66099d1dd280724ef201d29e 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
index 7594a762e02fe936a7e8e8c90d28d9ac4d100984..2dbdfe9ab1cba6b4e607b3a4d177f4316995d331 100644 (file)
@@ -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();
 
index 3d0c68f2a74cc17a74d283591e0e9d27c3b262d9..aa7e6245677e6689e69ebe6134a0449e90322e3c 100644 (file)
@@ -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();