Kaydet (Commit) 42f58818 authored tarafından Benjamin Peterson's avatar Benjamin Peterson

merge 3.2 (#14658)

...@@ -4438,7 +4438,15 @@ order (MRO) for bases """ ...@@ -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:
......
...@@ -14,6 +14,12 @@ Core and Builtins ...@@ -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.
......
...@@ -3035,7 +3035,7 @@ object_str(PyObject *self) ...@@ -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) ...@@ -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;
......
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