summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-07-11 20:46:11 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-07-11 20:46:11 (GMT)
commit2e8474ddde61204b2671225cf4482dbc6fab4ea1 (patch)
tree537985e9e76380ca0006ed0f7643591c9821a100 /Objects
parent54e4ca76c9470b81e3ae72a23aac59907f633fe1 (diff)
downloadcpython-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.c21
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)