diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-07-11 20:46:11 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-07-11 20:46:11 (GMT) |
commit | 2e8474ddde61204b2671225cf4482dbc6fab4ea1 (patch) | |
tree | 537985e9e76380ca0006ed0f7643591c9821a100 /Objects | |
parent | 54e4ca76c9470b81e3ae72a23aac59907f633fe1 (diff) | |
download | cpython-2e8474ddde61204b2671225cf4482dbc6fab4ea1.zip cpython-2e8474ddde61204b2671225cf4482dbc6fab4ea1.tar.gz cpython-2e8474ddde61204b2671225cf4482dbc6fab4ea1.tar.bz2 |
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()).
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/typeobject.c | 21 |
1 files changed, 2 insertions, 19 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 13ea1ca..6eb2cf1 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -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) |