Skip to content

Commit

Permalink
bpo-45434: Only exclude <stdlib.h> in Python 3.11 limited C API (pyth…
Browse files Browse the repository at this point in the history
…onGH-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.
  • Loading branch information
vstinner authored Oct 19, 2021
1 parent 0a4c82d commit 52af075
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 31 deletions.
16 changes: 4 additions & 12 deletions Doc/whatsnew/3.11.rst
Original file line number Diff line number Diff line change
Expand Up @@ -564,18 +564,10 @@ Porting to Python 3.11

(Contributed by Victor Stinner in :issue:`39573`.)

* The ``<Python.h>`` header file no longer includes ``<stdlib.h>``. C
extensions using ``<stdlib.h>`` must now include it explicitly.
The system ``<stdlib.h>`` header provides functions like:
``malloc()``/``free()``, ``getenv()``, ``strtol()``, ``abs()``, ``strtol()``,
``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()``.
* ``<Python.h>`` no longer includes the header files ``<stdlib.h>``,
``<stdio.h>``, ``<errno.h>`` and ``<string.h>`` when the ``Py_LIMITED_API``
macro is set to ``0x030b0000`` (Python 3.11) or higher. C extensions should
explicitly include the header files after ``#include <Python.h>``.
(Contributed by Victor Stinner in :issue:`45434`.)

* The non-limited API files ``cellobject.h``, ``classobject.h``, ``context.h``,
Expand Down
10 changes: 6 additions & 4 deletions Include/Python.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@
# define _SGI_MP_SOURCE
#endif

#include <string.h> // memcpy()
#ifndef Py_LIMITED_API
// stdlib.h, stdio.h, errno.h and string.h headers are not used by Python
// 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*
#endif
#ifdef HAVE_ERRNO_H
# include <errno.h> // errno
# include <string.h> // memcpy()
#endif
#ifndef MS_WINDOWS
# include <unistd.h>
Expand Down
7 changes: 4 additions & 3 deletions Include/pyport.h
Original file line number Diff line number Diff line change
Expand Up @@ -201,9 +201,10 @@ typedef Py_ssize_t Py_ssize_clean_t;
# define Py_LOCAL_INLINE(type) static inline type
#endif

/* Py_MEMCPY is kept for backwards compatibility,
* see https://bugs.python.org/issue28126 */
#define Py_MEMCPY memcpy
// bpo-28126: Py_MEMCPY is kept for backwards compatibility,
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 < 0x030b0000
# define Py_MEMCPY memcpy
#endif

#ifdef HAVE_IEEEFP_H
#include <ieeefp.h> /* needed for 'finite' declaration on some platforms */
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
The ``<Python.h>`` header file no longer includes ``<stdlib.h>``. C
extensions using ``<stdlib.h>`` must now include it explicitly.
The system ``<stdlib.h>`` header provides functions like:
``malloc()``/``free()``, ``getenv()``, ``strtol()``, ``abs()``, ``strtol()``,
``exit()`` and ``abort()``.
``<Python.h>`` no longer includes the header files ``<stdlib.h>``,
``<stdio.h>``, ``<errno.h>`` and ``<string.h>`` when the ``Py_LIMITED_API``
macro is set to ``0x030b0000`` (Python 3.11) or higher. C extensions should
explicitly include the header files after ``#include <Python.h>``.
Patch by Victor Stinner.

This file was deleted.

3 changes: 1 addition & 2 deletions Modules/xxlimited.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

/* Use this file as a template to start implementing a module that
also declares object types. All occurrences of 'Xxo' should be changed
to something reasonable for your objects. After that, all other
Expand Down Expand Up @@ -55,7 +54,7 @@
pass
*/

#define Py_LIMITED_API 0x030a0000
#define Py_LIMITED_API 0x030b0000

#include "Python.h"

Expand Down

0 comments on commit 52af075

Please sign in to comment.