mirror of
https://github.com/python/cpython.git
synced 2024-11-30 10:41:14 +01: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);
|
||
|
}
|