mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * C Extension module to test Python interpreter C APIs.
 | |
|  *
 | |
|  * The 'test_*' functions exported by this module are run as part of the
 | |
|  * standard Python regression test, via Lib/test/test_capi.py.
 | |
|  */
 | |
| 
 | |
| #include "Python.h"
 | |
| 
 | |
| static PyObject *TestError;	/* set to exception object in init */
 | |
| 
 | |
| /* Test #defines from config.h (particularly the SIZEOF_* defines).
 | |
| 
 | |
|    The ones derived from autoconf on the UNIX-like OSes can be relied
 | |
|    upon (in the absence of sloppy cross-compiling), but the Windows
 | |
|    platforms have these hardcoded.  Better safe than sorry.
 | |
| */
 | |
| static PyObject*
 | |
| sizeof_error(const char* fatname, const char* typename,
 | |
|         int expected, int got)
 | |
| {
 | |
| 	char buf[1024];
 | |
| 	sprintf(buf, "%s #define == %d but sizeof(%s) == %d",
 | |
| 		fatname, expected, typename, got);
 | |
| 	PyErr_SetString(TestError, buf);
 | |
| 	return (PyObject*)NULL;
 | |
| }
 | |
| 
 | |
| static PyObject*
 | |
| test_config(PyObject *self, PyObject *args)
 | |
| {
 | |
|         if (!PyArg_ParseTuple(args, ":test_config"))
 | |
|                 return NULL;
 | |
| 
 | |
| #define CHECK_SIZEOF(FATNAME, TYPE) \
 | |
| 	    if (FATNAME != sizeof(TYPE)) \
 | |
|     	    	return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
 | |
| 
 | |
| 	CHECK_SIZEOF(SIZEOF_INT, int);
 | |
| 	CHECK_SIZEOF(SIZEOF_LONG, long);
 | |
| 	CHECK_SIZEOF(SIZEOF_VOID_P, void*);
 | |
| 	CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
 | |
| #ifdef HAVE_LONG_LONG
 | |
| 	CHECK_SIZEOF(SIZEOF_LONG_LONG, LONG_LONG);
 | |
| #endif
 | |
| 
 | |
| #undef CHECK_SIZEOF
 | |
| 
 | |
| 	Py_INCREF(Py_None);
 | |
| 	return Py_None;
 | |
| }
 | |
| 
 | |
| static PyMethodDef TestMethods[] = {
 | |
| 	{"test_config", test_config, METH_VARARGS},
 | |
| 	{NULL, NULL} /* sentinel */
 | |
| };
 | |
| 
 | |
| DL_EXPORT(void)
 | |
| init_test(void)
 | |
| {
 | |
| 	PyObject *m, *d;
 | |
| 
 | |
| 	m = Py_InitModule("_test", TestMethods);
 | |
| 
 | |
| 	TestError = PyErr_NewException("_test.error", NULL, NULL);
 | |
| 	d = PyModule_GetDict(m);
 | |
| 	PyDict_SetItemString(d, "error", TestError);
 | |
| }
 | 
