From 501c7c7d0eb8c8fb1a9384092efed0141052f324 Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Thu, 16 Aug 2001 20:41:56 +0000
Subject: classobject.c:instancemethod_descr_get(): when a bound method is
 assigned to a class variable and then accessed via an instance, it should not
 be rebound.

test_descr.py:methods(): test for the condition above.
---
 Lib/test/test_descr.py | 2 +-
 Objects/classobject.c  | 5 +++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 4d1f817..f524dba 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -862,7 +862,7 @@ def methods():
     d2 = D(2)
     verify(d2.foo() == 2)
     verify(d2.boo() == 2)
-    verify(d2.goo() == 2)
+    verify(d2.goo() == 1)
 
 def specials():
     # Test operators like __hash__ for which a built-in default exists
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 255a432..82eb1d5 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -2196,6 +2196,11 @@ instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
 static PyObject *
 instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *type)
 {
+	if (PyMethod_GET_SELF(meth) != NULL) {
+		/* Don't rebind an already bound method */
+		Py_INCREF(meth);
+		return meth;
+	}
 	if (obj == Py_None)
 		obj = NULL;
 	return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, type);
-- 
cgit v0.12

