]> granicus.if.org Git - python/commitdiff
SF patch 537536 by Phillip J. Eby, fix for SF bug 535444, super()
authorGuido van Rossum <guido@python.org>
Tue, 2 Apr 2002 17:53:47 +0000 (17:53 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 2 Apr 2002 17:53:47 +0000 (17:53 +0000)
broken w/ classmethods.

Bugfix candidate.

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

index 862fc778859de0181edf356fc918a0dd1e51beef..dd851687dc45321c5518e0b7b1231cbe77aedda7 100644 (file)
@@ -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
index 474a97c322c2116e73fe8803bade32112b3096f4..a2fe27ceb80f451ba69117e5ec0236da5e1c31ca 100644 (file)
@@ -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;
                                }