mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
	
	
		
			69 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			69 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);
							 | 
						||
| 
								 | 
							
								}
							 |