]> granicus.if.org Git - python/commitdiff
Add a simple test of the METH_CLASS and METH_STATIC flags for type methods.
authorFred Drake <fdrake@acm.org>
Thu, 28 Mar 2002 15:49:54 +0000 (15:49 +0000)
committerFred Drake <fdrake@acm.org>
Thu, 28 Mar 2002 15:49:54 +0000 (15:49 +0000)
Lib/test/test_descr.py
Modules/xxsubtype.c

index 830cd08b36c2c25e19f86da75cf1282d668fcc83..f52edb629ac63e725b7c77663042ae8b4b02552e 100644 (file)
@@ -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()
index 3b91a0c598fcad60b2c933de3c3bbdf2558ae09b..7a7cc1ecd4c11f605f900fae0dfdb6706f00d668 100644 (file)
@@ -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},
 };