mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	Add a simple test of the METH_CLASS and METH_STATIC flags for type methods.
This commit is contained in:
		
							parent
							
								
									4157ffbb96
								
							
						
					
					
						commit
						f841aa6fc0
					
				
					 2 changed files with 58 additions and 0 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Fred Drake
						Fred Drake