From f841aa6fc0024a6c94e4e507ec943b13cbec17cc Mon Sep 17 00:00:00 2001 From: Fred Drake Date: Thu, 28 Mar 2002 15:49:54 +0000 Subject: Add a simple test of the METH_CLASS and METH_STATIC flags for type methods. --- Lib/test/test_descr.py | 30 ++++++++++++++++++++++++++++++ Modules/xxsubtype.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 830cd08..f52edb6 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1214,6 +1214,20 @@ def classmethods(): vereq(ff.__get__(0, int)(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(): if verbose: print "Testing static methods..." class C(object): @@ -1231,6 +1245,20 @@ def staticmethods(): vereq(d.foo(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(): if verbose: print "Testing classic classes..." class C: @@ -2884,7 +2912,9 @@ def test_main(): dynamics() errors() classmethods() + classmethods_in_c() staticmethods() + staticmethods_in_c() classic() compattr() newslot() diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c index 3b91a0c..7a7cc1e 100644 --- a/Modules/xxsubtype.c +++ b/Modules/xxsubtype.c @@ -43,11 +43,39 @@ spamlist_setstate(spamlistobject *self, PyObject *args) 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[] = { {"getstate", (PyCFunction)spamlist_getstate, METH_VARARGS, "getstate() -> state"}, {"setstate", (PyCFunction)spamlist_setstate, METH_VARARGS, "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}, }; -- cgit v0.12