[Python-checkins] bpo-37388: Don't check encoding/errors during finalization (GH-19409)

Victor Stinner webhook-mailer at python.org
Tue Apr 7 10:07:51 EDT 2020


https://github.com/python/cpython/commit/d8acf0d9aae71d1897e8f91989bd8bfb4a9ef9c6
commit: d8acf0d9aae71d1897e8f91989bd8bfb4a9ef9c6
branch: master
author: Victor Stinner <vstinner at python.org>
committer: GitHub <noreply at github.com>
date: 2020-04-07T16:07:42+02:00
summary:

bpo-37388: Don't check encoding/errors during finalization (GH-19409)

str.encode() and str.decode() no longer check the encoding and errors
in development mode or in debug mode during Python finalization. The
codecs machinery can no longer work on very late calls to
str.encode() and str.decode().

This change should help to call _PyObject_Dump() to debug during late
Python finalization.

files:
A Misc/NEWS.d/next/Core and Builtins/2020-04-07-15-44-29.bpo-37388.stlxBq.rst
M Objects/unicodeobject.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-04-07-15-44-29.bpo-37388.stlxBq.rst b/Misc/NEWS.d/next/Core and Builtins/2020-04-07-15-44-29.bpo-37388.stlxBq.rst
new file mode 100644
index 0000000000000..1da58d111912c
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-04-07-15-44-29.bpo-37388.stlxBq.rst	
@@ -0,0 +1,4 @@
+str.encode() and str.decode() no longer check the encoding and errors in
+development mode or in debug mode during Python finalization. The codecs
+machinery can no longer work on very late calls to str.encode() and
+str.decode().
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 9d51c8a685ebe..da17bfe01f310 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -451,6 +451,12 @@ unicode_check_encoding_errors(const char *encoding, const char *errors)
         return 0;
     }
 
+    /* Disable checks during Python finalization. For example, it allows to
+       call _PyObject_Dump() during finalization for debugging purpose. */
+    if (interp->finalizing) {
+        return 0;
+    }
+
     if (encoding != NULL) {
         PyObject *handler = _PyCodec_Lookup(encoding);
         if (handler == NULL) {



More information about the Python-checkins mailing list