diff options
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_testmodule.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/Modules/_testmodule.c b/Modules/_testmodule.c new file mode 100644 index 0000000..e4c9c75 --- /dev/null +++ b/Modules/_testmodule.c @@ -0,0 +1,68 @@ +/* + * 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); +} |