diff -r 9d9c2b4850fc Include/pythonrun.h --- a/Include/pythonrun.h Fri Dec 27 14:06:15 2013 -0500 +++ b/Include/pythonrun.h Sat Jan 04 03:58:52 2014 +0400 @@ -229,6 +229,7 @@ /* Internal -- various one-time initializations */ #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void); +PyAPI_FUNC(void) _PyBuiltins_Init(PyInterpreterState *interp); PyAPI_FUNC(PyObject *) _PySys_Init(void); PyAPI_FUNC(void) _PyImport_Init(void); PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod); diff -r 9d9c2b4850fc Python/pystate.c --- a/Python/pystate.c Fri Dec 27 14:06:15 2013 -0500 +++ b/Python/pystate.c Sat Jan 04 03:58:52 2014 +0400 @@ -116,6 +116,9 @@ Py_CLEAR(interp->sysdict); Py_CLEAR(interp->builtins); Py_CLEAR(interp->importlib); + + /* See issue19255, don't "wipe" builtins on shutdown */ + _PyBuiltins_Init(interp); } diff -r 9d9c2b4850fc Python/pythonrun.c --- a/Python/pythonrun.c Fri Dec 27 14:06:15 2013 -0500 +++ b/Python/pythonrun.c Sat Jan 04 03:58:52 2014 +0400 @@ -323,7 +323,7 @@ { PyInterpreterState *interp; PyThreadState *tstate; - PyObject *bimod, *sysmod, *pstderr; + PyObject *sysmod, *pstderr; char *p; extern void _Py_ReadyTypes(void); @@ -389,27 +389,7 @@ if (!_PyFloat_Init()) Py_FatalError("Py_Initialize: can't init float"); - interp->modules = PyDict_New(); - if (interp->modules == NULL) - Py_FatalError("Py_Initialize: 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"); - if (_PyStructSequence_Init() < 0) - Py_FatalError("Py_Initialize: can't initialize structseq"); - - bimod = _PyBuiltin_Init(); - if (bimod == NULL) - Py_FatalError("Py_Initialize: 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"); - Py_INCREF(interp->builtins); - - /* initialize builtin exceptions */ - _PyExc_Init(bimod); + _PyBuiltins_Init(interp); sysmod = _PySys_Init(); if (sysmod == NULL) @@ -2985,6 +2965,38 @@ return PyRun_InteractiveLoopFlags(f, p, NULL); } +/* + Initializes builtins module and assigns it to the interpreter. +*/ +void +_PyBuiltins_Init(PyInterpreterState *interp) { + interp->modules = PyDict_New(); + if (interp->modules == NULL) + Py_FatalError("Py_Initialize: 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"); + + if (_PyStructSequence_Init() < 0) + Py_FatalError("Py_Initialize: can't initialize structseq"); + + PyObject *bimod = _PyBuiltin_Init(); + + if (bimod == NULL) + Py_FatalError("Py_Initialize: 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"); + + Py_INCREF(interp->builtins); + + _PyExc_Init(bimod); +} + #ifdef __cplusplus } #endif