[Python-checkins] bpo-36900: import.c uses PyInterpreterState.core_config (GH-13278)

Victor Stinner webhook-mailer at python.org
Mon May 13 11:12:54 EDT 2019


https://github.com/python/cpython/commit/410b85a7f701be280eb15b0ca4fe116e86f1d008
commit: 410b85a7f701be280eb15b0ca4fe116e86f1d008
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2019-05-13T17:12:45+02:00
summary:

bpo-36900: import.c uses PyInterpreterState.core_config (GH-13278)

Move _PyImportZip_Init() to the internal C API and add an 'interp'
parameter.

files:
M Include/import.h
M Include/internal/pycore_pylifecycle.h
M Python/import.c
M Python/pylifecycle.c

diff --git a/Include/import.h b/Include/import.h
index c664803478a5..13c614933c7c 100644
--- a/Include/import.h
+++ b/Include/import.h
@@ -8,8 +8,6 @@ extern "C" {
 #endif
 
 #ifndef Py_LIMITED_API
-PyAPI_FUNC(_PyInitError) _PyImportZip_Init(void);
-
 PyMODINIT_FUNC PyInit__imp(void);
 #endif /* !Py_LIMITED_API */
 PyAPI_FUNC(long) PyImport_GetMagicNumber(void);
diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h
index 7144bbcda7cb..0d83acdf28aa 100644
--- a/Include/internal/pycore_pylifecycle.h
+++ b/Include/internal/pycore_pylifecycle.h
@@ -54,6 +54,8 @@ extern int _PyFloat_Init(void);
 extern _PyInitError _Py_HashRandomization_Init(const _PyCoreConfig *);
 
 extern _PyInitError _PyTypes_Init(void);
+extern _PyInitError _PyImportZip_Init(PyInterpreterState *interp);
+
 
 /* Various internal finalizers */
 
diff --git a/Python/import.c b/Python/import.c
index 9290f39c0ae2..c634edb4c7fc 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -91,7 +91,7 @@ _PyImportHooks_Init(void)
 }
 
 _PyInitError
-_PyImportZip_Init(void)
+_PyImportZip_Init(PyInterpreterState *interp)
 {
     PyObject *path_hooks, *zipimport;
     int err = 0;
@@ -102,14 +102,17 @@ _PyImportZip_Init(void)
         goto error;
     }
 
-    if (Py_VerboseFlag)
+    int verbose = interp->core_config.verbose;
+    if (verbose) {
         PySys_WriteStderr("# installing zipimport hook\n");
+    }
 
     zipimport = PyImport_ImportModule("zipimport");
     if (zipimport == NULL) {
         PyErr_Clear(); /* No zip import module -- okay */
-        if (Py_VerboseFlag)
+        if (verbose) {
             PySys_WriteStderr("# can't import zipimport\n");
+        }
     }
     else {
         _Py_IDENTIFIER(zipimporter);
@@ -118,9 +121,9 @@ _PyImportZip_Init(void)
         Py_DECREF(zipimport);
         if (zipimporter == NULL) {
             PyErr_Clear(); /* No zipimporter object -- okay */
-            if (Py_VerboseFlag)
-                PySys_WriteStderr(
-                    "# can't import zipimport.zipimporter\n");
+            if (verbose) {
+                PySys_WriteStderr("# can't import zipimport.zipimporter\n");
+            }
         }
         else {
             /* sys.path_hooks.insert(0, zipimporter) */
@@ -129,9 +132,9 @@ _PyImportZip_Init(void)
             if (err < 0) {
                 goto error;
             }
-            if (Py_VerboseFlag)
-                PySys_WriteStderr(
-                    "# installed zipimport hook\n");
+            if (verbose) {
+                PySys_WriteStderr("# installed zipimport hook\n");
+            }
         }
     }
 
@@ -415,22 +418,26 @@ PyImport_Cleanup(void)
 
     /* XXX Perhaps these precautions are obsolete. Who knows? */
 
