[Python-checkins] cpython: Close #19442: warn_explicit() does nothing when called late during Python

victor.stinner python-checkins at python.org
Fri Nov 1 00:55:45 CET 2013


http://hg.python.org/cpython/rev/13a05ed33cf7
changeset:   86816:13a05ed33cf7
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Fri Nov 01 00:55:30 2013 +0100
summary:
  Close #19442: warn_explicit() does nothing when called late during Python shutdown

After more tests, I now think that it is the safest option.

files:
  Python/_warnings.c |  18 +++++++++---------
  1 files changed, 9 insertions(+), 9 deletions(-)


diff --git a/Python/_warnings.c b/Python/_warnings.c
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -333,6 +333,13 @@
     PyObject *action;
     int rc;
 
+    /* module can be None if a warning is emitted late during Python shutdown.
+       In this case, the Python warnings module was probably unloaded, filters
+       are no more available to choose as action. It is safer to ignore the
+       warning and do nothing. */
+    if (module == Py_None)
+        Py_RETURN_NONE;
+
     if (registry && !PyDict_Check(registry) && (registry != Py_None)) {
         PyErr_SetString(PyExc_TypeError, "'registry' must be a dict");
         return NULL;
@@ -635,15 +642,8 @@
     if (!setup_context(stack_level, &filename, &lineno, &module, &registry))
         return NULL;
 
-    if (module != Py_None) {
-        res = warn_explicit(category, message, filename, lineno, module, registry,
-                            NULL);
-    }
-    else {
-        /* FIXME: emitting warnings at exit does crash Python */
-        res = Py_None;
-        Py_INCREF(res);
-    }
+    res = warn_explicit(category, message, filename, lineno, module, registry,
+                        NULL);
     Py_DECREF(filename);
     Py_DECREF(registry);
     Py_DECREF(module);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list