[Python-checkins] r54188 - in python/trunk: Include/pydebug.h Misc/NEWS Modules/main.c Python/pythonrun.c

georg.brandl python-checkins at python.org
Wed Mar 7 01:34:53 CET 2007


Author: georg.brandl
Date: Wed Mar  7 01:34:46 2007
New Revision: 54188

Modified:
   python/trunk/Include/pydebug.h
   python/trunk/Misc/NEWS
   python/trunk/Modules/main.c
   python/trunk/Python/pythonrun.c
Log:
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)

Modified: python/trunk/Include/pydebug.h
==============================================================================
--- python/trunk/Include/pydebug.h	(original)
+++ python/trunk/Include/pydebug.h	Wed Mar  7 01:34:46 2007
@@ -8,6 +8,7 @@
 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;

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Wed Mar  7 01:34:46 2007
@@ -12,6 +12,11 @@
 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.

Modified: python/trunk/Modules/main.c
==============================================================================
--- python/trunk/Modules/main.c	(original)
+++ python/trunk/Modules/main.c	Wed Mar  7 01:34:46 2007
@@ -216,13 +216,11 @@
 	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 @@
 			/* NOTREACHED */
 
 		case 'i':
-			inspect++;
-			saw_inspect_flag = 1;
+			Py_InspectFlag++;
 			Py_InteractiveFlag++;
 			break;
 
@@ -369,9 +366,9 @@
 		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 @@
 
 	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 @@
 	}
 	else {
 		if (filename == NULL && stdin_is_interactive) {
+			Py_InspectFlag = 0; /* do exit on SystemExit */
 			RunStartupFile(&cf);
 		}
 		/* XXX */
@@ -530,16 +528,18 @@
 	/* 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();
 

Modified: python/trunk/Python/pythonrun.c
==============================================================================
--- python/trunk/Python/pythonrun.c	(original)
+++ python/trunk/Python/pythonrun.c	Wed Mar  7 01:34:46 2007
@@ -69,6 +69,7 @@
 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 @@
 	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();


More information about the Python-checkins mailing list