]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 78826 via svnmerge from
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 12 Mar 2010 14:45:56 +0000 (14:45 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 12 Mar 2010 14:45:56 +0000 (14:45 +0000)
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.
........

Lib/site.py
Misc/NEWS
Modules/main.c
Parser/tokenizer.c
Python/import.c
Python/pythonrun.c

index bf4d67f0d2a08fed67a6dce284a35fb3ab8a3321..14fa5703b45bcca9eae9967b8ab1fa286e06d59c 100644 (file)
@@ -489,11 +489,12 @@ def execsitecustomize():
         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():
@@ -502,6 +503,14 @@ def execusercustomize():
         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():
index 771d3ce7fb8f54dc728bba4ab307ca46faa672a0..978c279f240ae3220c5a41170167c4266946be06 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,11 @@ What's New in Python 3.2 Alpha 1?
 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().
 
 - Issue #7544: Preallocate thread memory before creating the thread to avoid
index b413561b2d07cf6013c96145f97bb501da9ff889..7736d99dfda8bb4df19517afb3ebbd03fe05f9b7 100644 (file)
@@ -595,10 +595,16 @@ Py_Main(int argc, wchar_t **argv)
                                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);
                }
                
index 50b0ff193d3c9cf577bc8e5f875b7cb73cbead58..0e2dc3a52d099c4509dc96b37f581fbc2d73bc24 100644 (file)
@@ -1242,21 +1242,28 @@ indenterror(struct tok_state *tok)
 }
 
 #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
@@ -1405,7 +1412,7 @@ tok_get(register struct tok_state *tok, char **p_start, char **p_end)
                }
                tok_backup(tok, c);
                if (nonascii &&
-                   !verify_identifier(tok->start, tok->cur)) {
+                   !verify_identifier(tok)) {
                        tok->done = E_IDENTIFIER;
                        return ERRORTOKEN;
                }
index 4785bca8819b4e3a082d09efea793df11ab166c1..8a948b98f8da2b7a2423212fd9fc9571bfd551e2 100644 (file)
@@ -2774,8 +2774,6 @@ PyImport_Import(PyObject *module_name)
        }
        else {
                /* No globals -- use standard builtins, and fake globals */
-               PyErr_Clear();
-
                builtins = PyImport_ImportModuleLevel("builtins",
                                                      NULL, NULL, NULL, 0);
                if (builtins == NULL)
index b99a541d54202c2f7b5f9e0d47db8245d402ce24..cfa19b070822b33a08ed539f0b73c91227fc58bd 100644 (file)
@@ -296,13 +296,14 @@ Py_InitializeEx(int install_sigs)
        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 @@ initmain(void)
 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 @@ err_input(perrdetail *err)
        char *msg = NULL;
        errtype = PyExc_SyntaxError;
        switch (err->error) {
+       case E_ERROR:
+               return;
        case E_SYNTAX:
                errtype = PyExc_IndentationError;
                if (err->expected == INDENT)