[Python-checkins] r79247 - in python/branches/release31-maint: Lib/site.py Misc/NEWS Modules/main.c Parser/tokenizer.c Python/import.c Python/pythonrun.c

victor.stinner python-checkins at python.org
Sun Mar 21 22:48:45 CET 2010


Author: victor.stinner
Date: Sun Mar 21 22:48:45 2010
New Revision: 79247

Log:
Merged revisions 78872 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r78872 | victor.stinner | 2010-03-12 15:45:56 +0100 (ven., 12 mars 2010) | 12 lines
  
  Merged revisions 78826 via svnmerge from 
  svn+ssh://pythondev@svn.python.org/python/trunk
  
  ........
    r78826 | victor.stinner | 2010-03-10 23:30:19 +0100 (mer., 10 mars 2010) | 5 lines
    
    Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
    (SIGINT). If an error occurs while importing the site module, the error is
    printed and Python exits. Initialize the GIL before importing the site
    module.
  ........
................


Modified:
   python/branches/release31-maint/   (props changed)
   python/branches/release31-maint/Lib/site.py
   python/branches/release31-maint/Misc/NEWS
   python/branches/release31-maint/Modules/main.c
   python/branches/release31-maint/Parser/tokenizer.c
   python/branches/release31-maint/Python/import.c
   python/branches/release31-maint/Python/pythonrun.c

Modified: python/branches/release31-maint/Lib/site.py
==============================================================================
--- python/branches/release31-maint/Lib/site.py	(original)
+++ python/branches/release31-maint/Lib/site.py	Sun Mar 21 22:48:45 2010
@@ -474,11 +474,12 @@
         pass
     except Exception as err:
         if os.environ.get("PYTHONVERBOSE"):
-            raise
-        sys.stderr.write(
-            "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
-            "%s: %s\n" %
-            (err.__class__.__name__, err))
+            sys.excepthook(*sys.exc_info())
+        else:
+            sys.stderr.write(
+                "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
+                "%s: %s\n" %
+                (err.__class__.__name__, err))
 
 
 def execusercustomize():
@@ -487,6 +488,14 @@
         import usercustomize
     except ImportError:
         pass
+    except Exception as err:
+        if os.environ.get("PYTHONVERBOSE"):
+            sys.excepthook(*sys.exc_info())
+        else:
+            sys.stderr.write(
+                "Error in usercustomize; set PYTHONVERBOSE for traceback:\n"
+                "%s: %s\n" %
+                (err.__class__.__name__, err))
 
 
 def main():

Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS	(original)
+++ python/branches/release31-maint/Misc/NEWS	Sun Mar 21 22:48:45 2010
@@ -25,6 +25,11 @@
 Core and Builtins
 -----------------
 
+- Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
+  (SIGINT). If an error occurs while importing the site module, the error is
+  printed and Python exits. Initialize the GIL before importing the site
+  module.
+
 - Issue #7173: Generator finalization could invalidate sys.exc_info().
 
 Library

Modified: python/branches/release31-maint/Modules/main.c
==============================================================================
--- python/branches/release31-maint/Modules/main.c	(original)
+++ python/branches/release31-maint/Modules/main.c	Sun Mar 21 22:48:45 2010
@@ -595,10 +595,16 @@
 				else
 					p_cfilename = "<decoding error>";
 			}
-			sts = PyRun_AnyFileExFlags(
-				fp,
-				p_cfilename,
-				filename != NULL, &cf) != 0;
+			/* call pending calls like signal handlers (SIGINT) */
+			if (Py_MakePendingCalls() == -1) {
+				PyErr_Print();
+				sts = 1;
+			} else {
+				sts = PyRun_AnyFileExFlags(
+					fp,
+					p_cfilename,
+					filename != NULL, &cf) != 0;
+			}
 			Py_XDECREF(filenameObj);
 		}
 		

