bpo-45434: Only exclude <stdlib.h> in Python 3.11 limited C API (GH-29027)

The Python 3.11 limited C API no longer includes stdlib.h, stdio.h,
string.h and errno.h.

* Exclude Py_MEMCPY() from Python 3.11 limited C API.
* xxlimited C extension is now built with Python 3.11 limited C API.
This commit is contained in:
Victor Stinner 2021-10-19 12:10:22 +02:00 committed by GitHub
parent 0a4c82ddd3
commit 52af0756b2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 19 additions and 31 deletions

View file

@ -564,18 +564,10 @@ Porting to Python 3.11
(Contributed by Victor Stinner in :issue:`39573`.) (Contributed by Victor Stinner in :issue:`39573`.)
* The ``<Python.h>`` header file no longer includes ``<stdlib.h>``. C * ``<Python.h>`` no longer includes the header files ``<stdlib.h>``,
extensions using ``<stdlib.h>`` must now include it explicitly. ``<stdio.h>``, ``<errno.h>`` and ``<string.h>`` when the ``Py_LIMITED_API``
The system ``<stdlib.h>`` header provides functions like: macro is set to ``0x030b0000`` (Python 3.11) or higher. C extensions should
``malloc()``/``free()``, ``getenv()``, ``strtol()``, ``abs()``, ``strtol()``, explicitly include the header files after ``#include <Python.h>``.
``exit()`` and ``abort()``.
(Contributed by Victor Stinner in :issue:`45434`.)
* The ``<Python.h>`` header file no longer includes ``<stdio.h>`` if the
``Py_LIMITED_API`` macro is defined. Functions expecting ``FILE*`` are
excluded from the limited C API (:pep:`384`). C extensions using
``<stdio.h>`` must now include it explicitly. The system ``<stdio.h>``
header provides functions like ``printf()`` and ``fopen()``.
(Contributed by Victor Stinner in :issue:`45434`.) (Contributed by Victor Stinner in :issue:`45434`.)
* The non-limited API files ``cellobject.h``, ``classobject.h``, ``context.h``, * The non-limited API files ``cellobject.h``, ``classobject.h``, ``context.h``,

View file

@ -16,12 +16,14 @@
# define _SGI_MP_SOURCE # define _SGI_MP_SOURCE
#endif #endif
#include <string.h> // memcpy() // stdlib.h, stdio.h, errno.h and string.h headers are not used by Python
#ifndef Py_LIMITED_API // headers, but kept for backward compatibility. They are excluded from the
// limited C API of Python 3.11.
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
# include <stdlib.h>
# include <stdio.h> // FILE* # include <stdio.h> // FILE*
#endif
#ifdef HAVE_ERRNO_H
# include <errno.h> // errno # include <errno.h> // errno
# include <string.h> // memcpy()
#endif #endif
#ifndef MS_WINDOWS #ifndef MS_WINDOWS
# include <unistd.h> # include <unistd.h>

View file

@ -201,9 +201,10 @@ typedef Py_ssize_t Py_ssize_clean_t;
# define Py_LOCAL_INLINE(type) static inline type # define Py_LOCAL_INLINE(type) static inline type
#endif #endif
/* Py_MEMCPY is kept for backwards compatibility, // bpo-28126: Py_MEMCPY is kept for backwards compatibility,
* see https://bugs.python.org/issue28126 */ #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
#define Py_MEMCPY memcpy # define Py_MEMCPY memcpy
#endif
#ifdef HAVE_IEEEFP_H #ifdef HAVE_IEEEFP_H
#include <ieeefp.h> /* needed for 'finite' declaration on some platforms */ #include <ieeefp.h> /* needed for 'finite' declaration on some platforms */

View file

@ -1,6 +1,5 @@
The ``<Python.h>`` header file no longer includes ``<stdlib.h>``. C ``<Python.h>`` no longer includes the header files ``<stdlib.h>``,
extensions using ``<stdlib.h>`` must now include it explicitly. ``<stdio.h>``, ``<errno.h>`` and ``<string.h>`` when the ``Py_LIMITED_API``
The system ``<stdlib.h>`` header provides functions like: macro is set to ``0x030b0000`` (Python 3.11) or higher. C extensions should
``malloc()``/``free()``, ``getenv()``, ``strtol()``, ``abs()``, ``strtol()``, explicitly include the header files after ``#include <Python.h>``.
``exit()`` and ``abort()``.
Patch by Victor Stinner. Patch by Victor Stinner.

View file

@ -1,5 +0,0 @@
The ``<Python.h>`` header file no longer includes ``<stdio.h>`` if the
``Py_LIMITED_API`` macro is defined. Functions expecting ``FILE*`` are excluded
from the limited C API (:pep:`384`). C extensions using ``<stdio.h>`` must now
include it explicitly.
Patch by Victor Stinner.

View file

@ -1,4 +1,3 @@
/* Use this file as a template to start implementing a module that /* Use this file as a template to start implementing a module that
also declares object types. All occurrences of 'Xxo' should be changed also declares object types. All occurrences of 'Xxo' should be changed
to something reasonable for your objects. After that, all other to something reasonable for your objects. After that, all other
@ -55,7 +54,7 @@
pass pass
*/ */
#define Py_LIMITED_API 0x030a0000 #define Py_LIMITED_API 0x030b0000
#include "Python.h" #include "Python.h"