mirror of
https://github.com/python/cpython.git
synced 2025-07-25 12:14:38 +00:00
SF patch 537536 by Phillip J. Eby, fix for SF bug 535444, super()
broken w/ classmethods. Bugfix candidate.
This commit is contained in:
parent
103b548a76
commit
155db9aa22
2 changed files with 15 additions and 3 deletions
|
@ -1214,6 +1214,14 @@ def classmethods():
|
||||||
vereq(ff.__get__(0, int)(42), (int, 42))
|
vereq(ff.__get__(0, int)(42), (int, 42))
|
||||||
vereq(ff.__get__(0)(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():
|
def classmethods_in_c():
|
||||||
if verbose: print "Testing C-based class methods..."
|
if verbose: print "Testing C-based class methods..."
|
||||||
import xxsubtype as spam
|
import xxsubtype as spam
|
||||||
|
|
|
@ -4021,10 +4021,13 @@ super_getattro(PyObject *self, PyObject *name)
|
||||||
|
|
||||||
if (su->obj != NULL) {
|
if (su->obj != NULL) {
|
||||||
PyObject *mro, *res, *tmp, *dict;
|
PyObject *mro, *res, *tmp, *dict;
|
||||||
|
PyTypeObject *starttype;
|
||||||
descrgetfunc f;
|
descrgetfunc f;
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
||||||
mro = su->obj->ob_type->tp_mro;
|
starttype = su->obj->ob_type;
|
||||||
|
mro = starttype->tp_mro;
|
||||||
|
|
||||||
if (mro == NULL)
|
if (mro == NULL)
|
||||||
n = 0;
|
n = 0;
|
||||||
else {
|
else {
|
||||||
|
@ -4036,7 +4039,8 @@ super_getattro(PyObject *self, PyObject *name)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i >= n && PyType_Check(su->obj)) {
|
if (i >= n && PyType_Check(su->obj)) {
|
||||||
mro = ((PyTypeObject *)(su->obj))->tp_mro;
|
starttype = (PyTypeObject *)(su->obj);
|
||||||
|
mro = starttype->tp_mro;
|
||||||
if (mro == NULL)
|
if (mro == NULL)
|
||||||
n = 0;
|
n = 0;
|
||||||
else {
|
else {
|
||||||
|
@ -4064,7 +4068,7 @@ super_getattro(PyObject *self, PyObject *name)
|
||||||
Py_INCREF(res);
|
Py_INCREF(res);
|
||||||
f = res->ob_type->tp_descr_get;
|
f = res->ob_type->tp_descr_get;
|
||||||
if (f != NULL) {
|
if (f != NULL) {
|
||||||
tmp = f(res, su->obj, res);
|
tmp = f(res, su->obj, (PyObject *)starttype);
|
||||||
Py_DECREF(res);
|
Py_DECREF(res);
|
||||||
res = tmp;
|
res = tmp;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue