mirror of https://github.com/python/cpython.git
Add a simple test of the METH_CLASS and METH_STATIC flags for type methods.
This commit is contained in:
parent
4157ffbb96
commit
f841aa6fc0
|
@ -1214,6 +1214,20 @@ def f(cls, arg): return (cls, arg)
|
||||||
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))
|
||||||
|
|
||||||
|
def classmethods_in_c():
|
||||||
|
if verbose: print "Testing C-based class methods..."
|
||||||
|
import xxsubtype as spam
|
||||||
|
a = (1, 2, 3)
|
||||||
|
d = {'abc': 123}
|
||||||
|
x, a1, d1 = spam.spamlist.classmeth(*a, **d)
|
||||||
|
veris(x, None)
|
||||||
|
vereq((spam.spamlist,) + a, a1)
|
||||||
|
vereq(d, d1)
|
||||||
|
x, a1, d1 = spam.spamlist().classmeth(*a, **d)
|
||||||
|
veris(x, None)
|
||||||
|
vereq((spam.spamlist,) + a, a1)
|
||||||
|
vereq(d, d1)
|
||||||
|
|
||||||
def staticmethods():
|
def staticmethods():
|
||||||
if verbose: print "Testing static methods..."
|
if verbose: print "Testing static methods..."
|
||||||
class C(object):
|
class C(object):
|
||||||
|
@ -1231,6 +1245,20 @@ class D(C):
|
||||||
vereq(d.foo(1), (d, 1))
|
vereq(d.foo(1), (d, 1))
|
||||||
vereq(D.foo(d, 1), (d, 1))
|
vereq(D.foo(d, 1), (d, 1))
|
||||||
|
|
||||||
|
def staticmethods_in_c():
|
||||||
|
if verbose: print "Testing C-based static methods..."
|
||||||
|
import xxsubtype as spam
|
||||||
|
a = (1, 2, 3)
|
||||||
|
d = {"abc": 123}
|
||||||
|
x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
|
||||||
|
veris(x, None)
|
||||||
|
vereq(a, a1)
|
||||||
|
vereq(d, d1)
|
||||||
|
x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
|
||||||
|
veris(x, None)
|
||||||
|
vereq(a, a1)
|
||||||
|
vereq(d, d1)
|
||||||
|
|
||||||
def classic():
|
def classic():
|
||||||
if verbose: print "Testing classic classes..."
|
if verbose: print "Testing classic classes..."
|
||||||
class C:
|
class C:
|
||||||
|
@ -2884,7 +2912,9 @@ def test_main():
|
||||||
dynamics()
|
dynamics()
|
||||||
errors()
|
errors()
|
||||||
classmethods()
|
classmethods()
|
||||||
|
classmethods_in_c()
|
||||||
staticmethods()
|
staticmethods()
|
||||||
|
staticmethods_in_c()
|
||||||
classic()
|
classic()
|
||||||
compattr()
|
compattr()
|
||||||
newslot()
|
newslot()
|
||||||
|
|
|
@ -43,11 +43,39 @@ spamlist_setstate(spamlistobject *self, PyObject *args)
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
spamlist_specialmeth(PyObject *self, PyObject *args, PyObject *kw)
|
||||||
|
{
|
||||||
|
PyObject *result = PyTuple_New(3);
|
||||||
|
|
||||||
|
if (result != NULL) {
|
||||||
|
if (self == NULL)
|
||||||
|
self = Py_None;
|
||||||
|
if (kw == NULL)
|
||||||
|
kw = Py_None;
|
||||||
|
Py_INCREF(self);
|
||||||
|
PyTuple_SET_ITEM(result, 0, self);
|
||||||
|
Py_INCREF(args);
|
||||||
|
PyTuple_SET_ITEM(result, 1, args);
|
||||||
|
Py_INCREF(kw);
|
||||||
|
PyTuple_SET_ITEM(result, 2, kw);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static PyMethodDef spamlist_methods[] = {
|
static PyMethodDef spamlist_methods[] = {
|
||||||
{"getstate", (PyCFunction)spamlist_getstate, METH_VARARGS,
|
{"getstate", (PyCFunction)spamlist_getstate, METH_VARARGS,
|
||||||
"getstate() -> state"},
|
"getstate() -> state"},
|
||||||
{"setstate", (PyCFunction)spamlist_setstate, METH_VARARGS,
|
{"setstate", (PyCFunction)spamlist_setstate, METH_VARARGS,
|
||||||
"setstate(state)"},
|
"setstate(state)"},
|
||||||
|
/* These entries differ only in the flags; they are used by the tests
|
||||||
|
in test.test_descr. */
|
||||||
|
{"classmeth", (PyCFunction)spamlist_specialmeth,
|
||||||
|
METH_VARARGS | METH_KEYWORDS | METH_CLASS,
|
||||||
|
"classmeth(*args, **kw)"},
|
||||||
|
{"staticmeth", (PyCFunction)spamlist_specialmeth,
|
||||||
|
METH_VARARGS | METH_KEYWORDS | METH_STATIC,
|
||||||
|
"staticmeth(*args, **kw)"},
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue