use __qualname__ to compute bound method repr (closes #21389)

Patch from Steven Barker.
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 0c0bd47..07cb639 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -15,6 +15,7 @@
 #endif
 
 _Py_IDENTIFIER(__name__);
+_Py_IDENTIFIER(__qualname__);
 
 PyObject *
 PyMethod_Function(PyObject *im)
@@ -243,51 +244,33 @@
 {
     PyObject *self = a->im_self;
     PyObject *func = a->im_func;
-    PyObject *klass;
-    PyObject *funcname = NULL ,*klassname = NULL, *result = NULL;
-    char *defname = "?";
+    PyObject *funcname = NULL, *result = NULL;
+    const char *defname = "?";
 
-    if (self == NULL) {
-        PyErr_BadInternalCall();
-        return NULL;
-    }
-    klass = (PyObject*)Py_TYPE(self);
-
-    funcname = _PyObject_GetAttrId(func, &PyId___name__);
+    funcname = _PyObject_GetAttrId(func, &PyId___qualname__);
     if (funcname == NULL) {
         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
             return NULL;
         PyErr_Clear();
+
+        funcname = _PyObject_GetAttrId(func, &PyId___name__);
+        if (funcname == NULL) {
+            if (!PyErr_ExceptionMatches(PyExc_AttributeError))
+                return NULL;
+            PyErr_Clear();
+        }
     }
-    else if (!PyUnicode_Check(funcname)) {
+    
+    if (funcname != NULL && !PyUnicode_Check(funcname)) {
         Py_DECREF(funcname);
         funcname = NULL;
     }
 
-    if (klass == NULL)
-        klassname = NULL;
-    else {
-        klassname = _PyObject_GetAttrId(klass, &PyId___name__);
-        if (klassname == NULL) {
-            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
-                Py_XDECREF(funcname);
-                return NULL;
-            }
-            PyErr_Clear();
-        }
-        else if (!PyUnicode_Check(klassname)) {
-            Py_DECREF(klassname);
-            klassname = NULL;
-        }
-    }
-
     /* XXX Shouldn't use repr()/%R here! */
-    result = PyUnicode_FromFormat("<bound method %V.%V of %R>",
-                                  klassname, defname,
+    result = PyUnicode_FromFormat("<bound method %V of %R>",
                                   funcname, defname, self);
 
     Py_XDECREF(funcname);
-    Py_XDECREF(klassname);
     return result;
 }