diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 862fc778859..dd851687dc4 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1214,6 +1214,14 @@ def classmethods(): vereq(ff.__get__(0, int)(42), (int, 42)) vereq(ff.__get__(0)(42), (int, 42)) + # Test super() with classmethods (SF bug 535444) + veris(C.goo.im_self, C) + veris(D.goo.im_self, D) + veris(super(D,D).goo.im_self, D) + veris(super(D,d).goo.im_self, D) + vereq(super(D,D).goo(), (D,)) + vereq(super(D,d).goo(), (D,)) + def classmethods_in_c(): if verbose: print "Testing C-based class methods..." import xxsubtype as spam diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 474a97c322c..a2fe27ceb80 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4021,10 +4021,13 @@ super_getattro(PyObject *self, PyObject *name) if (su->obj != NULL) { PyObject *mro, *res, *tmp, *dict; + PyTypeObject *starttype; descrgetfunc f; int i, n; - mro = su->obj->ob_type->tp_mro; + starttype = su->obj->ob_type; + mro = starttype->tp_mro; + if (mro == NULL) n = 0; else { @@ -4036,7 +4039,8 @@ super_getattro(PyObject *self, PyObject *name) break; } if (i >= n && PyType_Check(su->obj)) { - mro = ((PyTypeObject *)(su->obj))->tp_mro; + starttype = (PyTypeObject *)(su->obj); + mro = starttype->tp_mro; if (mro == NULL) n = 0; else { @@ -4064,7 +4068,7 @@ super_getattro(PyObject *self, PyObject *name) Py_INCREF(res); f = res->ob_type->tp_descr_get; if (f != NULL) { - tmp = f(res, su->obj, res); + tmp = f(res, su->obj, (PyObject *)starttype); Py_DECREF(res); res = tmp; }