Commit 52f6dd7a authored by Victor Stinner's avatar Victor Stinner

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.
........
parent 27431390
...@@ -489,7 +489,8 @@ def execsitecustomize(): ...@@ -489,7 +489,8 @@ def execsitecustomize():
pass pass
except Exception as err: except Exception as err:
if os.environ.get("PYTHONVERBOSE"): if os.environ.get("PYTHONVERBOSE"):
raise sys.excepthook(*sys.exc_info())
else:
sys.stderr.write( sys.stderr.write(
"Error in sitecustomize; set PYTHONVERBOSE for traceback:\n" "Error in sitecustomize; set PYTHONVERBOSE for traceback:\n"
"%s: %s\n" % "%s: %s\n" %
...@@ -502,6 +503,14 @@ def execusercustomize(): ...@@ -502,6 +503,14 @@ def execusercustomize():
import usercustomize import usercustomize
except ImportError: except ImportError:
pass 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(): def main():
......
...@@ -12,6 +12,11 @@ What's New in Python 3.2 Alpha 1? ...@@ -12,6 +12,11 @@ What's New in Python 3.2 Alpha 1?
Core and Builtins 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 #7173: Generator finalization could invalidate sys.exc_info().
- Issue #7544: Preallocate thread memory before creating the thread to avoid - Issue #7544: Preallocate thread memory before creating the thread to avoid
......
...@@ -595,10 +595,16 @@ Py_Main(int argc, wchar_t **argv) ...@@ -595,10 +595,16 @@ Py_Main(int argc, wchar_t **argv)
else else
p_cfilename = "<decoding error>"; p_cfilename = "<decoding error>";
} }
/* call pending calls like signal handlers (SIGINT) */
if (Py_MakePendingCalls() == -1) {
PyErr_Print();
sts = 1;
} else {
sts = PyRun_AnyFileExFlags( sts = PyRun_AnyFileExFlags(
fp, fp,
p_cfilename, p_cfilename,
filename != NULL, &cf) != 0; filename != NULL, &cf) != 0;
}
Py_XDECREF(filenameObj); Py_XDECREF(filenameObj);
} }
......
...@@ -1242,21 +1242,28 @@ indenterror(struct tok_state *tok) ...@@ -1242,21 +1242,28 @@ indenterror(struct tok_state *tok)
} }
#ifdef PGEN #ifdef PGEN
#define verify_identifier(s,e) 1 #define verify_identifier(tok) 1
#else #else
/* Verify that the identifier follows PEP 3131. */ /* Verify that the identifier follows PEP 3131. */
static int static int
verify_identifier(char *start, char *end) verify_identifier(struct tok_state *tok)
{ {
PyObject *s; PyObject *s;
int result; int result;
s = PyUnicode_DecodeUTF8(start, end-start, NULL); s = PyUnicode_DecodeUTF8(tok->start, tok->cur - tok->start, NULL);
if (s == NULL) { if (s == NULL) {
if (PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) {
PyErr_Clear(); PyErr_Clear();
tok->done = E_IDENTIFIER;
} else {
tok->done = E_ERROR;
}
return 0; return 0;
} }
result = PyUnicode_IsIdentifier(s); result = PyUnicode_IsIdentifier(s);
Py_DECREF(s); Py_DECREF(s);
if (result == 0)
tok->done = E_IDENTIFIER;
return result; return result;
} }
#endif #endif
...@@ -1405,7 +1412,7 @@ tok_get(register struct tok_state *tok, char **p_start, char **p_end) ...@@ -1405,7 +1412,7 @@ tok_get(register struct tok_state *tok, char **p_start, char **p_end)
} }
tok_backup(tok, c); tok_backup(tok, c);
if (nonascii && if (nonascii &&
!verify_identifier(tok->start, tok->cur)) { !verify_identifier(tok)) {
tok->done = E_IDENTIFIER; tok->done = E_IDENTIFIER;
return ERRORTOKEN; return ERRORTOKEN;
} }
......
...@@ -2774,8 +2774,6 @@ PyImport_Import(PyObject *module_name) ...@@ -2774,8 +2774,6 @@ PyImport_Import(PyObject *module_name)
} }
else { else {
/* No globals -- use standard builtins, and fake globals */ /* No globals -- use standard builtins, and fake globals */
PyErr_Clear();
builtins = PyImport_ImportModuleLevel("builtins", builtins = PyImport_ImportModuleLevel("builtins",
NULL, NULL, NULL, 0); NULL, NULL, NULL, 0);
if (builtins == NULL) if (builtins == NULL)
......
...@@ -296,13 +296,14 @@ Py_InitializeEx(int install_sigs) ...@@ -296,13 +296,14 @@ Py_InitializeEx(int install_sigs)
if (initstdio() < 0) if (initstdio() < 0)
Py_FatalError( Py_FatalError(
"Py_Initialize: can't initialize sys standard streams"); "Py_Initialize: can't initialize sys standard streams");
if (!Py_NoSiteFlag)
initsite(); /* Module site */
/* auto-thread-state API, if available */ /* auto-thread-state API, if available */
#ifdef WITH_THREAD #ifdef WITH_THREAD
_PyGILState_Init(interp, tstate); _PyGILState_Init(interp, tstate);
#endif /* WITH_THREAD */ #endif /* WITH_THREAD */
if (!Py_NoSiteFlag)
initsite(); /* Module site */
} }
void void
...@@ -711,22 +712,12 @@ initmain(void) ...@@ -711,22 +712,12 @@ initmain(void)
static void static void
initsite(void) initsite(void)
{ {
PyObject *m, *f; PyObject *m;
m = PyImport_ImportModule("site"); m = PyImport_ImportModule("site");
if (m == NULL) { 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(); PyErr_Print();
} Py_Finalize();
else { exit(1);
PyFile_WriteString(
"'import site' failed; use -v for traceback\n", f);
PyErr_Clear();
}
} }
else { else {
Py_DECREF(m); Py_DECREF(m);
...@@ -1907,6 +1898,8 @@ err_input(perrdetail *err) ...@@ -1907,6 +1898,8 @@ err_input(perrdetail *err)
char *msg = NULL; char *msg = NULL;
errtype = PyExc_SyntaxError; errtype = PyExc_SyntaxError;
switch (err->error) { switch (err->error) {
case E_ERROR:
return;
case E_SYNTAX: case E_SYNTAX:
errtype = PyExc_IndentationError; errtype = PyExc_IndentationError;
if (err->expected == INDENT) if (err->expected == INDENT)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment