From 2121857c75f4e6c94c5096a15ccb5aedebf43fe1 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Mon, 10 Aug 2015 13:18:16 +0200 Subject: [PATCH] Bring back exec_builtin; use it instead of exec_dynamic for built-in modules exec_dynamic is not available if dynamic loading is disabled. Fixes issue 24769 --- Lib/importlib/_bootstrap.py | 2 +- Python/clinic/import.c.h | 29 ++++++++++++++++++- Python/import.c | 69 ++++++++++++++++++++++++++++++--------------- Python/importlib.h | 2 +- 4 files changed, 76 insertions(+), 26 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 931754e..6f62bb3 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -745,7 +745,7 @@ class BuiltinImporter: @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 --git a/Python/clinic/import.c.h b/Python/clinic/import.c.h index 53b5b17..9ed62f4 100644 --- a/Python/clinic/import.c.h +++ b/Python/clinic/import.c.h @@ -318,6 +318,33 @@ exit: #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 @@ exit: #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 --git a/Python/import.c b/Python/import.c index 44aae80..7fd4930 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1943,6 +1943,34 @@ _imp_is_frozen_impl(PyModuleDef *module, PyObject *name) 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 @@ static int _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 @@ static PyMethodDef imp_methods[] = { _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 --git a/Python/importlib.h b/Python/importlib.h index d5d3406..a4daf62 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -1304,7 +1304,7 @@ const unsigned char _Py_M__importlib[] = { 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, -- 2.1.0