-    if (Py_VerboseFlag)
+    int verbose = interp->core_config.verbose;
+    if (verbose) {
         PySys_WriteStderr("# clear builtins._\n");
+    }
     if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
         PyErr_WriteUnraisable(NULL);
     }
 
     for (p = sys_deletes; *p != NULL; p++) {
-        if (Py_VerboseFlag)
+        if (verbose) {
             PySys_WriteStderr("# clear sys.%s\n", *p);
+        }
         if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
             PyErr_WriteUnraisable(NULL);
         }
     }
     for (p = sys_files; *p != NULL; p+=2) {
-        if (Py_VerboseFlag)
+        if (verbose) {
             PySys_WriteStderr("# restore sys.%s\n", *p);
+        }
         value = _PyDict_GetItemStringWithError(interp->sysdict, *(p+1));
         if (value == NULL) {
             if (PyErr_Occurred()) {
@@ -469,8 +476,9 @@ PyImport_Cleanup(void)
     }
 #define CLEAR_MODULE(name, mod) \
     if (PyModule_Check(mod)) { \
-        if (Py_VerboseFlag && PyUnicode_Check(name)) \
+        if (verbose && PyUnicode_Check(name)) { \
             PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
+        } \
         STORE_MODULE_WEAKREF(name, mod); \
         if (PyObject_SetItem(modules, name, Py_None) < 0) { \
             PyErr_WriteUnraisable(NULL); \
@@ -563,8 +571,9 @@ PyImport_Cleanup(void)
             if (dict == interp->builtins || dict == interp->sysdict)
                 continue;
             Py_INCREF(mod);
-            if (Py_VerboseFlag && PyUnicode_Check(name))
+            if (verbose && PyUnicode_Check(name)) {
                 PySys_FormatStderr("# cleanup[3] wiping %U\n", name);
+            }
             _PyModule_Clear(mod);
             Py_DECREF(mod);
         }
@@ -572,11 +581,13 @@ PyImport_Cleanup(void)
     }
 
     /* Next, delete sys and builtins (in that order) */
-    if (Py_VerboseFlag)
+    if (verbose) {
         PySys_FormatStderr("# cleanup[3] wiping sys\n");
+    }
     _PyModule_ClearDict(interp->sysdict);
-    if (Py_VerboseFlag)
+    if (verbose) {
         PySys_FormatStderr("# cleanup[3] wiping builtins\n");
+    }
     _PyModule_ClearDict(interp->builtins);
 
     /* Clear and delete the modules directory.  Actual modules will
@@ -755,9 +766,11 @@ _PyImport_FindExtensionObjectEx(PyObject *name, PyObject *filename,
         PyMapping_DelItem(modules, name);
         return NULL;
     }
-    if (Py_VerboseFlag)
+    int verbose = _PyInterpreterState_Get()->core_config.verbose;
+    if (verbose) {
         PySys_FormatStderr("import %U # previously loaded (%R)\n",
-                          name, filename);
+                           name, filename);
+    }
     return mod;
 
 }
@@ -1427,7 +1440,7 @@ PyImport_ImportModuleNoBlock(const char *name)
 /* Remove importlib frames from the traceback,
  * except in Verbose mode. */
 static void
-remove_importlib_frames(void)
+remove_importlib_frames(PyInterpreterState *interp)
 {
     const char *importlib_filename = "<frozen importlib._bootstrap>";
     const char *external_filename = "<frozen importlib._bootstrap_external>";
@@ -1442,8 +1455,10 @@ remove_importlib_frames(void)
        which end with a call to "_call_with_frames_removed". */
 
     PyErr_Fetch(&exception, &value, &base_tb);
-    if (!exception || Py_VerboseFlag)
+    if (!exception || interp->core_config.verbose) {
         goto done;
+    }
+
     if (PyType_IsSubtype((PyTypeObject *) exception,
                          (PyTypeObject *) PyExc_ImportError))
         always_trim = 1;
@@ -1853,8 +1868,9 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
     Py_XDECREF(abs_name);
     Py_XDECREF(mod);
     Py_XDECREF(package);
-    if (final_mod == NULL)
-        remove_importlib_frames();
+    if (final_mod == NULL) {
+        remove_importlib_frames(interp);
+    }
     return final_mod;
 }
 
@@ -2303,13 +2319,16 @@ PyInit__imp(void)
     PyObject *m, *d;
 
     m = PyModule_Create(&impmodule);
-    if (m == NULL)
+    if (m == NULL) {
         goto failure;
+    }
     d = PyModule_GetDict(m);
-    if (d == NULL)
+    if (d == NULL) {
         goto failure;
-    _PyCoreConfig *config = &_PyInterpreterState_Get()->core_config;
-    PyObject *pyc_mode = PyUnicode_FromWideChar(config->check_hash_pycs_mode, -1);
+    }
+
+    const wchar_t *mode = _PyInterpreterState_Get()->core_config.check_hash_pycs_mode;
+    PyObject *pyc_mode = PyUnicode_FromWideChar(mode, -1);
     if (pyc_mode == NULL) {
         goto failure;
     }
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index de8595ccb581..014b19aa8aa5 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -205,7 +205,7 @@ init_importlib_external(PyInterpreterState *interp)
         return _Py_INIT_ERR("external importer setup failed");
     }
     Py_DECREF(value);
-    return _PyImportZip_Init();
+    return _PyImportZip_Init(interp);
 }
 
 /* Helper functions to better handle the legacy C locale



More information about the Python-checkins mailing list