summaryrefslogtreecommitdiffstats
path: root/Modules/_testcapimodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_testcapimodule.c')
-rw-r--r--Modules/_testcapimodule.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
new file mode 100644
index 0000000..1b3b596
--- /dev/null
+++ b/Modules/_testcapimodule.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_testcapi(void)
+{
+ PyObject *m, *d;
+
+ m = Py_InitModule("_testcapi", TestMethods);
+
+ TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
+ d = PyModule_GetDict(m);
+ PyDict_SetItemString(d, "error", TestError);
+}