2019-04-18 06:37:26 -03:00
|
|
|
/*
|
|
|
|
* C Extension module to test Python internal C APIs (Include/internal).
|
|
|
|
*/
|
|
|
|
|
|
|
|
#if !defined(Py_BUILD_CORE_BUILTIN) && !defined(Py_BUILD_CORE_MODULE)
|
|
|
|
# error "Py_BUILD_CORE_BUILTIN or Py_BUILD_CORE_MODULE must be defined"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define PY_SSIZE_T_CLEAN
|
|
|
|
|
|
|
|
#include "Python.h"
|
2020-04-17 12:47:20 -03:00
|
|
|
#include "pycore_byteswap.h" // _Py_bswap32()
|
2020-03-13 09:07:31 -03:00
|
|
|
#include "pycore_initconfig.h" // _Py_GetConfigsAsDict()
|
2020-04-13 06:38:42 -03:00
|
|
|
#include "pycore_gc.h" // PyGC_Head
|
2019-04-18 06:37:26 -03:00
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
get_configs(PyObject *self, PyObject *Py_UNUSED(args))
|
|
|
|
{
|
|
|
|
return _Py_GetConfigsAsDict();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-03-13 09:07:31 -03:00
|
|
|
static PyObject*
|
2020-04-17 12:47:20 -03:00
|
|
|
get_recursion_depth(PyObject *self, PyObject *Py_UNUSED(args))
|
2020-03-13 09:07:31 -03:00
|
|
|
{
|
|
|
|
PyThreadState *tstate = PyThreadState_Get();
|
|
|
|
|
|
|
|
/* subtract one to ignore the frame of the get_recursion_depth() call */
|
|
|
|
return PyLong_FromLong(tstate->recursion_depth - 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-04-17 12:47:20 -03:00
|
|
|
static PyObject*
|
|
|
|
test_bswap(PyObject *self, PyObject *Py_UNUSED(args))
|
|
|
|
{
|
|
|
|
uint16_t u16 = _Py_bswap16(UINT16_C(0x3412));
|
|
|
|
if (u16 != UINT16_C(0x1234)) {
|
|
|
|
PyErr_Format(PyExc_AssertionError,
|
|
|
|
"_Py_bswap16(0x3412) returns %u", u16);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t u32 = _Py_bswap32(UINT32_C(0x78563412));
|
|
|
|
if (u32 != UINT32_C(0x12345678)) {
|
|
|
|
PyErr_Format(PyExc_AssertionError,
|
|
|
|
"_Py_bswap32(0x78563412) returns %lu", u32);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t u64 = _Py_bswap64(UINT64_C(0xEFCDAB9078563412));
|
|
|
|
if (u64 != UINT64_C(0x1234567890ABCDEF)) {
|
|
|
|
PyErr_Format(PyExc_AssertionError,
|
|
|
|
"_Py_bswap64(0xEFCDAB9078563412) returns %llu", u64);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_RETURN_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-04-18 06:37:26 -03:00
|
|
|
static PyMethodDef TestMethods[] = {
|
|
|
|
{"get_configs", get_configs, METH_NOARGS},
|
2020-03-13 09:07:31 -03:00
|
|
|
{"get_recursion_depth", get_recursion_depth, METH_NOARGS},
|
2020-04-17 12:47:20 -03:00
|
|
|
{"test_bswap", test_bswap, METH_NOARGS},
|
2019-04-18 06:37:26 -03:00
|
|
|
{NULL, NULL} /* sentinel */
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
static struct PyModuleDef _testcapimodule = {
|
|
|
|
PyModuleDef_HEAD_INIT,
|
|
|
|
"_testinternalcapi",
|
|
|
|
NULL,
|
|
|
|
-1,
|
|
|
|
TestMethods,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
PyMODINIT_FUNC
|
|
|
|
PyInit__testinternalcapi(void)
|
|
|
|
{
|
2020-04-13 06:38:42 -03:00
|
|
|
PyObject *module = PyModule_Create(&_testcapimodule);
|
|
|
|
if (module == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (PyModule_AddObject(module, "SIZEOF_PYGC_HEAD",
|
|
|
|
PyLong_FromSsize_t(sizeof(PyGC_Head))) < 0) {
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
return module;
|
|
|
|
|
|
|
|
error:
|
|
|
|
Py_DECREF(module);
|
|
|
|
return NULL;
|
2019-04-18 06:37:26 -03:00
|
|
|
}
|