Skip to content

Commit

Permalink
gh-98421: Clean Up PyObject_Print (GH-98422)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
MonadChains authored Oct 20, 2022
1 parent e48f9b2 commit c60b3b3
Showing 1 changed file with 8 additions and 17 deletions.
25 changes: 8 additions & 17 deletions Objects/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit c60b3b3

Please sign in to comment.