diff options
author | Jeroen Demeyer <J.Demeyer@UGent.be> | 2019-06-17 11:53:21 (GMT) |
---|---|---|
committer | Inada Naoki <songofacandy@gmail.com> | 2019-06-17 11:53:20 (GMT) |
commit | 2e9954d3472a23919b96323fcd5bb6c1d6927155 (patch) | |
tree | 39523411183191750fd007cb2d3cb27d0ba08b62 | |
parent | 0456df4a55ec9a4e8f4425df92bbe63a290f3f2f (diff) | |
download | cpython-2e9954d3472a23919b96323fcd5bb6c1d6927155.zip cpython-2e9954d3472a23919b96323fcd5bb6c1d6927155.tar.gz cpython-2e9954d3472a23919b96323fcd5bb6c1d6927155.tar.bz2 |
bpo-36922: use Py_TPFLAGS_METHOD_DESCRIPTOR in lookup_maybe_method() (GH-13865)
-rw-r--r-- | Lib/test/test_descr.py | 2 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst | 1 | ||||
-rw-r--r-- | Objects/typeobject.c | 2 |
3 files changed, 4 insertions, 1 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 301a2d2..0b43549 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4647,9 +4647,11 @@ order (MRO) for bases """ def test_mixing_slot_wrappers(self): class X(dict): __setattr__ = dict.__setitem__ + __neg__ = dict.copy x = X() x.y = 42 self.assertEqual(x["y"], 42) + self.assertEqual(x, -x) def test_slot_shadows_class_variable(self): with self.assertRaises(ValueError) as cm: diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst b/Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst new file mode 100644 index 0000000..c2a2ad4 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst @@ -0,0 +1 @@ +Slot functions optimize any callable with ``Py_TPFLAGS_METHOD_DESCRIPTOR`` instead of only instances of ``function``.
\ No newline at end of file diff --git a/Objects/typeobject.c b/Objects/typeobject.c index ba128a9..e495251 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1412,7 +1412,7 @@ lookup_maybe_method(PyObject *self, _Py_Identifier *attrid, int *unbound) return NULL; } - if (PyFunction_Check(res)) { + if (PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)) { /* Avoid temporary PyMethodObject */ *unbound = 1; Py_INCREF(res); |