]> granicus.if.org Git - python/commitdiff
Merged revisions 78872 via svnmerge from
authorVictor Stinner <victor.stinner@haypocalc.com>
Sun, 21 Mar 2010 21:48:45 +0000 (21:48 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Sun, 21 Mar 2010 21:48:45 +0000 (21:48 +0000)
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.
  ........
................

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

index 7bbd962632b9f92d5b3fb297d12115ff285b3e5d..780ea7e162f404ee58f669c5d57db89f2e165dbe 100644 (file)
@@ -474,11 +474,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():
@@ -487,6 +488,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 9d42ce69229d27e5337d5214b042a68809ea3cc9..3e6cf262c0e7a4bddb13873b246f3b51f412fcee 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -25,6 +25,11 @@ What's New in Python 3.1.2?
 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
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 658dc316fb811a9b1a32c9ffb3c36c6acb37b749..af99deff38cd0af6a3198f3d2682ffb4ae75ce22 100644 (file)
@@ -1187,21 +1187,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
@@ -1350,7 +1357,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 5da4c513fe9711fb37c9c3993098586f765ccc94..159a45b0fe709493d82b5ec73488b39d7ab07840 100644 (file)
@@ -2777,8 +2777,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 3764740e81c577f29093bd806fbcaa9a03a89b60..f4f87662d25ef3bb08b0bc6ddadf120a616e9ac4 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)