This commit is contained in:
Benjamin Peterson 2012-04-24 11:09:20 -04:00
commit 42f58818d6
3 changed files with 18 additions and 3 deletions

View file

@ -4438,7 +4438,15 @@ order (MRO) for bases """
pass pass
Foo.__repr__ = Foo.__str__ Foo.__repr__ = Foo.__str__
foo = Foo() foo = Foo()
str(foo) self.assertRaises(RuntimeError, str, foo)
self.assertRaises(RuntimeError, repr, foo)
def test_mixing_slot_wrappers(self):
class X(dict):
__setattr__ = dict.__setitem__
x = X()
x.y = 42
self.assertEqual(x["y"], 42)
def test_slot_shadows_class_variable(self): def test_slot_shadows_class_variable(self):
with self.assertRaises(ValueError) as cm: with self.assertRaises(ValueError) as cm:

View file

@ -14,6 +14,12 @@ Core and Builtins
their keys with other dictionaries. Classes take advantage of this to share their keys with other dictionaries. Classes take advantage of this to share
their instance dictionary keys for improved memory and performance. their instance dictionary keys for improved memory and performance.
- Issue #11603 (again): Setting __repr__ to __str__ now raises a RuntimeError
when repr() or str() is called on such an object.
- Issue #14658: Fix binding a special method to a builtin implementation of a
special method with a different name.
- Issue #14630: Fix a memory access bug for instances of a subclass of int - Issue #14630: Fix a memory access bug for instances of a subclass of int
with value 0. with value 0.

View file

@ -3035,7 +3035,7 @@ object_str(PyObject *self)
unaryfunc f; unaryfunc f;
f = Py_TYPE(self)->tp_repr; f = Py_TYPE(self)->tp_repr;
if (f == NULL || f == object_str) if (f == NULL)
f = object_repr; f = object_repr;
return f(self); return f(self);
} }
@ -5879,7 +5879,8 @@ update_one_slot(PyTypeObject *type, slotdef *p)
} }
continue; continue;
} }
if (Py_TYPE(descr) == &PyWrapperDescr_Type) { if (Py_TYPE(descr) == &PyWrapperDescr_Type &&
((PyWrapperDescrObject *)descr)->d_base->name_strobj == p->name_strobj) {
void **tptr = resolve_slotdups(type, p->name_strobj); void **tptr = resolve_slotdups(type, p->name_strobj);
if (tptr == NULL || tptr == ptr) if (tptr == NULL || tptr == ptr)
generic = p->function; generic = p->function;