[Python-checkins] bpo-33330: Write exceptions occurred in PyImport_Cleanup() to stderr. (GH-6606)

Serhiy Storchaka webhook-mailer at python.org
Sun Apr 29 15:16:33 EDT 2018


https://github.com/python/cpython/commit/c1a6832f50b36ffec299e6e6038535904e2b158d
commit: c1a6832f50b36ffec299e6e6038535904e2b158d
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2018-04-29T22:16:30+03:00
summary:

bpo-33330: Write exceptions occurred in PyImport_Cleanup() to stderr. (GH-6606)

They where silenced before.

files:
M Objects/moduleobject.c
M Python/import.c

diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index 8fb368e41474..5fad4474be0f 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -603,8 +603,9 @@ _PyModule_ClearDict(PyObject *d)
                     else
                         PyErr_Clear();
                 }
-                if (PyDict_SetItem(d, key, Py_None) != 0)
-                    PyErr_Clear();
+                if (PyDict_SetItem(d, key, Py_None) != 0) {
+                    PyErr_WriteUnraisable(NULL);
+                }
             }
         }
     }
@@ -623,8 +624,9 @@ _PyModule_ClearDict(PyObject *d)
                     else
                         PyErr_Clear();
                 }
-                if (PyDict_SetItem(d, key, Py_None) != 0)
-                    PyErr_Clear();
+                if (PyDict_SetItem(d, key, Py_None) != 0) {
+                    PyErr_WriteUnraisable(NULL);
+                }
             }
         }
     }
diff --git a/Python/import.c b/Python/import.c
index c29eb7b9415b..bb1d69e16895 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -417,14 +417,14 @@ PyImport_Cleanup(void)
     if (Py_VerboseFlag)
         PySys_WriteStderr("# clear builtins._\n");
     if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
-        PyErr_Clear();
+        PyErr_WriteUnraisable(NULL);
     }
 
     for (p = sys_deletes; *p != NULL; p++) {
         if (Py_VerboseFlag)
             PySys_WriteStderr("# clear sys.%s\n", *p);
         if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
-            PyErr_Clear();
+            PyErr_WriteUnraisable(NULL);
         }
     }
     for (p = sys_files; *p != NULL; p+=2) {
@@ -434,7 +434,7 @@ PyImport_Cleanup(void)
         if (value == NULL)
             value = Py_None;
         if (PyDict_SetItemString(interp->sysdict, *p, value) < 0) {
-            PyErr_Clear();
+            PyErr_WriteUnraisable(NULL);
         }
     }
 
@@ -443,8 +443,9 @@ PyImport_Cleanup(void)
        for diagnosis messages (in verbose mode), while the weakref helps
        detect those modules which have been held alive. */
     weaklist = PyList_New(0);
-    if (weaklist == NULL)
-        PyErr_Clear();
+    if (weaklist == NULL) {
+        PyErr_WriteUnraisable(NULL);
+    }
 
 #define STORE_MODULE_WEAKREF(name, mod) \
     if (weaklist != NULL) { \
@@ -452,13 +453,13 @@ PyImport_Cleanup(void)
         if (wr) { \
             PyObject *tup = PyTuple_Pack(2, name, wr); \
             if (!tup || PyList_Append(weaklist, tup) < 0) { \
-                PyErr_Clear(); \
+                PyErr_WriteUnraisable(NULL); \
             } \
             Py_XDECREF(tup); \
             Py_DECREF(wr); \
         } \
         else { \
-            PyErr_Clear(); \
+            PyErr_WriteUnraisable(NULL); \
         } \
     }
 #define CLEAR_MODULE(name, mod) \
@@ -467,7 +468,7 @@ PyImport_Cleanup(void)
             PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
         STORE_MODULE_WEAKREF(name, mod); \
         if (PyObject_SetItem(modules, name, Py_None) < 0) { \
-            PyErr_Clear(); \
+            PyErr_WriteUnraisable(NULL); \
         } \
     }
 
@@ -482,13 +483,13 @@ PyImport_Cleanup(void)
     else {
         PyObject *iterator = PyObject_GetIter(modules);
         if (iterator == NULL) {
-            PyErr_Clear();
+            PyErr_WriteUnraisable(NULL);
         }
         else {
             while ((key = PyIter_Next(iterator))) {
                 value = PyObject_GetItem(modules, key);
                 if (value == NULL) {
-                    PyErr_Clear();
+                    PyErr_WriteUnraisable(NULL);
                     continue;
                 }
                 CLEAR_MODULE(key, value);
@@ -496,7 +497,7 @@ PyImport_Cleanup(void)
                 Py_DECREF(key);
             }
             if (PyErr_Occurred()) {
-                PyErr_Clear();
+                PyErr_WriteUnraisable(NULL);
             }
             Py_DECREF(iterator);
         }
@@ -508,17 +509,20 @@ PyImport_Cleanup(void)
     }
     else {
         _Py_IDENTIFIER(clear);
-        if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL)
-            PyErr_Clear();
+        if (_PyObject_CallMethodId(modules, &PyId_clear, "") == NULL) {
+            PyErr_WriteUnraisable(NULL);
+        }
     }
     /* Restore the original builtins dict, to ensure that any
        user data gets cleared. */
     dict = PyDict_Copy(interp->builtins);
-    if (dict == NULL)
-        PyErr_Clear();
+    if (dict == NULL) {
+        PyErr_WriteUnraisable(NULL);
+    }
     PyDict_Clear(interp->builtins);
-    if (PyDict_Update(interp->builtins, interp->builtins_copy))
+    if (PyDict_Update(interp->builtins, interp->builtins_copy)) {
         PyErr_Clear();
+    }
     Py_XDECREF(dict);
     /* Clear module dict copies stored in the interpreter state */
     _PyState_ClearModules();



More information about the Python-checkins mailing list