summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorLarry Hastings <larry@hastings.org>2015-08-25 02:53:56 (GMT)
committerLarry Hastings <larry@hastings.org>2015-08-25 02:53:56 (GMT)
commit1df0b35e3dfece45ef4d72fce2e3bdd256b5f6b3 (patch)
tree836104fd30d40ea75ee8ce2ebb4950825f9ac451 /Python
parent7250d02b738692fb76a47d75691cca6ba1561040 (diff)
downloadcpython-1df0b35e3dfece45ef4d72fce2e3bdd256b5f6b3.zip
cpython-1df0b35e3dfece45ef4d72fce2e3bdd256b5f6b3.tar.gz
cpython-1df0b35e3dfece45ef4d72fce2e3bdd256b5f6b3.tar.bz2
Issue #24769: Interpreter now starts properly when dynamic loading
is disabled. Patch by Petr Viktorin.
Diffstat (limited to 'Python')
-rw-r--r--Python/clinic/import.c.h29
-rw-r--r--Python/import.c69
-rw-r--r--Python/importlib.h2
3 files changed, 75 insertions, 25 deletions
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,