mirror of https://github.com/python/cpython.git
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()).
This commit is contained in:
parent
54e4ca76c9
commit
2e8474ddde
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue