diff -r c1d2c90ece99 Python/pythonrun.c --- a/Python/pythonrun.c Thu Dec 19 16:47:25 2013 +0100 +++ b/Python/pythonrun.c Thu Dec 19 17:10:48 2013 +0100 @@ -97,6 +97,8 @@ static void initsigs(void); static void call_py_exitfuncs(void); static void wait_for_thread_shutdown(void); static void call_ll_exitfuncs(void); +static void init_error(const char *msg); + extern int _PyUnicode_Init(void); extern int _PyStructSequence_Init(void); extern void _PyUnicode_Fini(void); @@ -108,6 +110,7 @@ extern void _PyHash_Fini(void); extern int _PyTraceMalloc_Init(void); extern int _PyTraceMalloc_Fini(void); + #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); extern void _PyGILState_Fini(void); @@ -277,14 +280,14 @@ import_init(PyInterpreterState *interp, /* Import _importlib through its frozen version, _frozen_importlib. */ if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) { - Py_FatalError("Py_Initialize: can't import _frozen_importlib"); + init_error("can't import _frozen_importlib"); } else if (Py_VerboseFlag) { PySys_FormatStderr("import _frozen_importlib # frozen\n"); } importlib = PyImport_AddModule("_frozen_importlib"); if (importlib == NULL) { - Py_FatalError("Py_Initialize: couldn't get _frozen_importlib from " + init_error("couldn't get _frozen_importlib from " "sys.modules"); } interp->importlib = importlib; @@ -293,7 +296,7 @@ import_init(PyInterpreterState *interp, /* Install _importlib as __import__ */ impmod = PyInit_imp(); if (impmod == NULL) { - Py_FatalError("Py_Initialize: can't import imp"); + init_error("can't import imp"); } else if (Py_VerboseFlag) { PySys_FormatStderr("import imp # builtin\n"); @@ -303,13 +306,13 @@ import_init(PyInterpreterState *interp, PySys_FormatStderr("import sys # builtin\n"); } if (PyDict_SetItemString(sys_modules, "_imp", impmod) < 0) { - Py_FatalError("Py_Initialize: can't save _imp to sys.modules"); + init_error("can't save _imp to sys.modules"); } value = PyObject_CallMethod(importlib, "_install", "OO", sysmod, impmod); if (value == NULL) { PyErr_Print(); - Py_FatalError("Py_Initialize: importlib install failed"); + init_error("importlib install failed"); } Py_DECREF(value); Py_DECREF(impmod); @@ -356,11 +359,11 @@ void interp = PyInterpreterState_New(); if (interp == NULL) - Py_FatalError("Py_Initialize: can't make first interpreter"); + init_error("can't make first interpreter"); tstate = PyThreadState_New(interp); if (tstate == NULL) - Py_FatalError("Py_Initialize: can't make first thread"); + init_error("can't make first thread"); (void) PyThreadState_Swap(tstate); #ifdef WITH_THREAD @@ -378,34 +381,34 @@ void _Py_ReadyTypes(); if (!_PyFrame_Init()) - Py_FatalError("Py_Initialize: can't init frames"); + init_error("can't init frames"); if (!_PyLong_Init()) - Py_FatalError("Py_Initialize: can't init longs"); + init_error("can't init longs"); if (!PyByteArray_Init()) - Py_FatalError("Py_Initialize: can't init bytearray"); + init_error("can't init bytearray"); if (!_PyFloat_Init()) - Py_FatalError("Py_Initialize: can't init float"); + init_error("can't init float"); interp->modules = PyDict_New(); if (interp->modules == NULL) - Py_FatalError("Py_Initialize: can't make modules dictionary"); + init_error("can't make modules dictionary"); /* Init Unicode implementation; relies on the codec registry */ if (_PyUnicode_Init() < 0) - Py_FatalError("Py_Initialize: can't initialize unicode"); + init_error("can't initialize unicode"); if (_PyStructSequence_Init() < 0) - Py_FatalError("Py_Initialize: can't initialize structseq"); + init_error("can't initialize structseq"); bimod = _PyBuiltin_Init(); if (bimod == NULL) - Py_FatalError("Py_Initialize: can't initialize builtins modules"); + init_error("can't initialize builtins modules"); _PyImport_FixupBuiltin(bimod, "builtins"); interp->builtins = PyModule_GetDict(bimod); if (interp->builtins == NULL) - Py_FatalError("Py_Initialize: can't initialize builtins dict"); + init_error("can't initialize builtins dict"); Py_INCREF(interp->builtins); /* initialize builtin exceptions */ @@ -413,10 +416,10 @@ void sysmod = _PySys_Init(); if (sysmod == NULL) - Py_FatalError("Py_Initialize: can't initialize sys"); + init_error("can't initialize sys"); interp->sysdict = PyModule_GetDict(sysmod); if (interp->sysdict == NULL) - Py_FatalError("Py_Initialize: can't initialize sys dict"); + init_error("can't initialize sys dict"); Py_INCREF(interp->sysdict); _PyImport_FixupBuiltin(sysmod, "sys"); PySys_SetPath(Py_GetPath()); @@ -427,7 +430,7 @@ void infrastructure for the io module in place. */ pstderr = PyFile_NewStdPrinter(fileno(stderr)); if (pstderr == NULL) - Py_FatalError("Py_Initialize: can't set preliminary stderr"); + init_error("can't set preliminary stderr"); _PySys_SetObjectId(&PyId_stderr, pstderr); PySys_SetObject("__stderr__", pstderr); Py_DECREF(pstderr); @@ -446,23 +449,22 @@ void /* initialize the faulthandler module */ if (_PyFaulthandler_Init()) - Py_FatalError("Py_Initialize: can't initialize faulthandler"); + init_error("can't initialize faulthandler"); _PyTime_Init(); - if (initfsencoding(interp) < 0) - Py_FatalError("Py_Initialize: unable to load the file system codec"); - if (install_sigs) initsigs(); /* Signal handling stuff, including initintr() */ + if (initfsencoding(interp) < 0) + init_error("unable to load the file system codec"); + if (_PyTraceMalloc_Init() < 0) - Py_FatalError("Py_Initialize: can't initialize tracemalloc"); + init_error("can't initialize tracemalloc"); initmain(interp); /* Module __main__ */ if (initstdio() < 0) - Py_FatalError( - "Py_Initialize: can't initialize sys standard streams"); + init_error("can't initialize sys standard streams"); /* Initialize warnings. */ if (PySys_HasWarnOptions()) { @@ -809,7 +811,7 @@ Py_NewInterpreter(void) infrastructure for the io module in place. */ pstderr = PyFile_NewStdPrinter(fileno(stderr)); if (pstderr == NULL) - Py_FatalError("Py_Initialize: can't set preliminary stderr"); + Py_FatalError("Py_NewInterpreter: can't set preliminary stderr"); _PySys_SetObjectId(&PyId_stderr, pstderr); PySys_SetObject("__stderr__", pstderr); Py_DECREF(pstderr); @@ -823,7 +825,7 @@ Py_NewInterpreter(void) if (initstdio() < 0) Py_FatalError( - "Py_Initialize: can't initialize sys standard streams"); + "Py_NewInterpreter: can't initialize sys standard streams"); initmain(interp); if (!Py_NoSiteFlag) initsite(); @@ -930,15 +932,15 @@ initmain(PyInterpreterState *interp) PyObject *m, *d, *loader; m = PyImport_AddModule("__main__"); if (m == NULL) - Py_FatalError("can't create __main__ module"); + init_error("can't create __main__ module"); d = PyModule_GetDict(m); if (PyDict_GetItemString(d, "__builtins__") == NULL) { PyObject *bimod = PyImport_ImportModule("builtins"); if (bimod == NULL) { - Py_FatalError("Failed to retrieve builtins module"); + init_error("Failed to retrieve builtins module"); } if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) { - Py_FatalError("Failed to initialize __main__.__builtins__"); + init_error("Failed to initialize __main__.__builtins__"); } Py_DECREF(bimod); } @@ -953,10 +955,10 @@ initmain(PyInterpreterState *interp) PyObject *loader = PyObject_GetAttrString(interp->importlib, "BuiltinImporter"); if (loader == NULL) { - Py_FatalError("Failed to retrieve BuiltinImporter"); + init_error("Failed to retrieve BuiltinImporter"); } if (PyDict_SetItemString(d, "__loader__", loader) < 0) { - Py_FatalError("Failed to initialize __main__.__loader__"); + init_error("Failed to initialize __main__.__loader__"); } Py_DECREF(loader); } @@ -971,7 +973,7 @@ initfsencoding(PyInterpreterState *inter { Py_FileSystemDefaultEncoding = get_locale_encoding(); if (Py_FileSystemDefaultEncoding == NULL) - Py_FatalError("Py_Initialize: Unable to get the locale encoding"); + init_error("Unable to get the locale encoding"); Py_HasFileSystemDefaultEncoding = 0; interp->fscodec_initialized = 1; @@ -2579,13 +2581,13 @@ cleanup: /* Print fatal error message and abort */ -void -Py_FatalError(const char *msg) +static void +log_fatal_error(const char *prefix, const char *msg) { const int fd = fileno(stderr); PyThreadState *tstate; - fprintf(stderr, "Fatal Python error: %s\n", msg); + fprintf(stderr, "%s: %s\n", prefix, msg); fflush(stderr); /* it helps in Windows debug build */ if (PyErr_Occurred()) { PyErr_PrintEx(0); @@ -2616,13 +2618,26 @@ Py_FatalError(const char *msg) OutputDebugStringW(buffer); OutputDebugStringW(L"\n"); } -#ifdef _DEBUG +#endif /* MS_WINDOWS */ +} + +void +Py_FatalError(const char *msg) +{ + log_fatal_error("Fatal Python error", msg); +#if defined(MS_WINDOWS) && defined(_DEBUG) DebugBreak(); #endif -#endif /* MS_WINDOWS */ abort(); } +static void +init_error(const char *msg) +{ + log_fatal_error("Python initialization error", msg); + exit(1); +} + /* Clean up and exit */ #ifdef WITH_THREAD @@ -2719,7 +2734,7 @@ initsigs(void) #endif PyOS_InitInterrupts(); /* May imply initsignal() */ if (PyErr_Occurred()) { - Py_FatalError("Py_Initialize: can't import signal"); + init_error("can't import signal"); } }