Commit 2e8474dd authored by Victor Stinner's avatar Victor Stinner

Issue #18408: slot_tp_str() must not fallback on slot_tp_repr() on error

type->tp_str must not point to slot_tp_str() if type has no __str__ attribute,
so there is no reason for slot_tp_str() to fallback on slot_tp_str() on lookup
error. Moreover, calling PyErr_Clear() may hide a real bug like MemoryError.

If __str__ attribute is removed, slots must be updated (which is done by
type_setattro()).
parent 54e4ca76
......@@ -5274,29 +5274,12 @@ slot_tp_str(PyObject *self)
_Py_IDENTIFIER(__str__);
func = lookup_method(self, &PyId___str__);
if (func != NULL) {
if (func == NULL)
return NULL;
res = PyEval_CallObject(func, NULL);
Py_DECREF(func);
return res;
}
else {
/* PyObject *ress; */
PyErr_Clear();
res = slot_tp_repr(self);
if (!res)
return NULL;
/* XXX this is non-sensical. Why should we return
a bytes object from __str__. Is this code even
used? - mvl */
assert(0);
return res;
/*
ress = _PyUnicode_AsDefaultEncodedString(res);
Py_DECREF(res);
return ress;
*/
}
}
static Py_hash_t
slot_tp_hash(PyObject *self)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment