mirror of
https://github.com/python/cpython.git
synced 2026-02-25 16:41:12 +00:00
gh-121617: Include <string.h> for Py_CLEAR() macro (#144666)
Python.h now also includes <string.h> in the limited C API version 3.11 and newer to fix the Py_CLEAR() macro which uses memcpy(). Add a Py_CLEAR() test in test_cext. Modify also _Py_TYPEOF to use C23 typeof() if available.
This commit is contained in:
parent
eb6ebdbc95
commit
9e5e1f9988
5 changed files with 16 additions and 6 deletions
|
|
@ -123,6 +123,7 @@ System includes
|
|||
* ``<limits.h>``
|
||||
* ``<math.h>``
|
||||
* ``<stdarg.h>``
|
||||
* ``<string.h>``
|
||||
* ``<wchar.h>``
|
||||
* ``<sys/types.h>`` (if present)
|
||||
|
||||
|
|
@ -138,7 +139,6 @@ System includes
|
|||
* ``<errno.h>``
|
||||
* ``<stdio.h>``
|
||||
* ``<stdlib.h>``
|
||||
* ``<string.h>``
|
||||
|
||||
.. note::
|
||||
|
||||
|
|
|
|||
|
|
@ -22,12 +22,13 @@
|
|||
#include <limits.h> // INT_MAX
|
||||
#include <math.h> // HUGE_VAL
|
||||
#include <stdarg.h> // va_list
|
||||
#include <string.h> // memcpy()
|
||||
#include <wchar.h> // wchar_t
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
# include <sys/types.h> // ssize_t
|
||||
#endif
|
||||
|
||||
// <errno.h>, <stdio.h>, <stdlib.h> and <string.h> headers are no longer used
|
||||
// <errno.h>, <stdio.h> and <stdlib.h> headers are no longer used
|
||||
// by Python, but kept for the backward compatibility of existing third party C
|
||||
// extensions. They are not included by limited C API version 3.11 and newer.
|
||||
//
|
||||
|
|
@ -37,7 +38,6 @@
|
|||
# include <errno.h> // errno
|
||||
# include <stdio.h> // FILE*
|
||||
# include <stdlib.h> // getenv()
|
||||
# include <string.h> // memcpy()
|
||||
#endif
|
||||
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030d0000
|
||||
# include <ctype.h> // tolower()
|
||||
|
|
|
|||
|
|
@ -567,8 +567,11 @@ extern "C" {
|
|||
//
|
||||
// Example: _Py_TYPEOF(x) x_copy = (x);
|
||||
//
|
||||
// The macro is only defined if GCC or clang compiler is used.
|
||||
#if defined(__GNUC__) || defined(__clang__)
|
||||
// On C23, use typeof(). Otherwise, the macro is only defined
|
||||
// if GCC or clang compiler is used.
|
||||
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 202311L
|
||||
# define _Py_TYPEOF(expr) typeof(expr)
|
||||
#elif defined(__GNUC__) || defined(__clang__)
|
||||
# define _Py_TYPEOF(expr) __typeof__(expr)
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ static PyMethodDef _testcext_methods[] = {
|
|||
static int
|
||||
_testcext_exec(PyObject *module)
|
||||
{
|
||||
PyObject *result;
|
||||
PyObject *result, *obj;
|
||||
|
||||
#ifdef __STDC_VERSION__
|
||||
if (PyModule_AddIntMacro(module, __STDC_VERSION__) < 0) {
|
||||
|
|
@ -92,6 +92,10 @@ _testcext_exec(PyObject *module)
|
|||
Py_BUILD_ASSERT(sizeof(int) == sizeof(unsigned int));
|
||||
assert(Py_BUILD_ASSERT_EXPR(sizeof(int) == sizeof(unsigned int)) == 0);
|
||||
|
||||
// Test Py_CLEAR()
|
||||
obj = NULL;
|
||||
Py_CLEAR(obj);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
``Python.h`` now also includes ``<string.h>`` in the limited C API version 3.11
|
||||
and newer to fix the :c:macro:`Py_CLEAR` macro which uses ``memcpy()``. Patch
|
||||
by Victor Stinner.
|
||||
Loading…
Add table
Add a link
Reference in a new issue