[Python-checkins] bpo-45569: Change PYLONG_BITS_IN_DIGIT default to 30 (GH-30497)

mdickinson webhook-mailer at python.org
Fri Jan 14 13:55:09 EST 2022


https://github.com/python/cpython/commit/025cbe7a9b5d3058ce2eb8015d3650e396004545
commit: 025cbe7a9b5d3058ce2eb8015d3650e396004545
branch: main
author: Mark Dickinson <mdickinson at enthought.com>
committer: mdickinson <dickinsm at gmail.com>
date: 2022-01-14T18:54:56Z
summary:

bpo-45569: Change PYLONG_BITS_IN_DIGIT default to 30 (GH-30497)

files:
A Misc/NEWS.d/next/Build/2022-01-09-11-24-54.bpo-45569.zCIENy.rst
M Doc/using/configure.rst
M Doc/whatsnew/3.11.rst
M Include/pyport.h
M configure
M configure.ac

diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst
index 771ad3cf18d97..f1c156c042353 100644
--- a/Doc/using/configure.rst
+++ b/Doc/using/configure.rst
@@ -35,8 +35,7 @@ General Options
 
    Define the size in bits of Python :class:`int` digits: 15 or 30 bits.
 
-   By default, the number of bits is selected depending on ``sizeof(void*)``:
-   30 bits if ``void*`` size is 64-bit or larger, 15 bits otherwise.
+   By default, the digit size is 30.
 
    Define the ``PYLONG_BITS_IN_DIGIT`` to ``15`` or ``30``.
 
diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst
index 6a6c22c9077c9..96d6e26709342 100644
--- a/Doc/whatsnew/3.11.rst
+++ b/Doc/whatsnew/3.11.rst
@@ -622,6 +622,16 @@ Build Changes
   like Pyodide.
   (Contributed by Christian Heimes and Ethan Smith in :issue:`40280`.)
 
+* CPython will now use 30-bit digits by default for the Python :class:`int`
+  implementation. Previously, the default was to use 30-bit digits on platforms
+  with ``SIZEOF_VOID_P >= 8``, and 15-bit digits otherwise. It's still possible
+  to explicitly request use of 15-bit digits via either the
+  ``--enable-big-digits`` option to the configure script or (for Windows) the
+  ``PYLONG_BITS_IN_DIGIT`` variable in ``PC/pyconfig.h``, but this option may
+  be removed at some point in the future. (Contributed by Mark Dickinson in
+  :issue:`45569`.)
+
+
 C API Changes
 =============
 
diff --git a/Include/pyport.h b/Include/pyport.h
index 81b1bde841e08..d27b3dde11659 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -85,20 +85,12 @@ Used in:  Py_SAFE_DOWNCAST
 #define PY_INT32_T int32_t
 #define PY_INT64_T int64_t
 
-/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all
-   the necessary integer types are available, and we're on a 64-bit platform
-   (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits.
-
-   From pyodide: WASM has 32 bit pointers but has native 64 bit arithmetic
-   so it is more efficient to use 30 bit digits.
+/* PYLONG_BITS_IN_DIGIT describes the number of bits per "digit" (limb) in the
+ * PyLongObject implementation (longintrepr.h). It's currently either 30 or 15,
+ * defaulting to 30. The 15-bit digit option may be removed in the future.
  */
-
 #ifndef PYLONG_BITS_IN_DIGIT
-#if SIZEOF_VOID_P >= 8 || defined(__wasm__)
-#  define PYLONG_BITS_IN_DIGIT 30
-#else
-#  define PYLONG_BITS_IN_DIGIT 15
-#endif
+#define PYLONG_BITS_IN_DIGIT 30
 #endif
 
 /* uintptr_t is the C9X name for an unsigned integral type such that a
diff --git a/Misc/NEWS.d/next/Build/2022-01-09-11-24-54.bpo-45569.zCIENy.rst b/Misc/NEWS.d/next/Build/2022-01-09-11-24-54.bpo-45569.zCIENy.rst
new file mode 100644
index 0000000000000..69716cd9af5b2
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2022-01-09-11-24-54.bpo-45569.zCIENy.rst
@@ -0,0 +1,5 @@
+The build now defaults to using 30-bit digits for Python integers. Previously
+either 15-bit or 30-bit digits would be selected, depending on the platform.
+15-bit digits may still be selected using the ``--enable-big-digits=15`` option
+to the ``configure`` script, or by defining ``PYLONG_BITS_IN_DIGIT`` in
+``pyconfig.h``.
diff --git a/configure b/configure
index b5a6e0c51bd52..1dee645c387eb 100755
--- a/configure
+++ b/configure
@@ -1730,7 +1730,7 @@ Optional Features:
                           Doc/library/socket.rst (default is yes if supported)
   --enable-big-digits[=15|30]
                           use big digits (30 or 15 bits) for Python longs
-                          (default is system-dependent)]
+                          (default is 30)]
   --disable-test-modules  don't build nor install test modules
 
 Optional Packages:
diff --git a/configure.ac b/configure.ac
index 300d793ad7dfa..7b084a264d411 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5084,7 +5084,7 @@ AC_CHECK_DECLS([RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTL
 # determine what size digit to use for Python's longs
 AC_MSG_CHECKING([digit size for Python's longs])
 AC_ARG_ENABLE(big-digits,
-AS_HELP_STRING([--enable-big-digits@<:@=15|30@:>@],[use big digits (30 or 15 bits) for Python longs (default is system-dependent)]]),
+AS_HELP_STRING([--enable-big-digits@<:@=15|30@:>@],[use big digits (30 or 15 bits) for Python longs (default is 30)]]),
 [case $enable_big_digits in
 yes)
   enable_big_digits=30 ;;



More information about the Python-checkins mailing list