summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-03-21 21:48:45 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-03-21 21:48:45 (GMT)
commitffbc2f63e1ae5356e03f8b0cbf606616c311862e (patch)
tree21b807e7e152d929cfb8edba5440ccbaa686eb78
parentb531bfba4e46a6295dce7529af7e454520683487 (diff)
downloadcpython-ffbc2f63e1ae5356e03f8b0cbf606616c311862e.zip
cpython-ffbc2f63e1ae5356e03f8b0cbf606616c311862e.tar.gz
cpython-ffbc2f63e1ae5356e03f8b0cbf606616c311862e.tar.bz2
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. ........ ................
-rw-r--r--Lib/site.py19
-rw-r--r--Misc/NEWS5
-rw-r--r--Modules/main.c14
-rw-r--r--Parser/tokenizer.c17
-rw-r--r--Python/import.c2
-rw-r--r--Python/pythonrun.c25
6 files changed, 50 insertions, 32 deletions
diff --git a/Lib/site.py b/Lib/site.py
index 7bbd962..780ea7e 100644
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -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():
diff --git a/Misc/NEWS b/Misc/NEWS
index 9d42ce6..3e6cf26 100644
--- 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
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 658dc31..af99def 100644
--- a/Parser/tokenizer.c
+++ b/Parser/tokenizer.c
@@ -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;
}
diff --git a/Python/import.c b/Python/import.c
index 5da4c51..159a45b 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -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)
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 3764740..f4f8766 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)