Modified: python/branches/release31-maint/Parser/tokenizer.c
==============================================================================
--- python/branches/release31-maint/Parser/tokenizer.c	(original)
+++ python/branches/release31-maint/Parser/tokenizer.c	Sun Mar 21 22:48:45 2010
@@ -1187,21 +1187,28 @@
 }
 
 #ifdef PGEN
-#define verify_identifier(s,e) 1
+#define verify_identifier(tok) 1
 #else
 /* Verify that the identifier follows PEP 3131. */
 static int
-verify_identifier(char *start, char *end)
+verify_identifier(struct tok_state *tok)
 {
 	PyObject *s;
 	int result;
-	s = PyUnicode_DecodeUTF8(start, end-start, NULL);
+	s = PyUnicode_DecodeUTF8(tok->start, tok->cur - tok->start, NULL);
 	if (s == NULL) {
-		PyErr_Clear();
+		if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
+			PyErr_Clear();
+			tok->done = E_IDENTIFIER;
+		} else {
+			tok->done = E_ERROR;
+		}
 		return 0;
 	}
 	result = PyUnicode_IsIdentifier(s);
 	Py_DECREF(s);
+	if (result == 0)
+		tok->done = E_IDENTIFIER;
 	return result;
 }
 #endif
@@ -1350,7 +1357,7 @@
 		}
 		tok_backup(tok, c);
 		if (nonascii &&
-		    !verify_identifier(tok->start, tok->cur)) {
+		    !verify_identifier(tok)) {
 			tok->done = E_IDENTIFIER;
 			return ERRORTOKEN;
 		}

Modified: python/branches/release31-maint/Python/import.c
==============================================================================
--- python/branches/release31-maint/Python/import.c	(original)
+++ python/branches/release31-maint/Python/import.c	Sun Mar 21 22:48:45 2010
@@ -2777,8 +2777,6 @@
 	}
 	else {
 		/* No globals -- use standard builtins, and fake globals */
-		PyErr_Clear();
-
 		builtins = PyImport_ImportModuleLevel("builtins",
 						      NULL, NULL, NULL, 0);
 		if (builtins == NULL)

Modified: python/branches/release31-maint/Python/pythonrun.c
==============================================================================
--- python/branches/release31-maint/Python/pythonrun.c	(original)
+++ python/branches/release31-maint/Python/pythonrun.c	Sun Mar 21 22:48:45 2010
@@ -296,13 +296,14 @@
 	if (initstdio() < 0)
 		Py_FatalError(
 		    "Py_Initialize: can't initialize sys standard streams");
-	if (!Py_NoSiteFlag)
-		initsite(); /* Module site */
 
 	/* auto-thread-state API, if available */
 #ifdef WITH_THREAD
 	_PyGILState_Init(interp, tstate);
 #endif /* WITH_THREAD */
+
+	if (!Py_NoSiteFlag)
+		initsite(); /* Module site */
 }
 
 void
@@ -711,22 +712,12 @@
 static void
 initsite(void)
 {
-	PyObject *m, *f;
+	PyObject *m;
 	m = PyImport_ImportModule("site");
 	if (m == NULL) {
-		f = PySys_GetObject("stderr");
-		if (f == NULL || f == Py_None)
-			return;
-		if (Py_VerboseFlag) {
-			PyFile_WriteString(
-				"'import site' failed; traceback:\n", f);
-			PyErr_Print();
-		}
-		else {
-			PyFile_WriteString(
-			  "'import site' failed; use -v for traceback\n", f);
-			PyErr_Clear();
-		}
+		PyErr_Print();
+		Py_Finalize();
+		exit(1);
 	}
 	else {
 		Py_DECREF(m);
@@ -1907,6 +1898,8 @@
 	char *msg = NULL;
 	errtype = PyExc_SyntaxError;
 	switch (err->error) {
+	case E_ERROR:
+		return;
 	case E_SYNTAX:
 		errtype = PyExc_IndentationError;
 		if (err->expected == INDENT)


More information about the Python-checkins mailing list