[Python-checkins] gh-98421: Clean Up PyObject_Print (GH-98422)

encukou webhook-mailer at python.org
Thu Oct 20 09:59:17 EDT 2022


https://github.com/python/cpython/commit/c60b3b3cca9cab5f5dab7217660c45ebfdb1d7b8
commit: c60b3b3cca9cab5f5dab7217660c45ebfdb1d7b8
branch: main
author: MonadChains <monadchains at gmail.com>
committer: encukou <encukou at gmail.com>
date: 2022-10-20T15:59:10+02:00
summary:

gh-98421: Clean Up PyObject_Print (GH-98422)

Work on test coverage for `PyObject_Print` made it clear that some lines can't get executed.
Simplify the function by excluding the checks for non-string types.
Also eliminate creating a temporary bytes object.

files:
M Objects/object.c

diff --git a/Objects/object.c b/Objects/object.c
index 26cdcef59ddd..837f0a1a578c 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -282,31 +282,22 @@ PyObject_Print(PyObject *op, FILE *fp, int flags)
                 s = PyObject_Str(op);
             else
                 s = PyObject_Repr(op);
-            if (s == NULL)
+            if (s == NULL) {
                 ret = -1;
-            else if (PyBytes_Check(s)) {
-                fwrite(PyBytes_AS_STRING(s), 1,
-                       PyBytes_GET_SIZE(s), fp);
             }
-            else if (PyUnicode_Check(s)) {
-                PyObject *t;
-                t = PyUnicode_AsEncodedString(s, "utf-8", "backslashreplace");
+            else {
+                assert(PyUnicode_Check(s));
+                const char *t;
+                Py_ssize_t len;
+                t = PyUnicode_AsUTF8AndSize(s, &len);
                 if (t == NULL) {
                     ret = -1;
                 }
                 else {
-                    fwrite(PyBytes_AS_STRING(t), 1,
-                           PyBytes_GET_SIZE(t), fp);
-                    Py_DECREF(t);
+                    fwrite(t, 1, len, fp);
                 }
+                Py_DECREF(s);
             }
-            else {
-                PyErr_Format(PyExc_TypeError,
-                             "str() or repr() returned '%.100s'",
-                             Py_TYPE(s)->tp_name);
-                ret = -1;
-            }
-            Py_XDECREF(s);
         }
     }
     if (ret == 0) {



More information about the Python-checkins mailing list