summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeroen Demeyer <J.Demeyer@UGent.be>2019-06-17 11:53:21 (GMT)
committerInada Naoki <songofacandy@gmail.com>2019-06-17 11:53:20 (GMT)
commit2e9954d3472a23919b96323fcd5bb6c1d6927155 (patch)
tree39523411183191750fd007cb2d3cb27d0ba08b62
parent0456df4a55ec9a4e8f4425df92bbe63a290f3f2f (diff)
downloadcpython-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.py2
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2019-06-06-13-59-52.bpo-36922.EMZ3TF.rst1
-rw-r--r--Objects/typeobject.c2
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);