diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-03-12 14:45:56 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-03-12 14:45:56 (GMT) |
commit | 52f6dd7a3dd9d672a23d7f654a46f126cfc74968 (patch) | |
tree | 34985c0029101f0a3897d200bc8fdaec754d746a | |
parent | 2743139031017874fba4b8cfe8f6f44c52789bee (diff) | |
download | cpython-52f6dd7a3dd9d672a23d7f654a46f126cfc74968.zip cpython-52f6dd7a3dd9d672a23d7f654a46f126cfc74968.tar.gz cpython-52f6dd7a3dd9d672a23d7f654a46f126cfc74968.tar.bz2 |
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.
........
-rw-r--r-- | Lib/site.py | 19 | ||||
-rw-r--r-- | Misc/NEWS | 5 | ||||
-rw-r--r-- | Modules/main.c | 14 | ||||
-rw-r--r-- | Parser/tokenizer.c | 17 | ||||
-rw-r--r-- | Python/import.c | 2 | ||||
-rw-r--r-- | Python/pythonrun.c | 25 |
6 files changed, 50 insertions, 32 deletions
diff --git a/Lib/site.py b/Lib/site.py index bf4d67f..14fa570 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -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(): @@ -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 diff --git a/Modules/main.c b/Modules/main.c index b413561..7736d99 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -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); } diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 50b0ff1..0e2dc3a 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -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; } diff --git a/Python/import.c b/Python/import.c index 4785bca..8a948b9 100644 --- a/Python/import.c +++ b/Python/import.c @@ -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) diff --git a/Python/pythonrun.c b/Python/pythonrun.c index b99a541..cfa19b0 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -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) |