mirror of
https://github.com/python/cpython.git
synced 2025-11-01 18:51:43 +00:00
gh-109723: Disable Py_BUILD_CORE in _testcapi (#109727)
Make sure that the internal C API is not tested by mistake by _testcapi. Undefine Py_BUILD_CORE_BUILTIN and Py_BUILD_CORE_MODULE macros in Modules/_testcapi/parts.h: move code from _testcapimodule.c. heaptype_relative.c and vectorcall_limited.c are using the limited C API which is incompatible with the internal C API. Move test_long_numbits() from _testcapi to _testinternalcapi since it uses the internal C API "pycore_long.h". Fix Modules/_testcapi/pyatomic.c: don't include Python.h directly, just include _testcapi/parts.h. Ajust "make check-c-globals" for these changes.
This commit is contained in:
parent
c32abf1f21
commit
09a25616a9
8 changed files with 114 additions and 101 deletions
|
|
@ -22,6 +22,7 @@
|
|||
#include "pycore_hashtable.h" // _Py_hashtable_new()
|
||||
#include "pycore_initconfig.h" // _Py_GetConfigsAsDict()
|
||||
#include "pycore_interp.h" // _PyInterpreterState_GetConfigCopy()
|
||||
#include "pycore_long.h" // _PyLong_Sign()
|
||||
#include "pycore_object.h" // _PyObject_IsFreed()
|
||||
#include "pycore_pathconfig.h" // _PyPathConfig_ClearGlobal()
|
||||
#include "pycore_pyerrors.h" // _PyErr_ChainExceptions1()
|
||||
|
|
@ -1466,6 +1467,66 @@ _testinternalcapi_write_unraisable_exc_impl(PyObject *module, PyObject *exc,
|
|||
}
|
||||
|
||||
|
||||
static PyObject *
|
||||
raiseTestError(const char* test_name, const char* msg)
|
||||
{
|
||||
PyErr_Format(PyExc_AssertionError, "%s: %s", test_name, msg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*[clinic input]
|
||||
_testinternalcapi.test_long_numbits
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
_testinternalcapi_test_long_numbits_impl(PyObject *module)
|
||||
/*[clinic end generated code: output=745d62d120359434 input=f14ca6f638e44dad]*/
|
||||
{
|
||||
struct triple {
|
||||
long input;
|
||||
size_t nbits;
|
||||
int sign;
|
||||
} testcases[] = {{0, 0, 0},
|
||||
{1L, 1, 1},
|
||||
{-1L, 1, -1},
|
||||
{2L, 2, 1},
|
||||
{-2L, 2, -1},
|
||||
{3L, 2, 1},
|
||||
{-3L, 2, -1},
|
||||
{4L, 3, 1},
|
||||
{-4L, 3, -1},
|
||||
{0x7fffL, 15, 1}, /* one Python int digit */
|
||||
{-0x7fffL, 15, -1},
|
||||
{0xffffL, 16, 1},
|
||||
{-0xffffL, 16, -1},
|
||||
{0xfffffffL, 28, 1},
|
||||
{-0xfffffffL, 28, -1}};
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < Py_ARRAY_LENGTH(testcases); ++i) {
|
||||
size_t nbits;
|
||||
int sign;
|
||||
PyObject *plong;
|
||||
|
||||
plong = PyLong_FromLong(testcases[i].input);
|
||||
if (plong == NULL)
|
||||
return NULL;
|
||||
nbits = _PyLong_NumBits(plong);
|
||||
sign = _PyLong_Sign(plong);
|
||||
|
||||
Py_DECREF(plong);
|
||||
if (nbits != testcases[i].nbits)
|
||||
return raiseTestError("test_long_numbits",
|
||||
"wrong result for _PyLong_NumBits");
|
||||
if (sign != testcases[i].sign)
|
||||
return raiseTestError("test_long_numbits",
|
||||
"wrong result for _PyLong_Sign");
|
||||
}
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static PyMethodDef module_functions[] = {
|
||||
{"get_configs", get_configs, METH_NOARGS},
|
||||
{"get_recursion_depth", get_recursion_depth, METH_NOARGS},
|
||||
|
|
@ -1521,6 +1582,7 @@ static PyMethodDef module_functions[] = {
|
|||
_PyCFunction_CAST(run_in_subinterp_with_config),
|
||||
METH_VARARGS | METH_KEYWORDS},
|
||||
_TESTINTERNALCAPI_WRITE_UNRAISABLE_EXC_METHODDEF
|
||||
_TESTINTERNALCAPI_TEST_LONG_NUMBITS_METHODDEF
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue