]> granicus.if.org Git - python/commitdiff
Issue #24769: Interpreter now starts properly when dynamic loading
authorLarry Hastings <larry@hastings.org>
Tue, 25 Aug 2015 02:53:56 +0000 (19:53 -0700)
committerLarry Hastings <larry@hastings.org>
Tue, 25 Aug 2015 02:53:56 +0000 (19:53 -0700)
is disabled.  Patch by Petr Viktorin.

Lib/importlib/_bootstrap.py
Misc/NEWS
Python/clinic/import.c.h
Python/import.c
Python/importlib.h

index 931754e1544fa4e5427625bc1bef8a15032c5862..6f62bb35fef0ebb71e0fa9edc931e8bd6381ab74 100644 (file)
@@ -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
index 804f43bff588b96c590c320368873466e3b0b725..422eaa6760888a5f7507f860ec2b3e4fbc31d244 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ Release date: 2015-08-23
 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 @@ Library
 
 - Issue #24839: platform._syscmd_ver raises DeprecationWarning
 
+
 What's New in Python 3.5.0 release candidate 1?
 ===============================================
 
index 53b5b171eefb69ceb7f219cecf376e6006315eca..9ed62f4f72172c8412659ffbe5d90b370348134c 100644 (file)
@@ -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]*/
index 44aae809907398884100e7e217c5e84bc701e848..7fd49305cbde28c88e2b931eb1be7fba5f5b049a 100644 (file)
@@ -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,34 +2042,28 @@ 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]*/
@@ -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 */
 };
index d5d34066927457976466bd43ff674f126703e6be..a4daf621e24c524764eea015e2e31a96a400c7a6 100644 (file)
@@ -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,