]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-113157 gh-89519: Fix method descriptors (gh-113233)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Thu, 21 Dec 2023 22:08:35 +0000 (16:08 -0600)
committerGitHub <noreply@github.com>
Thu, 21 Dec 2023 22:08:35 +0000 (16:08 -0600)
Restore behaviors before classmethod descriptor chaining was introduced.

Lib/test/test_descr.py
Objects/classobject.c

index 4a3db80ca43c2733c6f3a11a0284695b45d7b931..fd0af9b30a0a71a5672d1ab192d57f40b5507972 100644 (file)
@@ -5004,6 +5004,21 @@ class ClassPropertiesAndMethods(unittest.TestCase):
         gc.collect()
         self.assertEqual(Parent.__subclasses__(), [])
 
+    def test_instance_method_get_behavior(self):
+        # test case for gh-113157
+
+        class A:
+            def meth(self):
+                return self
+
+        class B:
+            pass
+
+        a = A()
+        b = B()
+        b.meth = a.meth.__get__(b, B)
+        self.assertEqual(b.meth(), a)
+
     def test_attr_raise_through_property(self):
         # test case for gh-103272
         class A:
index 618d88894debbeaf496e5ed35269081f3b3fb8a1..d7e520f556d9a0ff91a9710351349146b52564da 100644 (file)
@@ -319,6 +319,13 @@ method_traverse(PyMethodObject *im, visitproc visit, void *arg)
     return 0;
 }
 
+static PyObject *
+method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
+{
+    Py_INCREF(meth);
+    return meth;
+}
+
 PyTypeObject PyMethod_Type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     .tp_name = "method",
@@ -339,6 +346,7 @@ PyTypeObject PyMethod_Type = {
     .tp_methods = method_methods,
     .tp_members = method_memberlist,
     .tp_getset = method_getset,
+    .tp_descr_get = method_descr_get,
     .tp_new = method_new,
 };