changeset: 97497:931593401e3e branch: 3.5 user: Larry Hastings date: Mon Aug 24 19:53:56 2015 -0700 files: Lib/importlib/_bootstrap.py Misc/NEWS Python/clinic/import.c.h Python/import.c Python/importlib.h description: Issue #24769: Interpreter now starts properly when dynamic loading is disabled. Patch by Petr Viktorin. diff -r 9b28f41f1353 -r 931593401e3e Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py Mon Aug 24 16:53:45 2015 -0700 +++ b/Lib/importlib/_bootstrap.py Mon Aug 24 19:53:56 2015 -0700 @@ -745,7 +745,7 @@ @classmethod def exec_module(self, module): """Exec a built-in module""" - _call_with_frames_removed(_imp.exec_dynamic, module) + _call_with_frames_removed(_imp.exec_builtin, module) @classmethod @_requires_builtin diff -r 9b28f41f1353 -r 931593401e3e Misc/NEWS --- a/Misc/NEWS Mon Aug 24 16:53:45 2015 -0700 +++ b/Misc/NEWS Mon Aug 24 19:53:56 2015 -0700 @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #24769: Interpreter now starts properly when dynamic loading + is disabled. Patch by Petr Viktorin. + - Issue #21167: NAN operations are now handled correctly when python is compiled with ICC even if -fp-model strict is not specified. @@ -20,6 +23,7 @@ - Issue #24839: platform._syscmd_ver raises DeprecationWarning + What's New in Python 3.5.0 release candidate 1? =============================================== diff -r 9b28f41f1353 -r 931593401e3e Python/clinic/import.c.h --- a/Python/clinic/import.c.h Mon Aug 24 16:53:45 2015 -0700 +++ b/Python/clinic/import.c.h Mon Aug 24 19:53:56 2015 -0700 @@ -318,6 +318,33 @@ #endif /* defined(HAVE_DYNAMIC_LOADING) */ +PyDoc_STRVAR(_imp_exec_builtin__doc__, +"exec_builtin($module, mod, /)\n" +"--\n" +"\n" +"Initialize an extension module."); + +#define _IMP_EXEC_BUILTIN_METHODDEF \ + {"exec_builtin", (PyCFunction)_imp_exec_builtin, METH_O, _imp_exec_builtin__doc__}, + +static int +_imp_exec_builtin_impl(PyModuleDef *module, PyObject *mod); + +static PyObject * +_imp_exec_builtin(PyModuleDef *module, PyObject *mod) +{ + PyObject *return_value = NULL; + int _return_value; + + _return_value = _imp_exec_builtin_impl(module, mod); + if ((_return_value == -1) && PyErr_Occurred()) + goto exit; + return_value = PyLong_FromLong((long)_return_value); + +exit: + return return_value; +} + #ifndef _IMP_CREATE_DYNAMIC_METHODDEF #define _IMP_CREATE_DYNAMIC_METHODDEF #endif /* !defined(_IMP_CREATE_DYNAMIC_METHODDEF) */ @@ -325,4 +352,4 @@ #ifndef _IMP_EXEC_DYNAMIC_METHODDEF #define _IMP_EXEC_DYNAMIC_METHODDEF #endif /* !defined(_IMP_EXEC_DYNAMIC_METHODDEF) */ -/*[clinic end generated code: output=0f1059766dd58f88 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=c38749cebcadbc3b input=a9049054013a1b77]*/ diff -r 9b28f41f1353 -r 931593401e3e Python/import.c --- a/Python/import.c Mon Aug 24 16:53:45 2015 -0700 +++ b/Python/import.c Mon Aug 24 19:53:56 2015 -0700 @@ -1943,6 +1943,34 @@ return PyBool_FromLong((long) (p == NULL ? 0 : p->size)); } +/* Common implementation for _imp.exec_dynamic and _imp.exec_builtin */ +static int +exec_builtin_or_dynamic(PyObject *mod) { + PyModuleDef *def; + void *state; + + if (!PyModule_Check(mod)) { + return 0; + } + + def = PyModule_GetDef(mod); + if (def == NULL) { + if (PyErr_Occurred()) { + return -1; + } + return 0; + } + state = PyModule_GetState(mod); + if (PyErr_Occurred()) { + return -1; + } + if (state) { + /* Already initialized; skip reload */ + return 0; + } + return PyModule_ExecDef(mod, def); +} + #ifdef HAVE_DYNAMIC_LOADING /*[clinic input] @@ -2014,35 +2042,29 @@ _imp_exec_dynamic_impl(PyModuleDef *module, PyObject *mod) /*[clinic end generated code: output=4b84f1301b22d4bd input=9fdbfcb250280d3a]*/ { - PyModuleDef *def; - void *state; - - if (!PyModule_Check(mod)) { - return 0; - } - - def = PyModule_GetDef(mod); - if (def == NULL) { - if (PyErr_Occurred()) { - return -1; - } - return 0; - } - state = PyModule_GetState(mod); - if (PyErr_Occurred()) { - return -1; - } - if (state) { - /* Already initialized; skip reload */ - return 0; - } - return PyModule_ExecDef(mod, def); + return exec_builtin_or_dynamic(mod); } #endif /* HAVE_DYNAMIC_LOADING */ /*[clinic input] +_imp.exec_builtin -> int + + mod: object + / + +Initialize a built-in module. +[clinic start generated code]*/ + +static int +_imp_exec_builtin_impl(PyModuleDef *module, PyObject *mod) +/*[clinic end generated code: output=215e99876a27e284 input=77ebec0c2a10ecca]*/ +{ + return exec_builtin_or_dynamic(mod); +} + +/*[clinic input] dump buffer [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=524ce2e021e4eba6]*/ @@ -2064,6 +2086,7 @@ _IMP_IS_FROZEN_METHODDEF _IMP_CREATE_DYNAMIC_METHODDEF _IMP_EXEC_DYNAMIC_METHODDEF + _IMP_EXEC_BUILTIN_METHODDEF _IMP__FIX_CO_FILENAME_METHODDEF {NULL, NULL} /* sentinel */ }; diff -r 9b28f41f1353 -r 931593401e3e Python/importlib.h --- a/Python/importlib.h Mon Aug 24 16:53:45 2015 -0700 +++ b/Python/importlib.h Mon Aug 24 19:53:56 2015 -0700 @@ -1304,7 +1304,7 @@ 0,1,100,1,0,83,41,2,122,22,69,120,101,99,32,97, 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, 78,41,3,114,65,0,0,0,114,57,0,0,0,90,12,101, - 120,101,99,95,100,121,110,97,109,105,99,41,2,114,19,0, + 120,101,99,95,98,117,105,108,116,105,110,41,2,114,19,0, 0,0,114,89,0,0,0,114,10,0,0,0,114,10,0,0, 0,114,11,0,0,0,114,139,0,0,0,233,2,0,0,115, 2,0,0,0,0,3,122,27,66,117,105,108,116,105,110,73,