instance_getattr2(): rewritten to remove unnecessary stuff and
streamlined a bit.

instancemethod_descr_get(): don't bind an unbound method of a class
that's not a base class of the argument class.
diff --git a/Objects/classobject.c b/Objects/classobject.c
index b4944f3..9652dfe 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -649,15 +649,14 @@
 	PyClassObject *class;
 	descrgetfunc f;
 
-	class = NULL;
 	v = PyDict_GetItem(inst->in_dict, name);
-	if (v == NULL) {
-		v = class_lookup(inst->in_class, name, &class);
-		if (v == NULL)
-			return v;
+	if (v != NULL) {
+		Py_INCREF(v);
+		return v;
 	}
-	Py_INCREF(v);
-	if (class != NULL) {
+	v = class_lookup(inst->in_class, name, &class);
+	if (v != NULL) {
+		Py_INCREF(v);
 		f = v->ob_type->tp_descr_get;
 		if (f != NULL) {
 			PyObject *w = f(v, (PyObject *)inst,
@@ -665,19 +664,6 @@
 			Py_DECREF(v);
 			v = w;
 		}
-		else if (PyMethod_Check(v)) {
-			/* XXX This should be a tp_descr_get slot of
-			   PyMethodObjects */
-			PyObject *im_class = PyMethod_GET_CLASS(v);
-			/* Only if classes are compatible */
-			if (PyClass_IsSubclass((PyObject *)class, im_class)) {
-				PyObject *im_func = PyMethod_GET_FUNCTION(v);
-				PyObject *w = PyMethod_New(im_func,
-						(PyObject *)inst, im_class);
-				Py_DECREF(v);
-				v = w;
-			}
-		}
 	}
 	return v;
 }
@@ -2194,16 +2180,19 @@
 }
 
 static PyObject *
-instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *type)
+instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *class)
 {
-	if (PyMethod_GET_SELF(meth) != NULL) {
-		/* Don't rebind an already bound method */
+	/* Don't rebind an already bound method, or an unbound method
+	   of a class that's not a base class of class */
+	if (PyMethod_GET_SELF(meth) != NULL ||
+	    (PyMethod_GET_CLASS(meth) != NULL &&
+	     !PyObject_IsSubclass(class,  PyMethod_GET_CLASS(meth)))) {
 		Py_INCREF(meth);
 		return meth;
 	}
 	if (obj == Py_None)
 		obj = NULL;
-	return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, type);
+	return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, class);
 }
 
 PyTypeObject PyMethod_Type = {