[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