summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2019-12-01 20:24:39 +0300
committerIgor Pashev <pashev.igor@gmail.com>2019-12-01 20:24:39 +0300
commit3cdc0437133449e467ccc8e3d78fcb34ac8c5985 (patch)
treede1284bcba52f4b1ebeccc0f12d615bbbe2d579a /debian
parent6c2ad82cf998bb4807f6e8360d4da9a7a8130e0c (diff)
parent77d81aa4a3747b7dfbb17e43b16e1a514550c60c (diff)
downloadpython3.8-3cdc0437133449e467ccc8e3d78fcb34ac8c5985.tar.gz
Merge tag 'debian/3.8.0-5'
Diffstat (limited to 'debian')
-rw-r--r--debian/PVER-dbg.postinst.in17
-rw-r--r--debian/PVER-dev.postinst.in26
-rw-r--r--debian/PVER-minimal.README.Debian.in10
-rw-r--r--debian/changelog210
-rw-r--r--debian/control.in31
-rw-r--r--debian/libPVER-dbg.overrides.in4
-rw-r--r--debian/libPVER-dbg.symbols.i386.in13
-rw-r--r--debian/libPVER-dbg.symbols.in13
-rw-r--r--debian/libPVER-dev.overrides.in3
-rw-r--r--debian/libPVER-minimal.overrides.in4
-rw-r--r--debian/libPVER-stdlib.overrides.in4
-rw-r--r--debian/libPVER.symbols.i386.in2
-rw-r--r--debian/libPVER.symbols.in2
-rw-r--r--debian/libpython.symbols.in379
-rw-r--r--debian/patches/argparse-no-shutil.diff25
-rw-r--r--debian/patches/arm-alignment.diff2
-rw-r--r--debian/patches/bdist-wininst-notfound.diff4
-rw-r--r--debian/patches/build-math-object.diff2
-rw-r--r--debian/patches/deb-setup.diff14
-rw-r--r--debian/patches/disable-sem-check.diff4
-rw-r--r--debian/patches/disable-some-tests.diff6
-rw-r--r--debian/patches/distutils-install-layout.diff26
-rw-r--r--debian/patches/distutils-sysconfig.diff13
-rw-r--r--debian/patches/doc-build-texinfo.diff10
-rw-r--r--debian/patches/ensurepip-disabled.diff6
-rw-r--r--debian/patches/ensurepip-wheels.diff8
-rw-r--r--debian/patches/ext-no-libpython-link.diff18
-rw-r--r--debian/patches/git-updates.diff13728
-rw-r--r--debian/patches/hurd_kfreebsd_thread_native_id.diff34
-rw-r--r--debian/patches/issue35998.diff22
-rw-r--r--debian/patches/langpack-gettext.diff4
-rw-r--r--debian/patches/lib-argparse.diff6
-rw-r--r--debian/patches/lib2to3-no-pickled-grammar.diff6
-rw-r--r--debian/patches/link-opt.diff6
-rw-r--r--debian/patches/local-doc-references.diff14
-rw-r--r--debian/patches/locale-module.diff4
-rw-r--r--debian/patches/lto-link-flags.diff6
-rw-r--r--debian/patches/mangle-fstack-protector.diff4
-rw-r--r--debian/patches/multiarch.diff6
-rw-r--r--debian/patches/platform-lsbrelease.diff50
-rw-r--r--debian/patches/profiled-build.diff2
-rw-r--r--debian/patches/pydoc-use-pager.diff2
-rw-r--r--debian/patches/reproducible-buildinfo.diff2
-rw-r--r--debian/patches/revert-profile-opt-changes.diff189
-rw-r--r--debian/patches/series8
-rw-r--r--debian/patches/setup-modules.diff20
-rw-r--r--debian/patches/sysconfigdata-name.diff60
-rw-r--r--debian/patches/tempfile-minimal.diff20
-rw-r--r--debian/py37-breaks.Debian73
-rw-r--r--debian/pymindeps.py12
-rw-r--r--debian/pyvenv3.134
-rwxr-xr-xdebian/rules245
-rw-r--r--debian/source.lintian-overrides5
-rw-r--r--debian/source.lintian-overrides.in5
-rw-r--r--debian/source/lintian-overrides5
-rw-r--r--debian/tests/control26
-rwxr-xr-xdebian/tests/failing-tests6
-rwxr-xr-xdebian/tests/failing-tests-dbg6
-rwxr-xr-xdebian/tests/testsuite6
-rwxr-xr-xdebian/tests/testsuite-dbg6
-rw-r--r--debian/watch2
61 files changed, 14550 insertions, 930 deletions
diff --git a/debian/PVER-dbg.postinst.in b/debian/PVER-dbg.postinst.in
index 266656d..8f0208e 100644
--- a/debian/PVER-dbg.postinst.in
+++ b/debian/PVER-dbg.postinst.in
@@ -12,23 +12,6 @@ if [ "$1" = configure ]; then
else
echo >&2 "@PVER@-dbg: can't get files for byte-compilation"
fi
-
- if [ -d /usr/include/@PVER@_d ] && [ ! -h /usr/include/@PVER@_d ]; then
- if rmdir /usr/include/@PVER@_d 2> /dev/null; then
- ln -sf @PVER@dmu /usr/include/@PVER@_d
- else
- echo >&2 "WARNING: non-empty directory on upgrade: /usr/include/@PVER@_d"
- ls -l /usr/include/@PVER@_d
- fi
- fi
- if [ -d /usr/lib/@PVER@/config_d ] && [ ! -h /usr/lib/@PVER@/config_d ]; then
- if rmdir /usr/lib/@PVER@/config_d 2> /dev/null; then
- ln -sf config-dmu /usr/lib/@PVER@/config_d
- else
- echo >&2 "WARNING: non-empty directory on upgrade: /usr/lib/@PVER@/config_d"
- ls -l /usr/lib/@PVER@/config_d
- fi
- fi
fi
#DEBHELPER#
diff --git a/debian/PVER-dev.postinst.in b/debian/PVER-dev.postinst.in
deleted file mode 100644
index a6305a0..0000000
--- a/debian/PVER-dev.postinst.in
+++ /dev/null
@@ -1,26 +0,0 @@
-#! /bin/sh
-
-set -e
-
-if [ "$1" = configure ]; then
- if [ -d /usr/include/@PVER@ ] && [ ! -h /usr/include/@PVER@ ]; then
- if rmdir /usr/include/@PVER@ 2> /dev/null; then
- ln -sf @PVER@mu /usr/include/@PVER@
- else
- echo >&2 "WARNING: non-empty directory on upgrade: /usr/include/@PVER@"
- ls -l /usr/include/@PVER@
- fi
- fi
- if [ -d /usr/lib/@PVER@/config ] && [ ! -h /usr/lib/@PVER@/config ]; then
- if rmdir /usr/lib/@PVER@/config 2> /dev/null; then
- ln -sf config-@VER@mu /usr/lib/@PVER@/config
- else
- echo >&2 "WARNING: non-empty directory on upgrade: /usr/lib/@PVER@/config"
- ls -l /usr/lib/@PVER@/config
- fi
- fi
-fi
-
-#DEBHELPER#
-
-exit 0
diff --git a/debian/PVER-minimal.README.Debian.in b/debian/PVER-minimal.README.Debian.in
index 66b2c76..923a8ca 100644
--- a/debian/PVER-minimal.README.Debian.in
+++ b/debian/PVER-minimal.README.Debian.in
@@ -19,6 +19,7 @@ are:
_collections extension
_collections_abc module
_compat_pickle module
+ _csv extension
_datetime extension
_elementtree extension
_fileio builtin
@@ -76,8 +77,10 @@ are:
contextlib module
copy module
copyreg module
+ csv module
datetime module
dis module
+ email package
encodings package
enum module
errno builtin
@@ -108,6 +111,7 @@ are:
operator module
optparse module
os module
+ pathlib module
pickle module
pkgutil module
platform module
@@ -116,6 +120,7 @@ are:
pwd builtin
pyexpat extension
py_compile module
+ quopri module
random module
re module
reprlib module
@@ -146,9 +151,12 @@ are:
tracemalloc module
types module
unicodedata extension
+ urllib package
+ uu module
warnings module
weakref module
- zipimport extension
+ zipfile module
+ zipimport module
zlib extension
Included are as well the codecs and stringprep modules, and the encodings
diff --git a/debian/changelog b/debian/changelog
index a170655..4558abe 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,151 +1,191 @@
-python3.7 (3.7.5-2+dyson0) unstable; urgency=medium
+python3.8 (3.8.0-5) unstable; urgency=medium
- * Package for Dyson.
+ * Update to 20191123 from the 3.8 branch.
+ * libpython3.8-dbg: Provide a python-$(VER)-dbg-embed.pc pkg-config file.
+ Closes: #944852.
- -- Igor Pashev <pashev.igor@gmail.com> Sun, 01 Dec 2019 20:01:18 +0300
+ -- Matthias Klose <doko@debian.org> Sat, 23 Nov 2019 05:55:55 +0100
-python3.7 (3.7.5-2) unstable; urgency=medium
+python3.8 (3.8.0-4) unstable; urgency=medium
- * python3.7-dev: Depend on zlib1g-dev, needed to link as an
+ * Move the test/ann_module{,2,3} modules into libpython-stdlib.
+ Closes: #944303.
+ * Annote python-examples dependency on python.
+
+ -- Matthias Klose <doko@debian.org> Thu, 07 Nov 2019 16:14:28 +0100
+
+python3.8 (3.8.0-3) unstable; urgency=medium
+
+ * python3.8-dev: Depend on zlib1g-dev, needed to link as an
embedded interpreter.
- -- Matthias Klose <doko@debian.org> Sun, 27 Oct 2019 17:43:29 +0200
+ -- Matthias Klose <doko@debian.org> Sun, 27 Oct 2019 17:36:55 +0200
+
+python3.8 (3.8.0-2) unstable; urgency=medium
-python3.7 (3.7.5-1) unstable; urgency=medium
+ * Fix a symlink to the shared debug library.
+ * Install the python3.8d-embed pkg-config file.
+ * Don't ship the python3-embed pkg-config file.
- * Python 3.7.5 release.
+ -- Matthias Klose <doko@debian.org> Sun, 20 Oct 2019 18:00:25 +0200
- -- Matthias Klose <doko@debian.org> Tue, 15 Oct 2019 17:24:06 +0200
+python3.8 (3.8.0-1) unstable; urgency=medium
-python3.7 (3.7.5~rc1-2) unstable; urgency=medium
+ * Python 3.8.0 release.
- * Apply proposed patch for issue 38368. LP: #1847036. Closes: #941650.
+ -- Matthias Klose <doko@debian.org> Tue, 15 Oct 2019 11:10:20 +0200
- -- Matthias Klose <doko@debian.org> Tue, 08 Oct 2019 18:47:45 +0200
+python3.8 (3.8.0~rc1-3) unstable; urgency=medium
-python3.7 (3.7.5~rc1-1) unstable; urgency=medium
+ * Apply proposed patch for issue 38368. LP: #1847036. Addresses: #941650.
- * Python 3.7.5 release candidate 1.
+ -- Matthias Klose <doko@debian.org> Wed, 09 Oct 2019 11:06:01 +0200
+
+python3.8 (3.8.0~rc1-2) unstable; urgency=medium
+
+ * Python 3.8.0 release candidate 1.
+ * Refresh patches.
+ * Update symbols files.
* Bump standards version.
- -- Matthias Klose <doko@debian.org> Wed, 02 Oct 2019 06:19:31 +0200
+ -- Matthias Klose <doko@debian.org> Wed, 02 Oct 2019 05:45:03 +0200
-python3.7 (3.7.4-4) unstable; urgency=medium
+python3.8 (3.8.0~b4-1) unstable; urgency=medium
- * Update to 20190904 from the 3.7 branch.
+ * Python 3.8.0 beta 4 release.
- -- Matthias Klose <doko@debian.org> Wed, 04 Sep 2019 10:03:05 +0200
+ -- Matthias Klose <doko@debian.org> Sat, 31 Aug 2019 16:07:24 +0200
-python3.7 (3.7.4-3) unstable; urgency=medium
+python3.8 (3.8.0~b3-1) unstable; urgency=medium
- * Enable pgo/lto builds on arm64. Closes: #934812.
- * Don't propagate lto flags to the _sysconfigdata module. Closes: #934771.
+ * Python 3.8.0 beta 3 release.
+ * Fix FTCBFS: (Helmut Grohne). Closes: #932077.
+ + Build-Depends, when cross compiling we need python3.8.
+ + Export CC, because dtrace needs it.
+ + Honour DEB_BUILD_OPTIONS=nocheck more thoroughly.
+ + Fix up sysconfigdata-name.diff.
+ * Implement the native thread ids for the Hurd and KFreeBSD (Samuel
+ Thibault). Closes: #931624.
+ * Enable pgo/lto builds on arm64. Addresses: #934812.
+ * Update symbols files.
+ * Don't propagate lto flags to the _sysconfigdata module. Addresses: #934771.
* d/patches/issue35998.diff: Disable TLS1.3 in the client on all platforms
rather than just reducing the payload size (Michael Hudson-Doyle).
- * Annote build dependencies used for tests. Closes: #928513.
- -- Matthias Klose <doko@debian.org> Wed, 21 Aug 2019 18:01:23 +0200
+ -- Matthias Klose <doko@debian.org> Wed, 21 Aug 2019 17:32:52 +0200
-python3.7 (3.7.4-2) unstable; urgency=medium
+python3.8 (3.8.0~b2-5) unstable; urgency=high
- * Bump the platform name for KFreeBSD.
+ * Bump standards version.
+ * Revert the KFreeBSD and Hurd fix for PyThread_get_thread_native_id,
+ and use the implementation from Python3.7. Mark the symbol as linux only.
+ * Don't encode the MACHDEP into the _sysconfigdata file name.
- -- Matthias Klose <doko@debian.org> Thu, 11 Jul 2019 12:43:21 +0200
+ -- Matthias Klose <doko@debian.org> Thu, 11 Jul 2019 11:55:03 +0200
-python3.7 (3.7.4-1) unstable; urgency=medium
+python3.8 (3.8.0~b2-4) unstable; urgency=medium
- * Python 3.7.4 release.
+ * Fix the LTO build.
- -- Matthias Klose <doko@debian.org> Tue, 09 Jul 2019 07:48:37 +0200
+ -- Matthias Klose <doko@debian.org> Sun, 07 Jul 2019 14:23:41 +0200
-python3.7 (3.7.4~rc2-2) unstable; urgency=medium
+python3.8 (3.8.0~b2-3) unstable; urgency=medium
- * Bump standards version.
+ * Define PY_HAVE_THREAD_NATIVE_ID for KFreeBSD and Hurd builds.
+ * Fix issue #37504, building the texinfo docs (Dmitry Shachnev).
+ * Enable LTO/PGO builds on some architectures.
- -- Matthias Klose <doko@debian.org> Mon, 08 Jul 2019 12:07:13 +0200
+ -- Matthias Klose <doko@debian.org> Sat, 06 Jul 2019 12:00:08 +0200
-python3.7 (3.7.4~rc2-1) experimental; urgency=medium
+python3.8 (3.8.0~b2-1) experimental; urgency=medium
- * Python 3.7.4 release candidate 2.
+ * Python 3.8.0 beta 2 release.
+ * Refresh patches.
+ * Update the symbols files.
+ * Don't build the texinfo documentation, fails. See issue #37504.
- -- Matthias Klose <doko@debian.org> Wed, 03 Jul 2019 09:09:05 +0200
+ -- Matthias Klose <doko@debian.org> Fri, 05 Jul 2019 11:20:35 +0200
-python3.7 (3.7.4~rc1-1) experimental; urgency=medium
+python3.8 (3.8.0~b1-2) experimental; urgency=medium
- * Python 3.7.4 release candidate 1.
+ * Fix include links in python3.8-dbg.
- -- Matthias Klose <doko@debian.org> Wed, 19 Jun 2019 19:04:25 +0200
+ -- Matthias Klose <doko@debian.org> Mon, 17 Jun 2019 11:41:06 +0200
-python3.7 (3.7.3-2) unstable; urgency=medium
+python3.8 (3.8.0~b1-1) experimental; urgency=medium
- * d/p/arm-alignment.diff: Don't allow unaligned memory accesses in the
- _sha3 extension (Dave Jones). LP: #1821869. Issue #36515.
- * Tweak the asyncio/ssl test again.
+ * Python 3.8.0 beta 1 release.
+ * Refresh patches.
+ * Add new importlib dependencies to python3-minimal.
+ * Update symbols files.
- -- Matthias Klose <doko@debian.org> Wed, 03 Apr 2019 07:39:12 +0200
+ -- Matthias Klose <doko@debian.org> Wed, 05 Jun 2019 11:23:02 +0200
-python3.7 (3.7.3-1) unstable; urgency=medium
+python3.8 (3.8.0~a4-3) experimental; urgency=medium
- * Python 3.7.3 release.
- * Work around issue #35988, reducing the payload size for the asyncio/ssl
- tests.
+ * Update symbols files.
- -- Matthias Klose <doko@debian.org> Tue, 26 Mar 2019 08:25:18 +0100
+ -- Matthias Klose <doko@debian.org> Wed, 15 May 2019 00:30:25 +0200
-python3.7 (3.7.3~rc1-1) unstable; urgency=medium
+python3.8 (3.8.0~a4-2) experimental; urgency=medium
- * Python 3.7.3 release candidate 1.
- * CVE-2019-9636. Fix issue #36216: Add check for characters in netloc that
- normalize to separators. Closes: #924072.
- * Use a build profile for libbluetooth-dev (<!pkg.python3.7.nobluetooth>).
+ * Update to 20190514 from the trunk.
+ * Fix interpreter name in the -dbg autopkg tests.
+ * Enable dtrace/USDT probe support (--with-dtrace) and build-dep on
+ systemtap-sdt-dev (Trent Lloyd). LP: #1818778.
- -- Matthias Klose <doko@debian.org> Wed, 13 Mar 2019 12:01:15 +0100
+ -- Matthias Klose <doko@debian.org> Tue, 14 May 2019 15:45:29 +0200
-python3.7 (3.7.2-3) unstable; urgency=medium
+python3.8 (3.8.0~a4-1) experimental; urgency=medium
- * Update to 20190227 from the 3.7 branch.
- * Add more breaks for packages not compatible with Python 3.7:
- - xapers. Closes: #916914.
- * Move the test/ann_module{,2,3} modules into libpython-stdlib.
- Closes: #922285.
- * Limit the import checks for some extension modules to native builds.
- Closes: #921742.
+ * Python 3.8.0 alpha 4 release.
+ * Upstream removed the "m" modifier, directory names now don't have the
+ "m" encoded anymore in file and directory names.
+ * Refresh patches.
+ * Update symbols files.
- -- Matthias Klose <doko@debian.org> Wed, 27 Feb 2019 16:41:59 +0100
+ -- Matthias Klose <doko@debian.org> Tue, 07 May 2019 20:35:18 +0200
-python3.7 (3.7.2-2) unstable; urgency=medium
+python3.8 (3.8.0~a3-2) experimental; urgency=medium
- * Update to 20190202 from the 3.7 branch.
+ * d/p/arm-alignment.diff: Don't allow unaligned memory accesses in the
+ _sha3 extension (Dave Jones). LP: #1821869. Issue #36515.
+ * Tweak the asyncio/ssl test again.
- -- Matthias Klose <doko@debian.org> Sat, 02 Feb 2019 15:31:48 +0100
+ -- Matthias Klose <doko@debian.org> Wed, 03 Apr 2019 09:37:42 +0200
-python3.7 (3.7.2-1) unstable; urgency=medium
+python3.8 (3.8.0~a3-1) experimental; urgency=medium
- * Python 3.7.2 release.
- * Revert the link optimization changes which appeared after the
- release candidate.
- * Make the build compatible with sphinx 1.6.x.
- * Loosen the pyzo break. Closes: #916548.
+ * Python 3.8.0 alpha 3 release.
+ * Work around issue #35988, reducing the payload size for the asyncio/ssl
+ tests.
- -- Matthias Klose <doko@debian.org> Thu, 03 Jan 2019 03:55:40 +0100
+ -- Matthias Klose <doko@debian.org> Tue, 26 Mar 2019 10:17:13 +0100
-python3.7 (3.7.2~rc1-1) unstable; urgency=medium
+python3.8 (3.8.0~a2-1ubuntu1) disco; urgency=medium
- * Python 3.7.2 release candidate 1.
- * Add more breaks for packages not compatible with Python 3.7:
- - python3-dns. Closes: #912988.
- - python3-dkim. Closes: #912084.
- - pyzo. Closes: #914332.
- * Update VCS attributes. Closes: #904097.
- * Update symbols files.
+ * Update to 20190314 from the trunk.
+ * Use a build profile for libbluetooth-dev (<!pkg.python3.8.nobluetooth>).
+
+ -- Matthias Klose <doko@debian.org> Thu, 14 Mar 2019 16:06:36 +0100
+
+python3.8 (3.8.0~a2-1) experimental; urgency=medium
- -- Matthias Klose <doko@debian.org> Wed, 12 Dec 2018 07:25:49 +0100
+ * Python 3.8.0 alpha 2 release.
+ * Update symbols files and refresh patches.
-python3.7 (3.7.1-1~18.10) cosmic-proposed; urgency=medium
+ -- Matthias Klose <doko@debian.org> Thu, 14 Mar 2019 10:20:00 +0100
- * SRU: LP: #1799202.
+python3.8 (3.8.0~a1-1) experimental; urgency=medium
+
+ * Python 3.8.0 alpha 1 release.
+ * Update VCS attributes.
+ * Refresh patches.
+ * Update symbols files.
+ * Fix some lintian warnings.
+ * Add pathlib to the set of the minimal modules.
- -- Matthias Klose <doko@ubuntu.com> Mon, 22 Oct 2018 13:21:55 +0200
+ -- Matthias Klose <doko@debian.org> Wed, 06 Feb 2019 16:07:30 +0100
python3.7 (3.7.1-1) unstable; urgency=medium
diff --git a/debian/control.in b/debian/control.in
index 956e6d8..dd7ee1f 100644
--- a/debian/control.in
+++ b/debian/control.in
@@ -14,12 +14,13 @@ Build-Depends: debhelper (>= 9), @bd_dpkgdev@
locales-all,
libsqlite3-dev, libffi-dev (>= 3.0.5) [!or1k !avr32],
libgpm2 [linux-any],
- mime-support, netbase, bzip2, time, python3@bd_qual@,
- net-tools, xvfb <!nocheck>, xauth <!nocheck>
-Build-Depends-Indep: python3-sphinx, texinfo
+ mime-support, netbase, bzip2, time, python3@bd_qual@, @PVER@@bd_qual@ <cross>,
+ net-tools, xvfb <!nocheck>, xauth <!nocheck>,
+ systemtap-sdt-dev
+Build-Depends-Indep: python3-sphinx, python3-docs-theme, texinfo
Standards-Version: 4.4.1
-Vcs-Browser: https://salsa.debian.org/cpython-team/python3/tree/python3.7
-Vcs-Git: https://salsa.debian.org/cpython-team/python3.git -b python3.7
+Vcs-Browser: https://salsa.debian.org/cpython-team/python3
+Vcs-Git: https://salsa.debian.org/cpython-team/python3.git
XS-Testsuite: autopkgtest
Package: @PVER@
@@ -33,7 +34,7 @@ Depends: @PVER@-minimal (= ${binary:Version}),
Suggests: @PVER@-venv, @PVER@-doc, binutils
Breaks: python3-all (<< 3.6.5~rc1-1),
python3-dev (<< 3.6.5~rc1-1),
- python3-venv (<< 3.6.5-2), ${python37:Breaks}
+ python3-venv (<< 3.6.5-2), ${python38:Breaks}
Description: Interactive high-level object-oriented language (version @VER@)
Python is a high-level, interactive, object-oriented language. Its @VER@ version
includes an extensive class library with lots of goodies for
@@ -58,11 +59,9 @@ Architecture: any
Multi-Arch: same
Priority: @PRIO@
Pre-Depends: ${misc:Pre-Depends}
+Breaks: libpython3.8-testsuite (<< 3.8.0-4)
+Replaces: libpython3.8-testsuite (<< 3.8.0-4)
Depends: lib@PVER@-minimal (= ${binary:Version}), mime-support, ${shlibs:Depends}, ${misc:Depends}
-Breaks: python3-tk (<< 3.6.4~rc1-2), libmpdec2 (<< 2.4.2),
- python3-distutils (<< 3.6.5~rc1-2),
- libpython3.7-testsuite (<< 3.7.2-3),
-Replaces: python3-distutils (<< 3.6.5~rc1-2), libpython3.7-testsuite (<< 3.7.2-3),
Description: Interactive high-level object-oriented language (standard library, version @VER@)
Python is a high-level, interactive, object-oriented language. Its @VER@ version
includes an extensive class library with lots of goodies for
@@ -93,8 +92,8 @@ Priority: @MINPRIO@
Pre-Depends: ${misc:Pre-Depends}
Depends: ${shlibs:Depends}, ${misc:Depends}
Recommends: lib@PVER@-stdlib
-Breaks: libpython3.7-stdlib (<< 3.7.0~b2-1~)
-Conflicts: binfmt-support (<< 1.1.2), libpython3.7-stdlib (<< 3.7.0~b2-1~)
+Breaks: lib@PVER@-stdlib (<< 3.8.0~b1-1~)
+Conflicts: binfmt-support (<< 1.1.2), lib@PVER@-stdlib (<< 3.8.0~b1-1~)
Description: Minimal subset of the Python language (version @VER@)
This package contains some essential modules. It is normally not
used on it's own, but as a dependency of @PVER@-minimal.
@@ -116,7 +115,7 @@ Description: Shared Python runtime library (version @VER@)
Package: @PVER@-examples
Architecture: all
-Depends: @PVER@ (>= ${source:Version}), ${misc:Depends}
+Depends: @PVER@:any (>= ${source:Version}), ${misc:Depends}
Description: Examples for the Python language (v@VER@)
Examples, Demos and Tools for Python (v@VER@). These are files included in
the upstream Python distribution (v@VER@).
@@ -168,10 +167,10 @@ Description: Testsuite for the Python standard library (v@VER@)
Package: idle-@PVER@
Architecture: all
-Depends: @PVER@, python3-tk, @PVER@-tk, ${misc:Depends}
+Depends: @PVER@, python3-tk, @PVER@-tk,
+ ${misc:Depends},
+ libjs-mathjax,
Enhances: @PVER@
-Breaks: lib@PVER@-stdlib (<< 3.7.0~a3-1)
-Replaces: lib@PVER@-stdlib (<< 3.7.0~a3-1)
Description: IDE for Python (v@VER@) using Tkinter
IDLE is an Integrated Development Environment for Python (v@VER@).
IDLE is written using Tkinter and therefore quite platform-independent.
diff --git a/debian/libPVER-dbg.overrides.in b/debian/libPVER-dbg.overrides.in
index ed5477e..e5b9183 100644
--- a/debian/libPVER-dbg.overrides.in
+++ b/debian/libPVER-dbg.overrides.in
@@ -11,3 +11,7 @@ lib@PVER@-dbg binary: python-script-but-no-python-dep
lib@PVER@-dbg binary: hardening-no-fortify-functions
lib@PVER@-dbg binary: arch-dependent-file-not-in-arch-specific-directory
+
+# yes, some extensions don't have references to any external lib
+lib@PVER@-dbg binary: shared-lib-without-dependency-information
+lib@PVER@-dbg binary: library-not-linked-against-libc
diff --git a/debian/libPVER-dbg.symbols.i386.in b/debian/libPVER-dbg.symbols.i386.in
index 562eea7..fa7edfd 100644
--- a/debian/libPVER-dbg.symbols.i386.in
+++ b/debian/libPVER-dbg.symbols.i386.in
@@ -1,4 +1,4 @@
-libpython@VER@dm.so.1.0 libpython@VER@-dbg #MINVER#
+libpython@VER@d.so.1.0 libpython@VER@-dbg #MINVER#
#include "libpython.symbols"
_Py_force_double@Base @SVER@
_Py_get_387controlword@Base @SVER@
@@ -11,21 +11,16 @@ libpython@VER@dm.so.1.0 libpython@VER@-dbg #MINVER#
_PyUnicode_compact_data@Base @SVER@
_PyUnicode_data@Base @SVER@
_PyUnicode_utf8@Base @SVER@
- _Py_AddToAllObjects@Base @SVER@
+ _PyWideStringList_CheckConsistency@Base @SVER@
_Py_Dealloc@Base @SVER@
- _Py_ForgetReference@Base @SVER@
- _Py_GetObjects@Base @SVER@
_Py_GetRefTotal@Base @SVER@
_Py_HashSecret_Initialized@Base @SVER@
_Py_NegativeRefcount@Base @SVER@
- _Py_NewReference@Base @SVER@
- _Py_PrintReferenceAddresses@Base @SVER@
- _Py_PrintReferences@Base @SVER@
_Py_RefTotal@Base @SVER@
_Py_dumptree@Base @SVER@
_Py_hashtable_print_stats@Base @SVER@
_Py_printtree@Base @SVER@
_Py_showtree@Base @SVER@
_Py_tok_dump@Base @SVER@
- PyModule_Create2TraceRefs@Base @SVER@
- PyModule_FromDefAndSpec2TraceRefs@Base @SVER@
+ PyModule_Create2@Base @SVER@
+ PyModule_FromDefAndSpec2@Base @SVER@
diff --git a/debian/libPVER-dbg.symbols.in b/debian/libPVER-dbg.symbols.in
index 7f94ad9..09193ae 100644
--- a/debian/libPVER-dbg.symbols.in
+++ b/debian/libPVER-dbg.symbols.in
@@ -1,4 +1,4 @@
-libpython@VER@dm.so.1.0 libpython@VER@-dbg #MINVER#
+libpython@VER@d.so.1.0 libpython@VER@-dbg #MINVER#
#include "libpython.symbols"
_PyDebug_PrintTotalRefs@Base @SVER@
_PyObject_DebugMallocStats@Base @SVER@
@@ -8,21 +8,16 @@ libpython@VER@dm.so.1.0 libpython@VER@-dbg #MINVER#
_PyUnicode_compact_data@Base @SVER@
_PyUnicode_data@Base @SVER@
_PyUnicode_utf8@Base @SVER@
- _Py_AddToAllObjects@Base @SVER@
+ _PyWideStringList_CheckConsistency@Base @SVER@
_Py_Dealloc@Base @SVER@
- _Py_ForgetReference@Base @SVER@
- _Py_GetObjects@Base @SVER@
_Py_GetRefTotal@Base @SVER@
_Py_HashSecret_Initialized@Base @SVER@
_Py_NegativeRefcount@Base @SVER@
- _Py_NewReference@Base @SVER@
- _Py_PrintReferenceAddresses@Base @SVER@
- _Py_PrintReferences@Base @SVER@
_Py_RefTotal@Base @SVER@
_Py_dumptree@Base @SVER@
_Py_hashtable_print_stats@Base @SVER@
_Py_printtree@Base @SVER@
_Py_showtree@Base @SVER@
_Py_tok_dump@Base @SVER@
- PyModule_Create2TraceRefs@Base @SVER@
- PyModule_FromDefAndSpec2TraceRefs@Base @SVER@
+ PyModule_Create2@Base @SVER@
+ PyModule_FromDefAndSpec2@Base @SVER@
diff --git a/debian/libPVER-dev.overrides.in b/debian/libPVER-dev.overrides.in
index fd4e4ea..b94f6f7 100644
--- a/debian/libPVER-dev.overrides.in
+++ b/debian/libPVER-dev.overrides.in
@@ -1,3 +1,6 @@
lib@PVER@-dev binary: python-script-but-no-python-dep
lib@PVER@-dev binary: arch-dependent-file-not-in-arch-specific-directory
+
+# lintian needs an update for 3.8
+lib@PVER@-dev binary: package-contains-python-header-in-incorrect-directory
diff --git a/debian/libPVER-minimal.overrides.in b/debian/libPVER-minimal.overrides.in
index 7e12404..4a8ebf5 100644
--- a/debian/libPVER-minimal.overrides.in
+++ b/debian/libPVER-minimal.overrides.in
@@ -3,3 +3,7 @@ lib@PVER@-minimal binary: python-script-but-no-python-dep
# lintian omission, multiarch string is encoded in the filename
lib@PVER@-minimal binary: arch-dependent-file-not-in-arch-specific-directory
+
+# yes, some extensions don't have references to any external lib
+lib@PVER@-minimal binary: shared-lib-without-dependency-information
+lib@PVER@-minimal binary: library-not-linked-against-libc
diff --git a/debian/libPVER-stdlib.overrides.in b/debian/libPVER-stdlib.overrides.in
index b70d521..402b1cb 100644
--- a/debian/libPVER-stdlib.overrides.in
+++ b/debian/libPVER-stdlib.overrides.in
@@ -13,3 +13,7 @@ lib@PVER@-stdlib binary: python-script-but-no-python-dep
# lintian omission, multiarch string is encoded in the filename
lib@PVER@-stdlib binary: arch-dependent-file-not-in-arch-specific-directory
+
+# yes, some extensions don't have references to any external lib
+lib@PVER@-stdlib binary: shared-lib-without-dependency-information
+lib@PVER@-stdlib binary: library-not-linked-against-libc
diff --git a/debian/libPVER.symbols.i386.in b/debian/libPVER.symbols.i386.in
index b6b0270..f9474e6 100644
--- a/debian/libPVER.symbols.i386.in
+++ b/debian/libPVER.symbols.i386.in
@@ -1,4 +1,4 @@
-libpython@VER@m.so.1.0 libpython@VER@ #MINVER#
+libpython@VER@.so.1.0 libpython@VER@ #MINVER#
#include "libpython.symbols"
PyModule_Create2@Base @SVER@
PyModule_FromDefAndSpec2@Base @SVER@
diff --git a/debian/libPVER.symbols.in b/debian/libPVER.symbols.in
index 6094b8b..6b55def 100644
--- a/debian/libPVER.symbols.in
+++ b/debian/libPVER.symbols.in
@@ -1,4 +1,4 @@
-libpython@VER@m.so.1.0 libpython@VER@ #MINVER#
+libpython@VER@.so.1.0 libpython@VER@ #MINVER#
#include "libpython.symbols"
PyModule_Create2@Base @SVER@
PyModule_FromDefAndSpec2@Base @SVER@
diff --git a/debian/libpython.symbols.in b/debian/libpython.symbols.in
index 822628d..d1602c7 100644
--- a/debian/libpython.symbols.in
+++ b/debian/libpython.symbols.in
@@ -54,10 +54,8 @@
PyByteArrayIter_Type@Base @SVER@
PyByteArray_AsString@Base @SVER@
PyByteArray_Concat@Base @SVER@
- PyByteArray_Fini@Base @SVER@
PyByteArray_FromObject@Base @SVER@
PyByteArray_FromStringAndSize@Base @SVER@
- PyByteArray_Init@Base @SVER@
PyByteArray_Resize@Base @SVER@
PyByteArray_Size@Base @SVER@
PyByteArray_Type@Base @SVER@
@@ -77,20 +75,6 @@
PyBytes_Repr@Base @SVER@
PyBytes_Size@Base @SVER@
PyBytes_Type@Base @SVER@
- (optional)PyCArgObject_new@Base @SVER@
- (optional)PyCArg_Type@Base @SVER@
- (optional)PyCArrayType_Type@Base @SVER@
- (optional)PyCArrayType_from_ctype@Base @SVER@
- (optional)PyCArray_Type@Base @SVER@
- (optional)PyCData_AtAddress@Base @SVER@
- (optional)PyCData_FromBaseObj@Base @SVER@
- (optional)PyCData_Type@Base @SVER@
- (optional)PyCData_get@Base @SVER@
- (optional)PyCData_set@Base @SVER@
- (optional)PyCField_FromDesc@Base @SVER@
- (optional)PyCField_Type@Base @SVER@
- (optional)PyCFuncPtrType_Type@Base @SVER@
- (optional)PyCFuncPtr_Type@Base @SVER@
PyCFunction_Call@Base @SVER@
PyCFunction_ClearFreeList@Base @SVER@
PyCFunction_Fini@Base @SVER@
@@ -100,14 +84,6 @@
PyCFunction_New@Base @SVER@
PyCFunction_NewEx@Base @SVER@
PyCFunction_Type@Base @SVER@
- (optional)PyCPointerType_Type@Base @SVER@
- (optional)PyCPointer_Type@Base @SVER@
- (optional)PyCSimpleType_Type@Base @SVER@
- (optional)PyCStgDict_Type@Base @SVER@
- (optional)PyCStgDict_clone@Base @SVER@
- (optional)PyCStructType_Type@Base @SVER@
- (optional)PyCStructUnionType_update_stgdict@Base @SVER@
- (optional)PyCThunk_Type@Base @SVER@
PyCallIter_New@Base @SVER@
PyCallIter_Type@Base @SVER@
PyCallable_Check@Base @SVER@
@@ -133,6 +109,7 @@
PyCode_Addr2Line@Base @SVER@
PyCode_New@Base @SVER@
PyCode_NewEmpty@Base @SVER@
+ PyCode_NewWithPosOnlyArgs@Base @SVER@
PyCode_Optimize@Base @SVER@
PyCode_Type@Base @SVER@
PyCodec_BackslashReplaceErrors@Base @SVER@
@@ -155,12 +132,22 @@
PyCodec_XMLCharRefReplaceErrors@Base @SVER@
PyCompileString@Base @SVER@
PyCompile_OpcodeStackEffect@Base @SVER@
+ PyCompile_OpcodeStackEffectWithJump@Base @SVER@
PyComplex_AsCComplex@Base @SVER@
PyComplex_FromCComplex@Base @SVER@
PyComplex_FromDoubles@Base @SVER@
PyComplex_ImagAsDouble@Base @SVER@
PyComplex_RealAsDouble@Base @SVER@
PyComplex_Type@Base @SVER@
+ PyConfig_Clear@Base @SVER@
+ PyConfig_InitIsolatedConfig@Base @SVER@
+ PyConfig_InitPythonConfig@Base @SVER@
+ PyConfig_Read@Base @SVER@
+ PyConfig_SetArgv@Base @SVER@
+ PyConfig_SetBytesArgv@Base @SVER@
+ PyConfig_SetBytesString@Base @SVER@
+ PyConfig_SetString@Base @SVER@
+ PyConfig_SetWideStringList@Base @SVER@
PyContextTokenMissing_Type@Base @SVER@
PyContextToken_Type@Base @SVER@
PyContextVar_Get@Base @SVER@
@@ -189,6 +176,9 @@
PyDictKeys_Type@Base @SVER@
PyDictProxy_New@Base @SVER@
PyDictProxy_Type@Base @SVER@
+ PyDictRevIterItem_Type@Base @SVER@
+ PyDictRevIterKey_Type@Base @SVER@
+ PyDictRevIterValue_Type@Base @SVER@
PyDictValues_Type@Base @SVER@
PyDict_Clear@Base @SVER@
PyDict_ClearFreeList@Base @SVER@
@@ -198,7 +188,6 @@
PyDict_DelItemString@Base @SVER@
PyDict_Fini@Base @SVER@
PyDict_GetItem@Base @SVER@
- (optional)PyDict_GetItemProxy@Base @SVER@
PyDict_GetItemString@Base @SVER@
PyDict_GetItemWithError@Base @SVER@
PyDict_Items@Base @SVER@
@@ -209,7 +198,6 @@
PyDict_Next@Base @SVER@
PyDict_SetDefault@Base @SVER@
PyDict_SetItem@Base @SVER@
- (optional)PyDict_SetItemProxy@Base @SVER@
PyDict_SetItemString@Base @SVER@
PyDict_Size@Base @SVER@
PyDict_Type@Base @SVER@
@@ -226,7 +214,7 @@
PyErr_Fetch@Base @SVER@
PyErr_Format@Base @SVER@
PyErr_FormatV@Base @SVER@
- PyErr_GetExcInfo@Base @SVER@
+ PyErr_GetExcInfo@Base @SVER@
PyErr_GivenExceptionMatches@Base @SVER@
PyErr_NewException@Base @SVER@
PyErr_NewExceptionWithDoc@Base @SVER@
@@ -277,7 +265,6 @@
PyEval_GetLocals@Base @SVER@
PyEval_InitThreads@Base @SVER@
PyEval_MergeCompilerFlags@Base @SVER@
- PyEval_ReInitThreads@Base @SVER@
PyEval_ReleaseLock@Base @SVER@
PyEval_ReleaseThread@Base @SVER@
PyEval_RestoreThread@Base @SVER@
@@ -285,7 +272,6 @@
PyEval_SetProfile@Base @SVER@
PyEval_SetTrace@Base @SVER@
PyEval_ThreadsInitialized@Base @SVER@
- (optional)PyExc_ArgError@Base @SVER@
PyExc_ArithmeticError@Base @SVER@
PyExc_AssertionError@Base @SVER@
PyExc_AttributeError@Base @SVER@
@@ -352,6 +338,7 @@
PyExc_ValueError@Base @SVER@
PyExc_Warning@Base @SVER@
PyExc_ZeroDivisionError@Base @SVER@
+ PyExceptionClass_Name@Base @SVER@
PyException_GetCause@Base @SVER@
PyException_GetContext@Base @SVER@
PyException_GetTraceback@Base @SVER@
@@ -365,6 +352,9 @@
PyFile_FromFd@Base @SVER@
PyFile_GetLine@Base @SVER@
PyFile_NewStdPrinter@Base @SVER@
+ PyFile_OpenCode@Base @SVER@
+ PyFile_OpenCodeObject@Base @SVER@
+ PyFile_SetOpenCodeHook@Base @SVER@
PyFile_WriteObject@Base @SVER@
PyFile_WriteString@Base @SVER@
PyFilter_Type@Base @SVER@
@@ -446,17 +436,73 @@
PyImport_Inittab@Base @SVER@
PyImport_ReloadModule@Base @SVER@
PyIncrementalNewlineDecoder_Type@Base @SVER@
+ PyIndex_Check@Base @SVER@
+ PyInit__abc@Base @SVER@
+ PyInit__ast@Base @SVER@
+ PyInit__bisect@Base @SVER@
+ PyInit__blake2@Base @SVER@
+ PyInit__codecs@Base @SVER@
+ PyInit__collections@Base @SVER@
+ PyInit__datetime@Base @SVER@
+ PyInit__elementtree@Base @SVER@
+ PyInit__functools@Base @SVER@
+ PyInit__heapq@Base @SVER@
+ PyInit__imp@Base @SVER@
+ PyInit__io@Base @SVER@
+ PyInit__locale@Base @SVER@
+ PyInit__md5@Base @SVER@
+ PyInit__operator@Base @SVER@
+ PyInit__pickle@Base @SVER@
+ PyInit__posixsubprocess@Base @SVER@
+ PyInit__random@Base @SVER@
+ PyInit__sha1@Base @SVER@
+ PyInit__sha256@Base @SVER@
+ PyInit__sha3@Base @SVER@
+ PyInit__sha512@Base @SVER@
+ PyInit__signal@Base @SVER@
+ PyInit__socket@Base @SVER@
+ PyInit__sre@Base @SVER@
+ PyInit__stat@Base @SVER@
+ PyInit__string@Base @SVER@
+ PyInit__struct@Base @SVER@
+ PyInit__symtable@Base @SVER@
+ PyInit__thread@Base @SVER@
+ PyInit__tracemalloc@Base @SVER@
+ PyInit__weakref@Base @SVER@
+ PyInit_array@Base @SVER@
+ PyInit_atexit@Base @SVER@
+ PyInit_binascii@Base @SVER@
+ PyInit_cmath@Base @SVER@
+ PyInit_errno@Base @SVER@
+ PyInit_faulthandler@Base @SVER@
+ PyInit_fcntl@Base @SVER@
+ PyInit_gc@Base @SVER@
+ PyInit_grp@Base @SVER@
+ PyInit_itertools@Base @SVER@
+ PyInit_math@Base @SVER@
+ PyInit_posix@Base @SVER@
+ PyInit_pwd@Base @SVER@
+ PyInit_pyexpat@Base @SVER@
+ PyInit_select@Base @SVER@
+ PyInit_spwd@Base @SVER@
+ PyInit_syslog@Base @SVER@
+ PyInit_time@Base @SVER@
+ PyInit_unicodedata@Base @SVER@
+ PyInit_xxsubtype@Base @SVER@
+ PyInit_zlib@Base @SVER@
PyInstanceMethod_Function@Base @SVER@
PyInstanceMethod_New@Base @SVER@
PyInstanceMethod_Type@Base @SVER@
PyInterpreterState_Clear@Base @SVER@
PyInterpreterState_Delete@Base @SVER@
+ PyInterpreterState_GetDict@Base @SVER@
PyInterpreterState_GetID@Base @SVER@
PyInterpreterState_Head@Base @SVER@
PyInterpreterState_Main@Base @SVER@
PyInterpreterState_New@Base @SVER@
PyInterpreterState_Next@Base @SVER@
PyInterpreterState_ThreadHead@Base @SVER@
+ PyIter_Check@Base @SVER@
PyIter_Next@Base @SVER@
PyListIter_Type@Base @SVER@
PyListRevIter_Type@Base @SVER@
@@ -702,7 +748,6 @@
PyObject_Size@Base @SVER@
PyObject_Str@Base @SVER@
PyObject_Type@Base @SVER@
- (optional)PyObject_stgdict@Base @SVER@
PyParser_ASTFromFile@Base @SVER@
PyParser_ASTFromFileObject@Base @SVER@
PyParser_ASTFromString@Base @SVER@
@@ -724,9 +769,14 @@
PyParser_SimpleParseFile@Base @SVER@
PyParser_SimpleParseFileFlags@Base @SVER@
PyParser_SimpleParseString@Base @SVER@
- PyParser_SimpleParseStringFilename@Base @SVER@
PyParser_SimpleParseStringFlags@Base @SVER@
PyParser_SimpleParseStringFlagsFilename@Base @SVER@
+ PyPickleBuffer_FromObject@Base @SVER@
+ PyPickleBuffer_GetBuffer@Base @SVER@
+ PyPickleBuffer_Release@Base @SVER@
+ PyPickleBuffer_Type@Base @SVER@
+ PyPreConfig_InitIsolatedConfig@Base @SVER@
+ PyPreConfig_InitPythonConfig@Base @SVER@
PyProperty_Type@Base @SVER@
PyRangeIter_Type@Base @SVER@
PyRange_Type@Base @SVER@
@@ -800,6 +850,13 @@
PyState_RemoveModule@Base @SVER@
PyStaticMethod_New@Base @SVER@
PyStaticMethod_Type@Base @SVER@
+ PyStatus_Error@Base @SVER@
+ PyStatus_Exception@Base @SVER@
+ PyStatus_Exit@Base @SVER@
+ PyStatus_IsError@Base @SVER@
+ PyStatus_IsExit@Base @SVER@
+ PyStatus_NoMemory@Base @SVER@
+ PyStatus_Ok@Base @SVER@
PyStdPrinter_Type@Base @SVER@
PyStringIO_Type@Base @SVER@
PyStructSequence_GetItem@Base @SVER@
@@ -814,9 +871,11 @@
PySymtable_BuildObject@Base @SVER@
PySymtable_Free@Base @SVER@
PySymtable_Lookup@Base @SVER@
+ PySys_AddAuditHook@Base @SVER@
PySys_AddWarnOption@Base @SVER@
PySys_AddWarnOptionUnicode@Base @SVER@
PySys_AddXOption@Base @SVER@
+ PySys_Audit@Base @SVER@
PySys_FormatStderr@Base @SVER@
PySys_FormatStdout@Base @SVER@
PySys_GetObject@Base @SVER@
@@ -853,6 +912,7 @@
PyThread_get_key_value@Base @SVER@
PyThread_get_stacksize@Base @SVER@
PyThread_get_thread_ident@Base @SVER@
+ (arch=linux-any hurd-any)PyThread_get_thread_native_id@Base @SVER@
PyThread_init_thread@Base @SVER@
PyThread_release_lock@Base @SVER@
PyThread_set_key_value@Base @SVER@
@@ -901,7 +961,6 @@
PyType_Modified@Base @SVER@
PyType_Ready@Base @SVER@
PyType_Type@Base @SVER@
- (optional)PyType_stgdict@Base @SVER@
PyUnicodeDecodeError_Create@Base @SVER@
PyUnicodeDecodeError_GetEncoding@Base @SVER@
PyUnicodeDecodeError_GetEnd@Base @SVER@
@@ -984,6 +1043,12 @@
PyUnicode_EncodeCharmap@Base @SVER@
PyUnicode_EncodeDecimal@Base @SVER@
PyUnicode_EncodeFSDefault@Base @SVER@
+ PyUnicode_EncodeLatin1@Base @SVER@
+ PyUnicode_EncodeLocale@Base @SVER@
+ PyUnicode_EncodeRawUnicodeEscape@Base @SVER@
+ PyUnicode_EncodeUTF16@Base @SVER@
+ PyUnicode_EncodeUTF32@Base @SVER@
+ PyUnicode_EncodeUTF7@Base @SVER@
PyUnicode_EncodeUTF8@Base @SVER@
PyUnicode_EncodeUnicodeEscape@Base @SVER@
PyUnicode_FSConverter@Base @SVER@
@@ -1006,12 +1071,6 @@
PyUnicode_GetLength@Base @SVER@
PyUnicode_GetMax@Base @SVER@
PyUnicode_GetSize@Base @SVER@
- PyUnicode_EncodeLatin1@Base @SVER@
- PyUnicode_EncodeLocale@Base @SVER@
- PyUnicode_EncodeRawUnicodeEscape@Base @SVER@
- PyUnicode_EncodeUTF16@Base @SVER@
- PyUnicode_EncodeUTF32@Base @SVER@
- PyUnicode_EncodeUTF7@Base @SVER@
PyUnicode_InternFromString@Base @SVER@
PyUnicode_InternImmortal@Base @SVER@
PyUnicode_InternInPlace@Base @SVER@
@@ -1034,15 +1093,19 @@
PyUnicode_TranslateCharmap@Base @SVER@
PyUnicode_Type@Base @SVER@
PyUnicode_WriteChar@Base @SVER@
+ PyVectorcall_Call@Base @SVER@
PyWeakref_GetObject@Base @SVER@
PyWeakref_NewProxy@Base @SVER@
PyWeakref_NewRef@Base @SVER@
+ PyWideStringList_Append@Base @SVER@
+ PyWideStringList_Insert@Base @SVER@
PyWrapperDescr_Type@Base @SVER@
PyWrapper_New@Base @SVER@
PyZip_Type@Base @SVER@
Py_AddPendingCall@Base @SVER@
Py_AtExit@Base @SVER@
Py_BuildValue@Base @SVER@
+ Py_BytesMain@Base @SVER@
Py_BytesWarningFlag@Base @SVER@
Py_CompileString@Base @SVER@
Py_CompileStringExFlags@Base @SVER@
@@ -1055,6 +1118,7 @@
Py_EncodeLocale@Base @SVER@
Py_EndInterpreter@Base @SVER@
Py_Exit@Base @SVER@
+ Py_ExitStatusException@Base @SVER@
Py_FatalError@Base @SVER@
Py_FdIsInteractive@Base @SVER@
Py_FileSystemDefaultEncodeErrors@Base @SVER@
@@ -1082,6 +1146,7 @@
Py_IncRef@Base @SVER@
Py_Initialize@Base @SVER@
Py_InitializeEx@Base @SVER@
+ Py_InitializeFromConfig@Base @SVER@
Py_InspectFlag@Base @SVER@
Py_InteractiveFlag@Base @SVER@
Py_IsInitialized@Base @SVER@
@@ -1092,9 +1157,13 @@
Py_NoSiteFlag@Base @SVER@
Py_NoUserSiteDirectory@Base @SVER@
Py_OptimizeFlag@Base @SVER@
+ Py_PreInitialize@Base @SVER@
+ Py_PreInitializeFromArgs@Base @SVER@
+ Py_PreInitializeFromBytesArgs@Base @SVER@
Py_QuietFlag@Base @SVER@
Py_ReprEnter@Base @SVER@
Py_ReprLeave@Base @SVER@
+ Py_RunMain@Base @SVER@
Py_SetPath@Base @SVER@
Py_SetProgramName@Base @SVER@
Py_SetPythonHome@Base @SVER@
@@ -1116,15 +1185,16 @@
Py_VaBuildValue@Base @SVER@
Py_VerboseFlag@Base @SVER@
Py_hexdigits@Base @SVER@
- Py_meta_grammar@Base @SVER@
- Py_pgen@Base @SVER@
- _PyAST_Optimize@Base @SVER@
_PyAST_ExprAsUnicode@Base @SVER@
+ _PyAST_GetDocString@Base @SVER@
+ _PyAST_Optimize@Base @SVER@
_PyAccu_Accumulate@Base @SVER@
_PyAccu_Destroy@Base @SVER@
_PyAccu_Finish@Base @SVER@
_PyAccu_FinishAsList@Base @SVER@
_PyAccu_Init@Base @SVER@
+ _PyArg_BadArgument@Base @SVER@
+ _PyArg_CheckPositional@Base @SVER@
_PyArg_Fini@Base @SVER@
_PyArg_NoKeywords@Base @SVER@
_PyArg_NoPositional@Base @SVER@
@@ -1136,17 +1206,20 @@
_PyArg_ParseTupleAndKeywordsFast_SizeT@Base @SVER@
_PyArg_ParseTupleAndKeywords_SizeT@Base @SVER@
_PyArg_ParseTuple_SizeT@Base @SVER@
- _PyArg_UnpackStack@Base @SVER@
_PyArg_Parse_SizeT@Base @SVER@
+ _PyArg_UnpackKeywords@Base @SVER@
+ _PyArg_UnpackStack@Base @SVER@
_PyArg_VaParseTupleAndKeywordsFast@Base @SVER@
_PyArg_VaParseTupleAndKeywordsFast_SizeT@Base @SVER@
_PyArg_VaParseTupleAndKeywords_SizeT@Base @SVER@
_PyArg_VaParse_SizeT@Base @SVER@
+ _PyArgv_AsWstrList@Base @SVER@
_PyAsyncGenASend_Type@Base @SVER@
_PyAsyncGenAThrow_Type@Base @SVER@
_PyAsyncGenValueWrapperNew@Base @SVER@
_PyAsyncGenWrappedValue_Type@Base @SVER@
_PyBuiltin_Init@Base @SVER@
+ _PyBuiltins_AddExceptions@Base @SVER@
_PyByteArray_empty_string@Base @SVER@
_PyBytesIOBuffer_Type@Base @SVER@
_PyBytesWriter_Alloc@Base @SVER@
@@ -1163,10 +1236,10 @@
_PyBytes_Resize@Base @SVER@
_PyCFunction_DebugMallocStats@Base @SVER@
_PyCFunction_FastCallDict@Base @SVER@
- _PyCFunction_FastCallKeywords@Base @SVER@
_PyCode_CheckLineNumber@Base @SVER@
_PyCode_ConstantKey@Base @SVER@
_PyCode_GetExtra@Base @SVER@
+ _PyCode_InitOpcache@Base @SVER@
_PyCode_SetExtra@Base @SVER@
_PyCodecInfo_GetIncrementalDecoder@Base @SVER@
_PyCodecInfo_GetIncrementalEncoder@Base @SVER@
@@ -1176,21 +1249,26 @@
_PyCodec_Lookup@Base @SVER@
_PyCodec_LookupTextEncoding@Base @SVER@
_PyComplex_FormatAdvancedWriter@Base @SVER@
+ _PyConfig_Copy@Base @SVER@
+ _PyConfig_InitCompatConfig@Base @SVER@
+ _PyConfig_InitPathConfig@Base @SVER@
+ _PyConfig_SetPyArgv@Base @SVER@
+ _PyConfig_Write@Base @SVER@
+ _PyConfig_WritePathConfig@Base @SVER@
_PyContext_Fini@Base @SVER@
_PyContext_Init@Base @SVER@
_PyContext_NewHamtForTests@Base @SVER@
- _PyCoreConfig_AsDict@Base @SVER@
- _PyCoreConfig_Clear@Base @SVER@
- _PyCoreConfig_Copy@Base @SVER@
- _PyCoreConfig_GetGlobalConfig@Base @SVER@
- _PyCoreConfig_Read@Base @SVER@
- _PyCoreConfig_SetGlobalConfig@Base @SVER@
_PyCoroWrapper_Type@Base @SVER@
_PyCoro_GetAwaitableIter@Base @SVER@
+ _PyCrossInterpreterData_Lookup@Base @SVER@
+ _PyCrossInterpreterData_NewObject@Base @SVER@
+ _PyCrossInterpreterData_RegisterClass@Base @SVER@
+ _PyCrossInterpreterData_Release@Base @SVER@
_PyDebugAllocatorStats@Base @SVER@
_PyDictKeys_DecRef@Base @SVER@
_PyDictView_Intersect@Base @SVER@
_PyDictView_New@Base @SVER@
+ _PyDict_CheckConsistency@Base @SVER@
_PyDict_Contains@Base @SVER@
_PyDict_DebugMallocStats@Base @SVER@
_PyDict_DelItemId@Base @SVER@
@@ -1199,6 +1277,7 @@
_PyDict_FromKeys@Base @SVER@
_PyDict_GetItemId@Base @SVER@
_PyDict_GetItemIdWithError@Base @SVER@
+ _PyDict_GetItemStringWithError@Base @SVER@
_PyDict_GetItem_KnownHash@Base @SVER@
_PyDict_HasOnlyStringKeys@Base @SVER@
_PyDict_KeysSize@Base @SVER@
@@ -1210,28 +1289,44 @@
_PyDict_Next@Base @SVER@
_PyDict_Pop@Base @SVER@
_PyDict_Pop_KnownHash@Base @SVER@
- _PyDict_SizeOf@Base @SVER@
_PyDict_SetItemId@Base @SVER@
_PyDict_SetItem_KnownHash@Base @SVER@
+ _PyDict_SizeOf@Base @SVER@
_PyErr_BadInternalCall@Base @SVER@
_PyErr_ChainExceptions@Base @SVER@
+ _PyErr_CheckSignals@Base @SVER@
+ _PyErr_Clear@Base @SVER@
+ _PyErr_Display@Base @SVER@
+ _PyErr_ExceptionMatches@Base @SVER@
+ _PyErr_Fetch@Base @SVER@
+ _PyErr_Format@Base @SVER@
_PyErr_FormatFromCause@Base @SVER@
_PyErr_GetTopmostException@Base @SVER@
+ _PyErr_Init@Base @SVER@
+ _PyErr_NormalizeException@Base @SVER@
+ _PyErr_Print@Base @SVER@
+ _PyErr_Restore@Base @SVER@
_PyErr_SetKeyError@Base @SVER@
+ _PyErr_SetNone@Base @SVER@
+ _PyErr_SetObject@Base @SVER@
+ _PyErr_SetString@Base @SVER@
_PyErr_TrySetFromCause@Base @SVER@
_PyErr_WarnUnawaitedCoroutine@Base @SVER@
+ _PyErr_WriteUnraisableDefaultHook@Base @SVER@
+ _PyErr_WriteUnraisableMsg@Base @SVER@
+ _PyEval_AddPendingCall@Base @SVER@
_PyEval_CallTracing@Base @SVER@
_PyEval_EvalCodeWithName@Base @SVER@
_PyEval_EvalFrameDefault@Base @SVER@
+ _PyEval_Fini@Base @SVER@
_PyEval_FiniThreads@Base @SVER@
_PyEval_GetAsyncGenFinalizer@Base @SVER@
_PyEval_GetAsyncGenFirstiter@Base @SVER@
_PyEval_GetBuiltinId@Base @SVER@
_PyEval_GetCoroutineOriginTrackingDepth@Base @SVER@
- _PyEval_GetCoroutineWrapper@Base @SVER@
- _PyEval_SetCoroutineWrapper@Base @SVER@
_PyEval_GetSwitchInterval@Base @SVER@
_PyEval_Initialize@Base @SVER@
+ _PyEval_ReInitThreads@Base @SVER@
_PyEval_RequestCodeExtraIndex@Base @SVER@
_PyEval_SetAsyncGenFinalizer@Base @SVER@
_PyEval_SetAsyncGenFirstiter@Base @SVER@
@@ -1256,10 +1351,9 @@
_PyFloat_Unpack4@Base @SVER@
_PyFloat_Unpack8@Base @SVER@
_PyFrame_DebugMallocStats@Base @SVER@
- _PyFrame_Init@Base @SVER@
_PyFrame_New_NoTrack@Base @SVER@
_PyFunction_FastCallDict@Base @SVER@
- _PyFunction_FastCallKeywords@Base @SVER@
+ _PyFunction_Vectorcall@Base @SVER@
_PyGC_CollectIfEnabled@Base @SVER@
_PyGC_CollectNoFail@Base @SVER@
_PyGC_Dump@Base @SVER@
@@ -1354,11 +1448,20 @@
_PyImport_SetModule@Base @SVER@
_PyImport_SetModuleString@Base @SVER@
_PyIncrementalNewlineDecoder_decode@Base @SVER@
+ _PyInterpreterID_LookUp@Base @SVER@
+ _PyInterpreterID_New@Base @SVER@
+ _PyInterpreterID_Type@Base @SVER@
+ _PyInterpreterState_DeleteExceptMain@Base @SVER@
_PyInterpreterState_Enable@Base @SVER@
+ _PyInterpreterState_Get@Base @SVER@
+ _PyInterpreterState_GetIDObject@Base @SVER@
+ _PyInterpreterState_GetMainModule@Base @SVER@
_PyInterpreterState_IDDecref@Base @SVER@
_PyInterpreterState_IDIncref@Base @SVER@
_PyInterpreterState_IDInitref@Base @SVER@
_PyInterpreterState_LookUpID@Base @SVER@
+ _PyInterpreterState_RequireIDRef@Base @SVER@
+ _PyInterpreterState_RequiresIDRef@Base @SVER@
_PyList_DebugMallocStats@Base @SVER@
_PyList_Extend@Base @SVER@
_PyLong_AsByteArray@Base @SVER@
@@ -1375,23 +1478,28 @@
_PyLong_FromByteArray@Base @SVER@
_PyLong_FromBytes@Base @SVER@
_PyLong_FromGid@Base @SVER@
+ _PyLong_FromNbIndexOrNbInt@Base @SVER@
_PyLong_FromNbInt@Base @SVER@
_PyLong_FromTime_t@Base @SVER@
_PyLong_FromUid@Base @SVER@
_PyLong_GCD@Base @SVER@
_PyLong_Init@Base @SVER@
+ _PyLong_Lshift@Base @SVER@
_PyLong_New@Base @SVER@
_PyLong_NumBits@Base @SVER@
_PyLong_One@Base @SVER@
+ _PyLong_Rshift@Base @SVER@
_PyLong_Sign@Base @SVER@
+ _PyLong_Size_t_Converter@Base @SVER@
+ _PyLong_UnsignedInt_Converter@Base @SVER@
+ _PyLong_UnsignedLongLong_Converter@Base @SVER@
+ _PyLong_UnsignedLong_Converter@Base @SVER@
+ _PyLong_UnsignedShort_Converter@Base @SVER@
_PyLong_Zero@Base @SVER@
- _PyMainInterpreterConfig_AsDict@Base @SVER@
- _PyMainInterpreterConfig_Clear@Base @SVER@
- _PyMainInterpreterConfig_Copy@Base @SVER@
- _PyMainInterpreterConfig_Read@Base @SVER@
_PyManagedBuffer_Type@Base @SVER@
_PyMem_DumpTraceback@Base @SVER@
- _PyMem_GetAllocatorsName@Base @SVER@
+ _PyMem_GetAllocatorName@Base @SVER@
+ _PyMem_GetCurrentAllocatorName@Base @SVER@
_PyMem_RawStrdup@Base @SVER@
_PyMem_RawWcsdup@Base @SVER@
_PyMem_SetDefaultAllocator@Base @SVER@
@@ -1399,14 +1507,15 @@
_PyMem_Strdup@Base @SVER@
_PyMethodDef_RawFastCallDict@Base @SVER@
_PyMethodDef_RawFastCallKeywords@Base @SVER@
- _PyMethodDescr_FastCallKeywords@Base @SVER@
_PyMethodWrapper_Type@Base @SVER@
_PyMethod_DebugMallocStats@Base @SVER@
+ _PyModuleSpec_IsInitializing@Base @SVER@
_PyModule_Clear@Base @SVER@
_PyModule_ClearDict@Base @SVER@
_PyModule_CreateInitialized@Base @SVER@
_PyNamespace_New@Base @SVER@
_PyNamespace_Type@Base @SVER@
+ _PyNode_FinalizeEndPos@Base @SVER@
_PyNode_SizeOf@Base @SVER@
_PyNone_Type@Base @SVER@
_PyNotImplemented_Type@Base @SVER@
@@ -1421,17 +1530,19 @@
_PyOS_opterr@Base @SVER@
_PyOS_optind@Base @SVER@
_PyObjectDict_SetItem@Base @SVER@
+ _PyObject_AssertFailed@Base @SVER@
_PyObject_CallFunction_SizeT@Base @SVER@
_PyObject_CallMethodId@Base @SVER@
_PyObject_CallMethodIdObjArgs@Base @SVER@
_PyObject_CallMethodId_SizeT@Base @SVER@
_PyObject_CallMethod_SizeT@Base @SVER@
_PyObject_Call_Prepend@Base @SVER@
+ _PyObject_CheckConsistency@Base @SVER@
+ _PyObject_CheckCrossInterpreterData@Base @SVER@
_PyObject_DebugMallocStats@Base @SVER@
_PyObject_DebugTypeStats@Base @SVER@
_PyObject_Dump@Base @SVER@
_PyObject_FastCallDict@Base @SVER@
- _PyObject_FastCallKeywords@Base @SVER@
_PyObject_FastCall_Prepend@Base @SVER@
_PyObject_GC_Calloc@Base @SVER@
_PyObject_GC_Malloc@Base @SVER@
@@ -1441,17 +1552,17 @@
_PyObject_GenericGetAttrWithDict@Base @SVER@
_PyObject_GenericSetAttrWithDict@Base @SVER@
_PyObject_GetAttrId@Base @SVER@
- _PyObject_GetBuiltin@Base @SVER@
+ _PyObject_GetCrossInterpreterData@Base @SVER@
_PyObject_GetDictPtr@Base @SVER@
_PyObject_GetMethod@Base @SVER@
_PyObject_HasAttrId@Base @SVER@
- _PyObject_HasFastCall@Base @SVER@
_PyObject_HasLen@Base @SVER@
_PyObject_IsAbstract@Base @SVER@
_PyObject_IsFreed@Base @SVER@
_PyObject_LookupAttr@Base @SVER@
_PyObject_LookupAttrId@Base @SVER@
_PyObject_LookupSpecial@Base @SVER@
+ _PyObject_MakeTpCall@Base @SVER@
_PyObject_New@Base @SVER@
_PyObject_NewVar@Base @SVER@
_PyObject_NextNotImplemented@Base @SVER@
@@ -1461,11 +1572,26 @@
_PyParser_Grammar@Base @SVER@
_PyParser_TokenNames@Base @SVER@
_PyPathConfig_Calculate@Base @SVER@
- _PyPathConfig_Clear@Base @SVER@
- _PyPathConfig_ComputeArgv0@Base @SVER@
- _PyPathConfig_Init@Base @SVER@
- (arch=alpha amd64 arm64 ia64 mips64 mips64el mips64r6 mips64r6el ppc64el riscv64 kfreebsd-amd64)_PySHA3_KeccakF1600_FastLoop_Absorb@Base @SVER@
- (arch=!alpha !amd64 !arm64 !ia64 !mips64 !mips64el !mips64r6 !mips64r6el !ppc64el !riscv64 !kfreebsd-amd64 !illumos-amd64)_PySHA3_KeccakP1600_AddByte@Base @SVER@
+ _PyPathConfig_ClearGlobal@Base @SVER@
+ _PyPathConfig_ComputeSysPath0@Base @SVER@
+ _PyPreCmdline_Clear@Base @SVER@
+ _PyPreCmdline_Read@Base @SVER@
+ _PyPreCmdline_SetArgv@Base @SVER@
+ _PyPreCmdline_SetConfig@Base @SVER@
+ _PyPreConfig_AsDict@Base @SVER@
+ _PyPreConfig_GetConfig@Base @SVER@
+ _PyPreConfig_InitCompatConfig@Base @SVER@
+ _PyPreConfig_InitFromConfig@Base @SVER@
+ _PyPreConfig_InitFromPreConfig@Base @SVER@
+ _PyPreConfig_Read@Base @SVER@
+ _PyPreConfig_Write@Base @SVER@
+ _PyRuntime@Base @SVER@
+ _PyRuntimeState_Fini@Base @SVER@
+ _PyRuntimeState_Init@Base @SVER@
+ _PyRuntimeState_ReInitThreads@Base @SVER@
+ _PyRuntime_Finalize@Base @SVER@
+ _PyRuntime_Initialize@Base @SVER@
+ _PySHA3_KeccakF1600_FastLoop_Absorb@Base @SVER@
_PySHA3_KeccakP1600_AddBytes@Base @SVER@
_PySHA3_KeccakP1600_AddBytesInLane@Base @SVER@
_PySHA3_KeccakP1600_AddLanes@Base @SVER@
@@ -1482,8 +1608,6 @@
_PySHA3_KeccakP1600_OverwriteWithZeroes@Base @SVER@
_PySHA3_KeccakP1600_Permute_12rounds@Base @SVER@
_PySHA3_KeccakP1600_Permute_24rounds@Base @SVER@
- (arch=!alpha !amd64 !arm64 !ia64 !mips64 !mips64el !mips64r6 !mips64r6el !ppc64el !kfreebsd-amd64 !illumos-amd64 !riscv64)_PySHA3_KeccakP1600_Permute_Nrounds@Base @SVER@
- (arch=!alpha !amd64 !arm64 !ia64 !mips64 !mips64el !mips64r6 !mips64r6el !ppc64el !kfreebsd-amd64 !illumos-amd64 !riscv64)_PySHA3_KeccakP1600_SetBytesInLaneToZero@Base @SVER@
_PySHA3_KeccakWidth1600_Sponge@Base @SVER@
_PySHA3_KeccakWidth1600_SpongeAbsorb@Base @SVER@
_PySHA3_KeccakWidth1600_SpongeAbsorbLastFewBits@Base @SVER@
@@ -1493,11 +1617,6 @@
_PySHA3_Keccak_HashInitialize@Base @SVER@
_PySHA3_Keccak_HashSqueeze@Base @SVER@
_PySHA3_Keccak_HashUpdate@Base @SVER@
- _PyRuntime@Base @SVER@
- _PyRuntimeState_Fini@Base @SVER@
- _PyRuntimeState_Init@Base @SVER@
- _PyRuntime_Finalize@Base @SVER@
- _PyRuntime_Initialize@Base @SVER@
_PySequence_BytesToCharpArray@Base @SVER@
_PySequence_IterSearch@Base @SVER@
_PySet_Dummy@Base @SVER@
@@ -1507,26 +1626,29 @@
_PySlice_FromIndices@Base @SVER@
_PySlice_GetLongIndices@Base @SVER@
_PyStack_AsDict@Base @SVER@
- _PyStack_AsTuple@Base @SVER@
- _PyStack_AsTupleSlice@Base @SVER@
_PyStack_UnpackDict@Base @SVER@
_PyState_AddModule@Base @SVER@
_PyState_ClearModules@Base @SVER@
_PyStructSequence_Init@Base @SVER@
- _PySys_AddWarnOptionWithError@Base @SVER@
- _PySys_AddXOptionWithError@Base @SVER@
- _PySys_BeginInit@Base @SVER@
- _PySys_EndInit@Base @SVER@
+ _PySys_ClearAuditHooks@Base @SVER@
+ _PySys_Create@Base @SVER@
_PySys_GetObjectId@Base @SVER@
_PySys_GetSizeOf@Base @SVER@
_PySys_ImplCacheTag@Base @SVER@
_PySys_ImplName@Base @SVER@
+ _PySys_InitMain@Base @SVER@
+ _PySys_ReadPreinitWarnOptions@Base @SVER@
+ _PySys_ReadPreinitXOptions@Base @SVER@
_PySys_SetObjectId@Base @SVER@
+ _PySys_SetPreliminaryStderr@Base @SVER@
_PyThreadState_DeleteExcept@Base @SVER@
_PyThreadState_Init@Base @SVER@
_PyThreadState_Prealloc@Base @SVER@
+ _PyThreadState_Swap@Base @SVER@
_PyThreadState_UncheckedGet@Base @SVER@
_PyThread_CurrentFrames@Base @SVER@
+ _PyThread_cond_after@Base @SVER@
+ _PyThread_cond_init@Base @SVER@
_PyTime_AsMicroseconds@Base @SVER@
_PyTime_AsMilliseconds@Base @SVER@
_PyTime_AsNanosecondsObject@Base @SVER@
@@ -1555,24 +1677,29 @@
_PyTime_ObjectToTimeval@Base @SVER@
_PyTime_gmtime@Base @SVER@
_PyTime_localtime@Base @SVER@
+ _PyTraceBack_FromFrame@Base @SVER@
_PyTraceMalloc_Fini@Base @SVER@
_PyTraceMalloc_GetTraceback@Base @SVER@
_PyTraceMalloc_Init@Base @SVER@
+ _PyTraceMalloc_NewReference@Base @SVER@
_PyTraceback_Add@Base @SVER@
_PyTrash_deposit_object@Base @SVER@
_PyTrash_destroy_chain@Base @SVER@
_PyTrash_thread_deposit_object@Base @SVER@
_PyTrash_thread_destroy_chain@Base @SVER@
_PyTuple_DebugMallocStats@Base @SVER@
+ _PyTuple_FromArray@Base @SVER@
_PyTuple_MaybeUntrack@Base @SVER@
_PyTuple_Resize@Base @SVER@
_PyType_CalculateMetaclass@Base @SVER@
+ _PyType_CheckConsistency@Base @SVER@
_PyType_Fini@Base @SVER@
_PyType_GetDocFromInternalDoc@Base @SVER@
_PyType_GetTextSignatureFromInternalDoc@Base @SVER@
_PyType_Lookup@Base @SVER@
_PyType_LookupId@Base @SVER@
_PyType_Name@Base @SVER@
+ _PyTypes_Init@Base @SVER@
_PyUnicodeTranslateError_Create@Base @SVER@
_PyUnicodeWriter_Dealloc@Base @SVER@
_PyUnicodeWriter_Finish@Base @SVER@
@@ -1591,11 +1718,11 @@
_PyUnicode_AsUnicode@Base @SVER@
_PyUnicode_BidirectionalNames@Base @SVER@
_PyUnicode_CategoryNames@Base @SVER@
+ _PyUnicode_CheckConsistency@Base @SVER@
_PyUnicode_ClearStaticStrings@Base @SVER@
_PyUnicode_Copy@Base @SVER@
_PyUnicode_Database_Records@Base @SVER@
_PyUnicode_DecodeUnicodeEscape@Base @SVER@
- _PyUnicode_DecodeUnicodeInternal@Base @SVER@
_PyUnicode_EQ@Base @SVER@
_PyUnicode_EastAsianWidthNames@Base @SVER@
_PyUnicode_EncodeCharmap@Base @SVER@
@@ -1614,6 +1741,7 @@
_PyUnicode_FromASCII@Base @SVER@
_PyUnicode_FromId@Base @SVER@
_PyUnicode_Init@Base @SVER@
+ _PyUnicode_InitEncodings@Base @SVER@
_PyUnicode_InsertThousandsGrouping@Base @SVER@
_PyUnicode_IsAlpha@Base @SVER@
_PyUnicode_IsCaseIgnorable@Base @SVER@
@@ -1644,12 +1772,17 @@
_PyUnicode_TransformDecimalAndSpaceToASCII@Base @SVER@
_PyUnicode_TypeRecords@Base @SVER@
_PyUnicode_XStrip@Base @SVER@
+ _PyWarnings_Fini@Base @SVER@
_PyWarnings_Init@Base @SVER@
_PyWeakref_CallableProxyType@Base @SVER@
_PyWeakref_ClearRef@Base @SVER@
_PyWeakref_GetWeakrefCount@Base @SVER@
_PyWeakref_ProxyType@Base @SVER@
_PyWeakref_RefType@Base @SVER@
+ _PyWideStringList_AsList@Base @SVER@
+ _PyWideStringList_Clear@Base @SVER@
+ _PyWideStringList_Copy@Base @SVER@
+ _PyWideStringList_Extend@Base @SVER@
_Py_AnnAssign@Base @SVER@
_Py_Assert@Base @SVER@
_Py_Assign@Base @SVER@
@@ -1664,13 +1797,14 @@
_Py_Break@Base @SVER@
_Py_BreakPoint@Base @SVER@
_Py_BuildValue_SizeT@Base @SVER@
- _Py_Bytes@Base @SVER@
_Py_Call@Base @SVER@
_Py_CheckFunctionResult@Base @SVER@
- _Py_CheckHashBasedPycsMode@Base @SVER@
_Py_CheckRecursionLimit@Base @SVER@
_Py_CheckRecursiveCall@Base @SVER@
_Py_ClassDef@Base @SVER@
+ _Py_ClearArgcArgv@Base @SVER@
+ _Py_ClearFileSystemEncoding@Base @SVER@
+ _Py_ClearStandardStreamEncoding@Base @SVER@
_Py_CoerceLegacyLocale@Base @SVER@
_Py_Compare@Base @SVER@
_Py_Constant@Base @SVER@
@@ -1686,9 +1820,9 @@
_Py_DumpASCII@Base @SVER@
_Py_DumpDecimal@Base @SVER@
_Py_DumpHexadecimal@Base @SVER@
+ _Py_DumpPathConfig@Base @SVER@
_Py_DumpTraceback@Base @SVER@
_Py_DumpTracebackThreads@Base @SVER@
- _Py_Ellipsis@Base @SVER@
_Py_EllipsisObject@Base @SVER@
_Py_EncodeLocaleEx@Base @SVER@
_Py_EncodeLocaleRaw@Base @SVER@
@@ -1698,19 +1832,24 @@
_Py_Expression@Base @SVER@
_Py_ExtSlice@Base @SVER@
_Py_FalseStruct@Base @SVER@
- _Py_FatalInitError@Base @SVER@
_Py_FindEnvConfigValue@Base @SVER@
+ _Py_FinishPendingCalls@Base @SVER@
_Py_For@Base @SVER@
_Py_FormattedValue@Base @SVER@
_Py_FreeCharPArray@Base @SVER@
_Py_FunctionDef@Base @SVER@
+ _Py_FunctionType@Base @SVER@
_Py_GeneratorExp@Base @SVER@
_Py_GetAllocatedBlocks@Base @SVER@
+ _Py_GetConfigsAsDict@Base @SVER@
+ _Py_GetEnv@Base @SVER@
+ _Py_GetErrorHandler@Base @SVER@
_Py_GetForceASCII@Base @SVER@
- _Py_GetGlobalVariablesAsDict@Base @SVER@
_Py_GetLocaleconvNumeric@Base @SVER@
_Py_Gid_Converter@Base @SVER@
_Py_Global@Base @SVER@
+ _Py_HandleSystemExit@Base @SVER@
+ _Py_HasFileSystemDefaultEncodeErrors@Base @SVER@
_Py_HashBytes@Base @SVER@
_Py_HashDouble@Base @SVER@
_Py_HashPointer@Base @SVER@
@@ -1722,56 +1861,56 @@
_Py_Import@Base @SVER@
_Py_ImportFrom@Base @SVER@
_Py_Index@Base @SVER@
- _Py_InitializeCore@Base @SVER@
- _Py_InitializeCore_impl@Base @SVER@
- _Py_InitializeFromConfig@Base @SVER@
- _Py_InitializeMainInterpreter@Base @SVER@
- _Py_Initialize_ReadEnvVarsNoAlloc@Base @SVER@
+ _Py_InitializeMain@Base @SVER@
_Py_Interactive@Base @SVER@
_Py_IsCoreInitialized@Base @SVER@
_Py_IsFinalizing@Base @SVER@
+ _Py_IsLocaleCoercionTarget@Base @SVER@
_Py_JoinedStr@Base @SVER@
_Py_KeyedHash@Base @SVER@
_Py_Lambda@Base @SVER@
_Py_LegacyLocaleDetected@Base @SVER@
_Py_List@Base @SVER@
_Py_ListComp@Base @SVER@
- _Py_M__importlib@Base @SVER@
- _Py_M__importlib_external@Base @SVER@
+ _Py_M__importlib_bootstrap@Base @SVER@
+ _Py_M__importlib_bootstrap_external@Base @SVER@
+ _Py_M__zipimport@Base @SVER@
_Py_Mangle@Base @SVER@
_Py_Module@Base @SVER@
_Py_Name@Base @SVER@
- _Py_NameConstant@Base @SVER@
+ _Py_NamedExpr@Base @SVER@
_Py_NoneStruct@Base @SVER@
_Py_Nonlocal@Base @SVER@
_Py_NotImplementedStruct@Base @SVER@
- _Py_Num@Base @SVER@
_Py_PackageContext@Base @SVER@
_Py_Pass@Base @SVER@
+ _Py_PreInitializeFromConfig@Base @SVER@
+ _Py_PreInitializeFromPyArgv@Base @SVER@
_Py_PyAtExit@Base @SVER@
_Py_Raise@Base @SVER@
- _Py_ReadHashSeed@Base @SVER@
- _Py_ReadyTypes@Base @SVER@
- _Py_ReleaseInternedUnicodeStrings@Base @SVER@
_Py_ResetForceASCII@Base @SVER@
_Py_RestoreSignals@Base @SVER@
_Py_Return@Base @SVER@
_Py_Set@Base @SVER@
_Py_SetComp@Base @SVER@
+ _Py_SetFileSystemEncoding@Base @SVER@
_Py_SetLocaleFromEnv@Base @SVER@
_Py_SetProgramFullPath@Base @SVER@
+ _Py_Sigset_Converter@Base @SVER@
_Py_Slice@Base @SVER@
+ _Py_SourceAsString@Base @SVER@
_Py_Starred@Base @SVER@
- _Py_Str@Base @SVER@
_Py_Subscript@Base @SVER@
_Py_Suite@Base @SVER@
_Py_SwappedOp@Base @SVER@
+ _Py_SymtableStringObjectFlags@Base @SVER@
_Py_TrueStruct@Base @SVER@
_Py_Try@Base @SVER@
_Py_Tuple@Base @SVER@
+ _Py_TypeIgnore@Base @SVER@
_Py_Uid_Converter@Base @SVER@
_Py_UnaryOp@Base @SVER@
- _Py_UnixMain@Base @SVER@
+ _Py_UnhandledKeyboardInterrupt@Base @SVER@
_Py_VaBuildStack@Base @SVER@
_Py_VaBuildStack_SizeT@Base @SVER@
_Py_VaBuildValue_SizeT@Base @SVER@
@@ -1782,12 +1921,6 @@
_Py_abstract_hack@Base @SVER@
_Py_add_one_to_index_C@Base @SVER@
_Py_add_one_to_index_F@Base @SVER@
- _Py_addarc@Base @SVER@
- _Py_addbit@Base @SVER@
- _Py_adddfa@Base @SVER@
- _Py_addfirstsets@Base @SVER@
- _Py_addlabel@Base @SVER@
- _Py_addstate@Base @SVER@
_Py_alias@Base @SVER@
_Py_arg@Base @SVER@
_Py_arguments@Base @SVER@
@@ -1824,14 +1957,12 @@
_Py_c_quot@Base @SVER@
_Py_c_sum@Base @SVER@
_Py_capitalize__doc__@Base @SVER@
- _Py_center__doc__@Base @SVER@
_Py_comprehension@Base @SVER@
_Py_convert_optional_to_ssize_t@Base @SVER@
_Py_count__doc__@Base @SVER@
_Py_ctype_table@Base @SVER@
_Py_ctype_tolower@Base @SVER@
_Py_ctype_toupper@Base @SVER@
- _Py_delbitset@Base @SVER@
_Py_device_encoding@Base @SVER@
(arch=!m68k)_Py_dg_dtoa@Base @SVER@
(arch=!m68k)_Py_dg_freedtoa@Base @SVER@
@@ -1840,18 +1971,15 @@
(arch=!m68k)_Py_dg_strtod@Base @SVER@
_Py_dup@Base @SVER@
_Py_endswith__doc__@Base @SVER@
- _Py_expandtabs__doc__@Base @SVER@
_Py_find__doc__@Base @SVER@
- _Py_findlabel@Base @SVER@
_Py_fopen@Base @SVER@
_Py_fopen_obj@Base @SVER@
- (arch=i386 hurd-i386 kfreebsd-i386 m68k)_Py_force_double@Base @SVER@
- _Py_freegrammar@Base @SVER@
_Py_fstat@Base @SVER@
_Py_fstat_noraise@Base @SVER@
- (arch=amd64 i386 hurd-i386 kfreebsd-i386)_Py_get_387controlword@Base @SVER@
_Py_get_blocking@Base @SVER@
+ _Py_get_env_flag@Base @SVER@
_Py_get_inheritable@Base @SVER@
+ _Py_get_xoption@Base @SVER@
_Py_gitidentifier@Base @SVER@
_Py_gitversion@Base @SVER@
_Py_hashtable_clear@Base @SVER@
@@ -1877,38 +2005,32 @@
_Py_istitle__doc__@Base @SVER@
_Py_isupper__doc__@Base @SVER@
_Py_keyword@Base @SVER@
- _Py_ljust__doc__@Base @SVER@
_Py_log1p@Base @SVER@
_Py_lower__doc__@Base @SVER@
_Py_maketrans__doc__@Base @SVER@
- _Py_mergebitset@Base @SVER@
- _Py_meta_grammar@Base @SVER@
- _Py_newbitset@Base @SVER@
- _Py_newgrammar@Base @SVER@
_Py_normalize_encoding@Base @SVER@
_Py_open@Base @SVER@
_Py_open_cloexec_works@Base @SVER@
_Py_open_noraise@Base @SVER@
_Py_parse_inf_or_nan@Base @SVER@
_Py_path_config@Base @SVER@
- _Py_pgen@Base @SVER@
_Py_read@Base @SVER@
_Py_rfind__doc__@Base @SVER@
_Py_rindex__doc__@Base @SVER@
- _Py_rjust__doc__@Base @SVER@
- _Py_samebitset@Base @SVER@
- (arch=amd64 i386 hurd-i386 kfreebsd-i386)_Py_set_387controlword@Base @SVER@
_Py_set_blocking@Base @SVER@
_Py_set_inheritable@Base @SVER@
_Py_set_inheritable_async_safe@Base @SVER@
_Py_startswith__doc__@Base @SVER@
_Py_stat@Base @SVER@
+ _Py_str_to_int@Base @SVER@
_Py_strhex@Base @SVER@
_Py_strhex_bytes@Base @SVER@
+ _Py_strhex_bytes_with_sep@Base @SVER@
+ _Py_strhex_with_sep@Base @SVER@
_Py_string_to_number_with_underscores@Base @SVER@
_Py_swapcase__doc__@Base @SVER@
_Py_title__doc__@Base @SVER@
- _Py_translatelabels@Base @SVER@
+ _Py_tracemalloc_config@Base @SVER@
_Py_upper__doc__@Base @SVER@
_Py_wfopen@Base @SVER@
_Py_wgetcwd@Base @SVER@
@@ -1917,7 +2039,14 @@
_Py_wrealpath@Base @SVER@
_Py_write@Base @SVER@
_Py_write_noraise@Base @SVER@
- _Py_zfill__doc__@Base @SVER@
+
+ (arch=alpha amd64 arm64 ia64 mips64 mips64el mips64r6 mips64r6el ppc64el riscv64 kfreebsd-amd64)_PySHA3_KeccakF1600_FastLoop_Absorb@Base @SVER@
+ (arch=!alpha !amd64 !arm64 !ia64 !mips64 !mips64el !mips64r6 !mips64r6el !ppc64el !riscv64 !kfreebsd-amd64)_PySHA3_KeccakP1600_AddByte@Base @SVER@
+ (arch=!alpha !amd64 !arm64 !ia64 !mips64 !mips64el !mips64r6 !mips64r6el !ppc64el !kfreebsd-amd64 !riscv64)_PySHA3_KeccakP1600_Permute_Nrounds@Base @SVER@
+ (arch=!alpha !amd64 !arm64 !ia64 !mips64 !mips64el !mips64r6 !mips64r6el !ppc64el !kfreebsd-amd64 !riscv64)_PySHA3_KeccakP1600_SetBytesInLaneToZero@Base @SVER@
+ (arch=i386 hurd-i386 kfreebsd-i386 m68k)_Py_force_double@Base @SVER@
+ (arch=amd64 i386 hurd-i386 kfreebsd-i386)_Py_get_387controlword@Base @SVER@
+ (arch=amd64 i386 hurd-i386 kfreebsd-i386)_Py_set_387controlword@Base @SVER@
(optional|regex)"^_ctypes_.*@Base$" @SVER@
diff --git a/debian/patches/argparse-no-shutil.diff b/debian/patches/argparse-no-shutil.diff
new file mode 100644
index 0000000..4234ad5
--- /dev/null
+++ b/debian/patches/argparse-no-shutil.diff
@@ -0,0 +1,25 @@
+--- a/Lib/argparse.py
++++ b/Lib/argparse.py
+@@ -86,7 +86,6 @@ __all__ = [
+
+ import os as _os
+ import re as _re
+-import shutil as _shutil
+ import sys as _sys
+
+ try:
+@@ -175,8 +174,12 @@ class HelpFormatter(object):
+
+ # default setting for width
+ if width is None:
+- width = _shutil.get_terminal_size().columns
+- width -= 2
++ try:
++ import shutil as _shutil
++ width = _shutil.get_terminal_size().columns
++ width -= 2
++ except ImportError:
++ width = 70
+
+ self._prog = prog
+ self._indent_increment = indent_increment
diff --git a/debian/patches/arm-alignment.diff b/debian/patches/arm-alignment.diff
index a7a4b39..15d28b8 100644
--- a/debian/patches/arm-alignment.diff
+++ b/debian/patches/arm-alignment.diff
@@ -9,7 +9,7 @@ Description: Use aligned access for _sha3 module on ARM.
+/* Bus error on 32-bit ARM due to un-aligned memory accesses; 64-bit ARM
+ * doesn't complain but un-aligned memory accesses are sub-optimal */
+#if defined(__arm__) || defined(__aarch64__)
-+#define NO_MISALIGNED_ACCESSES
++#define NO_MISALIGNED_ACCESSES 1
+#endif
+
/* mangle names */
diff --git a/debian/patches/bdist-wininst-notfound.diff b/debian/patches/bdist-wininst-notfound.diff
index a716bf3..29a857d 100644
--- a/debian/patches/bdist-wininst-notfound.diff
+++ b/debian/patches/bdist-wininst-notfound.diff
@@ -1,11 +1,9 @@
# DP: suggest installation of the pythonX.Y-dev package, if bdist_wininst
# DP: cannot find the wininst-* files.
-Index: b/Lib/distutils/command/bdist_wininst.py
-===================================================================
--- a/Lib/distutils/command/bdist_wininst.py
+++ b/Lib/distutils/command/bdist_wininst.py
-@@ -359,6 +359,10 @@ class bdist_wininst(Command):
+@@ -372,6 +372,10 @@ class bdist_wininst(Command):
filename = os.path.join(directory, "wininst-%s%s.exe" % (bv, sfix))
f = open(filename, "rb")
try:
diff --git a/debian/patches/build-math-object.diff b/debian/patches/build-math-object.diff
index 904e9eb..6858c36 100644
--- a/debian/patches/build-math-object.diff
+++ b/debian/patches/build-math-object.diff
@@ -10,7 +10,7 @@
MODLIBS= _MODLIBS_
# === Variables set by configure
-@@ -602,8 +603,9 @@ pybuilddir.txt: $(BUILDPYTHON)
+@@ -595,8 +596,9 @@ pybuilddir.txt: $(BUILDPYTHON)
fi
# This is shared by the math and cmath modules
diff --git a/debian/patches/deb-setup.diff b/debian/patches/deb-setup.diff
index 748085d..3b231c0 100644
--- a/debian/patches/deb-setup.diff
+++ b/debian/patches/deb-setup.diff
@@ -2,7 +2,7 @@
--- a/setup.py
+++ b/setup.py
-@@ -337,8 +337,10 @@ class PyBuildExt(build_ext):
+@@ -385,8 +385,10 @@ class PyBuildExt(build_ext):
# unfortunately, distutils doesn't let us provide separate C and C++
# compilers
if compiler is not None:
@@ -15,17 +15,17 @@
self.compiler.set_executables(**args)
build_ext.build_extensions(self)
-@@ -576,12 +578,7 @@ class PyBuildExt(build_ext):
- os.unlink(tmpfile)
+@@ -645,12 +647,7 @@ class PyBuildExt(build_ext):
+ add_dir_to_list(dir_list, directory)
- def detect_modules(self):
+ def configure_compiler(self):
- # Ensure that /usr/local is always used, but the local build
- # directories (i.e. '.' and 'Include') must be first. See issue
- # 10520.
-- if not cross_compiling:
+- if not CROSS_COMPILING:
- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
- add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
+ # On Debian /usr/local is always used, so we don't include it twice
# only change this for cross builds for 3.3, issues on Mageia
- if cross_compiling:
- self.add_gcc_paths()
+ if CROSS_COMPILING:
+ self.add_cross_compiling_paths()
diff --git a/debian/patches/disable-sem-check.diff b/debian/patches/disable-sem-check.diff
index 387fd8a..7692891 100644
--- a/debian/patches/disable-sem-check.diff
+++ b/debian/patches/disable-sem-check.diff
@@ -2,7 +2,7 @@
--- a/configure.ac
+++ b/configure.ac
-@@ -4586,8 +4586,13 @@ int main(void) {
+@@ -4489,8 +4489,13 @@ int main(void) {
AC_MSG_RESULT($ac_cv_posix_semaphores_enabled)
if test $ac_cv_posix_semaphores_enabled = no
then
@@ -18,7 +18,7 @@
fi
# Multiprocessing check for broken sem_getvalue
-@@ -4622,8 +4627,13 @@ int main(void){
+@@ -4525,8 +4530,13 @@ int main(void){
AC_MSG_RESULT($ac_cv_broken_sem_getvalue)
if test $ac_cv_broken_sem_getvalue = yes
then
diff --git a/debian/patches/disable-some-tests.diff b/debian/patches/disable-some-tests.diff
index 7f8dc05..28b72ec 100644
--- a/debian/patches/disable-some-tests.diff
+++ b/debian/patches/disable-some-tests.diff
@@ -4,9 +4,9 @@ Index: b/Lib/distutils/tests/test_build_ext.py
===================================================================
--- a/Lib/distutils/tests/test_build_ext.py
+++ b/Lib/distutils/tests/test_build_ext.py
-@@ -102,6 +102,7 @@ class BuildExtTestCase(TempdirManager,
- self.assertIsInstance(xx.Null(), xx.Null)
- self.assertIsInstance(xx.Str(), xx.Str)
+@@ -111,6 +111,7 @@ class BuildExtTestCase(TempdirManager,
+ """)
+ assert_python_ok('-c', code)
+ @unittest.skip('Skipping failing Solaris test')
def test_solaris_enable_shared(self):
diff --git a/debian/patches/distutils-install-layout.diff b/debian/patches/distutils-install-layout.diff
index fbc6681..e8189b2 100644
--- a/debian/patches/distutils-install-layout.diff
+++ b/debian/patches/distutils-install-layout.diff
@@ -2,6 +2,8 @@
# DP: - installs into $prefix/dist-packages instead of $prefix/site-packages.
# DP: - doesn't encode the python version into the egg name.
+Index: b/Lib/distutils/command/install_egg_info.py
+===================================================================
--- a/Lib/distutils/command/install_egg_info.py
+++ b/Lib/distutils/command/install_egg_info.py
@@ -14,18 +14,38 @@ class install_egg_info(Command):
@@ -48,6 +50,8 @@
self.target = os.path.join(self.install_dir, basename)
self.outputs = [self.target]
+Index: b/Lib/distutils/command/install.py
+===================================================================
--- a/Lib/distutils/command/install.py
+++ b/Lib/distutils/command/install.py
@@ -35,6 +35,20 @@ INSTALL_SCHEMES = {
@@ -135,9 +139,11 @@
def finalize_other(self):
"""Finalizes options for non-posix platforms"""
+Index: b/Lib/distutils/sysconfig.py
+===================================================================
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
-@@ -140,6 +140,7 @@ def get_python_lib(plat_specific=0, stan
+@@ -139,6 +139,7 @@ def get_python_lib(plat_specific=0, stan
If 'prefix' is supplied, use it instead of sys.base_prefix or
sys.base_exec_prefix -- i.e., ignore 'plat_specific'.
"""
@@ -145,7 +151,7 @@
if prefix is None:
if standard_lib:
prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX
-@@ -151,6 +152,12 @@ def get_python_lib(plat_specific=0, stan
+@@ -150,6 +151,12 @@ def get_python_lib(plat_specific=0, stan
"lib", "python" + get_python_version())
if standard_lib:
return libpython
@@ -158,6 +164,8 @@
else:
return os.path.join(libpython, "site-packages")
elif os.name == "nt":
+Index: b/Lib/site.py
+===================================================================
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -7,12 +7,18 @@
@@ -180,7 +188,7 @@
If a file named "pyvenv.cfg" exists one directory above sys.executable,
sys.prefix and sys.exec_prefix are set to that directory and
it is also checked for site-packages (sys.base_prefix and
-@@ -334,9 +340,20 @@ def getsitepackages(prefixes=None):
+@@ -335,9 +341,20 @@ def getsitepackages(prefixes=None):
seen.add(prefix)
if os.sep == '/':
@@ -203,9 +211,11 @@
else:
sitepackages.append(prefix)
sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
+Index: b/Lib/test/test_site.py
+===================================================================
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
-@@ -269,10 +269,10 @@ class HelperFunctionsTests(unittest.Test
+@@ -266,10 +266,10 @@ class HelperFunctionsTests(unittest.Test
dirs = site.getsitepackages()
if os.sep == '/':
# OS X, Linux, FreeBSD, etc
@@ -219,6 +229,8 @@
self.assertEqual(dirs[0], wanted)
else:
# other platforms
+Index: b/Lib/distutils/tests/test_bdist_dumb.py
+===================================================================
--- a/Lib/distutils/tests/test_bdist_dumb.py
+++ b/Lib/distutils/tests/test_bdist_dumb.py
@@ -85,7 +85,7 @@ class BuildDumbTestCase(support.TempdirM
@@ -230,6 +242,8 @@
if not sys.dont_write_bytecode:
wanted.append('foo.%s.pyc' % sys.implementation.cache_tag)
self.assertEqual(contents, sorted(wanted))
+Index: b/Lib/distutils/tests/test_install.py
+===================================================================
--- a/Lib/distutils/tests/test_install.py
+++ b/Lib/distutils/tests/test_install.py
@@ -193,7 +193,7 @@ class InstallTestCase(support.TempdirMan
@@ -250,9 +264,11 @@
self.assertEqual(found, expected)
def test_debug_mode(self):
+Index: b/Lib/pydoc.py
+===================================================================
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
-@@ -420,6 +420,7 @@ class Doc:
+@@ -414,6 +414,7 @@ class Doc:
'marshal', 'posix', 'signal', 'sys',
'_thread', 'zipimport') or
(file.startswith(basedir) and
diff --git a/debian/patches/distutils-sysconfig.diff b/debian/patches/distutils-sysconfig.diff
index 3a87f2f..23d70b8 100644
--- a/debian/patches/distutils-sysconfig.diff
+++ b/debian/patches/distutils-sysconfig.diff
@@ -4,7 +4,7 @@
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
-@@ -195,9 +195,11 @@ def customize_compiler(compiler):
+@@ -194,9 +194,11 @@ def customize_compiler(compiler):
_osx_support.customize_compiler(_config_vars)
_config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'
@@ -18,7 +18,7 @@
if 'CC' in os.environ:
newcc = os.environ['CC']
-@@ -218,13 +220,22 @@ def customize_compiler(compiler):
+@@ -217,13 +219,22 @@ def customize_compiler(compiler):
cpp = cc + " -E" # not always
if 'LDFLAGS' in os.environ:
ldshared = ldshared + ' ' + os.environ['LDFLAGS']
@@ -41,3 +41,12 @@
if 'AR' in os.environ:
ar = os.environ['AR']
if 'ARFLAGS' in os.environ:
+@@ -237,7 +248,7 @@ def customize_compiler(compiler):
+ compiler=cc_cmd,
+ compiler_so=cc_cmd + ' ' + ccshared,
+ compiler_cxx=cxx,
+- linker_so=ldshared,
++ linker_so=ldshared + ' ' + ccshared,
+ linker_exe=cc,
+ archiver=archiver)
+
diff --git a/debian/patches/doc-build-texinfo.diff b/debian/patches/doc-build-texinfo.diff
index 7297473..338db82 100644
--- a/debian/patches/doc-build-texinfo.diff
+++ b/debian/patches/doc-build-texinfo.diff
@@ -3,17 +3,17 @@ Author: Benjamin Moody <benjamin@physionet.org>
Bug-Debian: https://bugs.debian.org/881959
Last-Update: 2017-11-27
---- python3.7-3.7.0~a2.orig/Doc/Makefile
-+++ python3.7-3.7.0~a2/Doc/Makefile
-@@ -27,6 +27,7 @@ help:
+--- a/Doc/Makefile
++++ b/Doc/Makefile
+@@ -32,6 +32,7 @@ help:
@echo " htmlview to open the index page built by the html target in your browser"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " texinfo to make Texinfo files"
@echo " text to make plain text files"
+ @echo " texinfo to make Texinfo file"
@echo " epub to make EPUB files"
- @echo " changes to make an overview over all changed/added/deprecated items"
-@@ -72,6 +73,11 @@ latex: build
+@@ -86,6 +87,11 @@ latex: build
@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
"run these through (pdf)latex."
diff --git a/debian/patches/ensurepip-disabled.diff b/debian/patches/ensurepip-disabled.diff
index ff221d7..be97912 100644
--- a/debian/patches/ensurepip-disabled.diff
+++ b/debian/patches/ensurepip-disabled.diff
@@ -1,5 +1,7 @@
# DP: Disable ensurepip for the system installation, only enable it for virtual environments.
+Index: b/Lib/ensurepip/__init__.py
+===================================================================
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -8,6 +8,34 @@ import tempfile
@@ -49,9 +51,11 @@
if altinstall and default_pip:
raise ValueError("Cannot use altinstall and default_pip together")
+Index: b/Lib/venv/__init__.py
+===================================================================
--- a/Lib/venv/__init__.py
+++ b/Lib/venv/__init__.py
-@@ -266,7 +266,28 @@ class EnvBuilder:
+@@ -286,7 +286,28 @@ class EnvBuilder:
# intended for the global Python environment
cmd = [context.env_exe, '-Im', 'ensurepip', '--upgrade',
'--default-pip']
diff --git a/debian/patches/ensurepip-wheels.diff b/debian/patches/ensurepip-wheels.diff
index 558cf9d..fe4757d 100644
--- a/debian/patches/ensurepip-wheels.diff
+++ b/debian/patches/ensurepip-wheels.diff
@@ -48,7 +48,7 @@
def _disable_pip_configuration_settings():
# We deliberately ignore all pip environment variables
-@@ -88,20 +93,44 @@ def _bootstrap(*, root=None, upgrade=Fal
+@@ -90,20 +95,44 @@ def _bootstrap(*, root=None, upgrade=Fal
# omit pip and easy_install
os.environ["ENSUREPIP_OPTIONS"] = "install"
@@ -103,7 +103,7 @@
# Construct the arguments to be passed to the pip command
args = ["install", "--no-index", "--find-links", tmpdir]
-@@ -114,7 +143,7 @@ def _bootstrap(*, root=None, upgrade=Fal
+@@ -116,7 +145,7 @@ def _bootstrap(*, root=None, upgrade=Fal
if verbosity:
args += ["-" + "v" * verbosity]
@@ -112,7 +112,7 @@
def _uninstall_helper(*, verbosity=0):
"""Helper to support a clean default uninstall process on Windows
-@@ -128,7 +157,8 @@ def _uninstall_helper(*, verbosity=0):
+@@ -130,7 +159,8 @@ def _uninstall_helper(*, verbosity=0):
return
# If the pip version doesn't match the bundled one, leave it alone
@@ -122,7 +122,7 @@
msg = ("ensurepip will only uninstall a matching version "
"({!r} installed, {!r} bundled)")
print(msg.format(pip.__version__, _PIP_VERSION), file=sys.stderr)
-@@ -141,7 +171,7 @@ def _uninstall_helper(*, verbosity=0):
+@@ -143,7 +173,7 @@ def _uninstall_helper(*, verbosity=0):
if verbosity:
args += ["-" + "v" * verbosity]
diff --git a/debian/patches/ext-no-libpython-link.diff b/debian/patches/ext-no-libpython-link.diff
index 21407d7..db29d9c 100644
--- a/debian/patches/ext-no-libpython-link.diff
+++ b/debian/patches/ext-no-libpython-link.diff
@@ -11,12 +11,12 @@
if not sysconfig.python_build:
# building third party extensions
self.library_dirs.append(sysconfig.get_config_var('LIBDIR'))
-@@ -724,7 +724,7 @@ class build_ext(Command):
- return ext.libraries
- else:
- from distutils import sysconfig
-- if sysconfig.get_config_var('Py_ENABLE_SHARED'):
-+ if False and sysconfig.get_config_var('Py_ENABLE_SHARED'):
- pythonlib = 'python{}.{}{}'.format(
- sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff,
- sysconfig.get_config_var('ABIFLAGS'))
+@@ -725,7 +725,7 @@ class build_ext(Command):
+ # shared libraries are resolved at link time.
+ from distutils.sysconfig import get_config_var
+ link_libpython = False
+- if get_config_var('Py_ENABLE_SHARED'):
++ if False and get_config_var('Py_ENABLE_SHARED'):
+ # A native build on an Android device or on Cygwin
+ if hasattr(sys, 'getandroidapilevel'):
+ link_libpython = True
diff --git a/debian/patches/git-updates.diff b/debian/patches/git-updates.diff
index 773b020..fbfc739 100644
--- a/debian/patches/git-updates.diff
+++ b/debian/patches/git-updates.diff
@@ -1,4 +1,13728 @@
-# DP: updates from the 3.7 branch (until 2019-09-04).
+# DP: updates from the 3.8 branch (until 2019-11-23).
-# git diff --no-renames e09359112e250268eca209355abeb17abf822486 6b8121a261917256198ac5bc3a02306a05cea169 | filterdiff -x ?/.hgignore -x ?/.hgeol -x ?/.hgtags -x ?/.hgtouch -x ?/.gitignore -x ?/.gitattributes -x '?/.github/*' -x '?/.git*' -x ?/.codecov.yml -x ?/.travis.yml -x ?/configure --remove-timestamps
+# git diff --no-renames fa919fdf2583bdfead1df00e842f24f30b2a34bf b9e5547f5814962964c4a5bd5cd36a2af8fbf974 | filterdiff -x ?/.hgignore -x ?/.hgeol -x ?/.hgtags -x ?/.hgtouch -x ?/.gitignore -x ?/.gitattributes -x '?/.github/*' -x '?/.git*' -x ?/.codecov.yml -x ?/.travis.yml -x ?/configure --remove-timestamps
+diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst
+index ba9ca5e0d3..f17c63d0b9 100644
+--- a/Doc/c-api/arg.rst
++++ b/Doc/c-api/arg.rst
+@@ -50,7 +50,7 @@ Unless otherwise stated, buffers are not NUL-terminated.
+
+ Some formats require a read-only :term:`bytes-like object`, and set a
+ pointer instead of a buffer structure. They work by checking that
+-the object's :c:member:`PyBufferProcs.bf_releasebuffer` field is *NULL*,
++the object's :c:member:`PyBufferProcs.bf_releasebuffer` field is ``NULL``,
+ which disallows mutable objects such as :class:`bytearray`.
+
+ .. note::
+@@ -99,15 +99,15 @@ which disallows mutable objects such as :class:`bytearray`.
+
+ ``z`` (:class:`str` or ``None``) [const char \*]
+ Like ``s``, but the Python object may also be ``None``, in which case the C
+- pointer is set to *NULL*.
++ pointer is set to ``NULL``.
+
+ ``z*`` (:class:`str`, :term:`bytes-like object` or ``None``) [Py_buffer]
+ Like ``s*``, but the Python object may also be ``None``, in which case the
+- ``buf`` member of the :c:type:`Py_buffer` structure is set to *NULL*.
++ ``buf`` member of the :c:type:`Py_buffer` structure is set to ``NULL``.
+
+ ``z#`` (:class:`str`, read-only :term:`bytes-like object` or ``None``) [const char \*, int]
+ Like ``s#``, but the Python object may also be ``None``, in which case the C
+- pointer is set to *NULL*.
++ pointer is set to ``NULL``.
+
+ ``y`` (read-only :term:`bytes-like object`) [const char \*]
+ This format converts a bytes-like object to a C pointer to a character
+@@ -166,7 +166,7 @@ which disallows mutable objects such as :class:`bytearray`.
+
+ ``Z`` (:class:`str` or ``None``) [const Py_UNICODE \*]
+ Like ``u``, but the Python object may also be ``None``, in which case the
+- :c:type:`Py_UNICODE` pointer is set to *NULL*.
++ :c:type:`Py_UNICODE` pointer is set to ``NULL``.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+@@ -174,7 +174,7 @@ which disallows mutable objects such as :class:`bytearray`.
+
+ ``Z#`` (:class:`str` or ``None``) [const Py_UNICODE \*, int]
+ Like ``u#``, but the Python object may also be ``None``, in which case the
+- :c:type:`Py_UNICODE` pointer is set to *NULL*.
++ :c:type:`Py_UNICODE` pointer is set to ``NULL``.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+@@ -197,7 +197,7 @@ which disallows mutable objects such as :class:`bytearray`.
+
+ This format requires two arguments. The first is only used as input, and
+ must be a :c:type:`const char\*` which points to the name of an encoding as a
+- NUL-terminated string, or *NULL*, in which case ``'utf-8'`` encoding is used.
++ NUL-terminated string, or ``NULL``, in which case ``'utf-8'`` encoding is used.
+ An exception is raised if the named encoding is not known to Python. The
+ second argument must be a :c:type:`char\*\*`; the value of the pointer it
+ references will be set to a buffer with the contents of the argument text.
+@@ -220,7 +220,7 @@ which disallows mutable objects such as :class:`bytearray`.
+
+ It requires three arguments. The first is only used as input, and must be a
+ :c:type:`const char\*` which points to the name of an encoding as a
+- NUL-terminated string, or *NULL*, in which case ``'utf-8'`` encoding is used.
++ NUL-terminated string, or ``NULL``, in which case ``'utf-8'`` encoding is used.
+ An exception is raised if the named encoding is not known to Python. The
+ second argument must be a :c:type:`char\*\*`; the value of the pointer it
+ references will be set to a buffer with the contents of the argument text.
+@@ -230,12 +230,12 @@ which disallows mutable objects such as :class:`bytearray`.
+
+ There are two modes of operation:
+
+- If *\*buffer* points a *NULL* pointer, the function will allocate a buffer of
++ If *\*buffer* points a ``NULL`` pointer, the function will allocate a buffer of
+ the needed size, copy the encoded data into this buffer and set *\*buffer* to
+ reference the newly allocated storage. The caller is responsible for calling
+ :c:func:`PyMem_Free` to free the allocated buffer after usage.
+
+- If *\*buffer* points to a non-*NULL* pointer (an already allocated buffer),
++ If *\*buffer* points to a non-``NULL`` pointer (an already allocated buffer),
+ :c:func:`PyArg_ParseTuple` will use this location as the buffer and interpret the
+ initial value of *\*buffer_length* as the buffer size. It will then copy the
+ encoded data into the buffer and NUL-terminate it. If the buffer is not large
+@@ -317,7 +317,7 @@ Other objects
+ ``O`` (object) [PyObject \*]
+ Store a Python object (without any conversion) in a C object pointer. The C
+ program thus receives the actual object that was passed. The object's reference
+- count is not increased. The pointer stored is not *NULL*.
++ count is not increased. The pointer stored is not ``NULL``.
+
+ ``O!`` (object) [*typeobject*, PyObject \*]
+ Store a Python object in a C object pointer. This is similar to ``O``, but
+@@ -345,7 +345,7 @@ Other objects
+ If the *converter* returns ``Py_CLEANUP_SUPPORTED``, it may get called a
+ second time if the argument parsing eventually fails, giving the converter a
+ chance to release any memory that it had already allocated. In this second
+- call, the *object* parameter will be NULL; *address* will have the same value
++ call, the *object* parameter will be ``NULL``; *address* will have the same value
+ as in the original call.
+
+ .. versionchanged:: 3.1
+@@ -437,7 +437,7 @@ API Functions
+
+ Parse the parameters of a function that takes both positional and keyword
+ parameters into local variables. The *keywords* argument is a
+- *NULL*-terminated array of keyword parameter names. Empty names denote
++ ``NULL``-terminated array of keyword parameter names. Empty names denote
+ :ref:`positional-only parameters <positional-only_parameter>`.
+ Returns true on success; on failure, it returns false and raises the
+ appropriate exception.
+@@ -520,8 +520,8 @@ Building values
+
+ Create a new value based on a format string similar to those accepted by the
+ :c:func:`PyArg_Parse\*` family of functions and a sequence of values. Returns
+- the value or *NULL* in the case of an error; an exception will be raised if
+- *NULL* is returned.
++ the value or ``NULL`` in the case of an error; an exception will be raised if
++ ``NULL`` is returned.
+
+ :c:func:`Py_BuildValue` does not always build a tuple. It builds a tuple only if
+ its format string contains two or more format units. If the format string is
+@@ -547,20 +547,20 @@ Building values
+
+ ``s`` (:class:`str` or ``None``) [const char \*]
+ Convert a null-terminated C string to a Python :class:`str` object using ``'utf-8'``
+- encoding. If the C string pointer is *NULL*, ``None`` is used.
++ encoding. If the C string pointer is ``NULL``, ``None`` is used.
+
+ ``s#`` (:class:`str` or ``None``) [const char \*, int]
+ Convert a C string and its length to a Python :class:`str` object using ``'utf-8'``
+- encoding. If the C string pointer is *NULL*, the length is ignored and
++ encoding. If the C string pointer is ``NULL``, the length is ignored and
+ ``None`` is returned.
+
+ ``y`` (:class:`bytes`) [const char \*]
+ This converts a C string to a Python :class:`bytes` object. If the C
+- string pointer is *NULL*, ``None`` is returned.
++ string pointer is ``NULL``, ``None`` is returned.
+
+ ``y#`` (:class:`bytes`) [const char \*, int]
+ This converts a C string and its lengths to a Python object. If the C
+- string pointer is *NULL*, ``None`` is returned.
++ string pointer is ``NULL``, ``None`` is returned.
+
+ ``z`` (:class:`str` or ``None``) [const char \*]
+ Same as ``s``.
+@@ -570,12 +570,12 @@ Building values
+
+ ``u`` (:class:`str`) [const wchar_t \*]
+ Convert a null-terminated :c:type:`wchar_t` buffer of Unicode (UTF-16 or UCS-4)
+- data to a Python Unicode object. If the Unicode buffer pointer is *NULL*,
++ data to a Python Unicode object. If the Unicode buffer pointer is ``NULL``,
+ ``None`` is returned.
+
+ ``u#`` (:class:`str`) [const wchar_t \*, int]
+ Convert a Unicode (UTF-16 or UCS-4) data buffer and its length to a Python
+- Unicode object. If the Unicode buffer pointer is *NULL*, the length is ignored
++ Unicode object. If the Unicode buffer pointer is ``NULL``, the length is ignored
+ and ``None`` is returned.
+
+ ``U`` (:class:`str` or ``None``) [const char \*]
+@@ -636,9 +636,9 @@ Building values
+
+ ``O`` (object) [PyObject \*]
+ Pass a Python object untouched (except for its reference count, which is
+- incremented by one). If the object passed in is a *NULL* pointer, it is assumed
++ incremented by one). If the object passed in is a ``NULL`` pointer, it is assumed
+ that this was caused because the call producing the argument found an error and
+- set an exception. Therefore, :c:func:`Py_BuildValue` will return *NULL* but won't
++ set an exception. Therefore, :c:func:`Py_BuildValue` will return ``NULL`` but won't
+ raise an exception. If no exception has been raised yet, :exc:`SystemError` is
+ set.
+
+@@ -653,7 +653,7 @@ Building values
+ ``O&`` (object) [*converter*, *anything*]
+ Convert *anything* to a Python object through a *converter* function. The
+ function is called with *anything* (which should be compatible with :c:type:`void
+- \*`) as its argument and should return a "new" Python object, or *NULL* if an
++ \*`) as its argument and should return a "new" Python object, or ``NULL`` if an
+ error occurred.
+
+ ``(items)`` (:class:`tuple`) [*matching-items*]
+@@ -668,7 +668,7 @@ Building values
+ respectively.
+
+ If there is an error in the format string, the :exc:`SystemError` exception is
+- set and *NULL* returned.
++ set and ``NULL`` returned.
+
+ .. c:function:: PyObject* Py_VaBuildValue(const char *format, va_list vargs)
+
+diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst
+index 67140511ef..4e6fa0b32e 100644
+--- a/Doc/c-api/buffer.rst
++++ b/Doc/c-api/buffer.rst
+@@ -102,13 +102,13 @@ a buffer, see :c:func:`PyObject_GetBuffer`.
+ .. c:member:: void \*obj
+
+ A new reference to the exporting object. The reference is owned by
+- the consumer and automatically decremented and set to *NULL* by
++ the consumer and automatically decremented and set to ``NULL`` by
+ :c:func:`PyBuffer_Release`. The field is the equivalent of the return
+ value of any standard C-API function.
+
+ As a special case, for *temporary* buffers that are wrapped by
+ :c:func:`PyMemoryView_FromBuffer` or :c:func:`PyBuffer_FillInfo`
+- this field is *NULL*. In general, exporting objects MUST NOT
++ this field is ``NULL``. In general, exporting objects MUST NOT
+ use this scheme.
+
+ .. c:member:: Py_ssize_t len
+@@ -130,25 +130,25 @@ a buffer, see :c:func:`PyObject_GetBuffer`.
+ .. c:member:: Py_ssize_t itemsize
+
+ Item size in bytes of a single element. Same as the value of :func:`struct.calcsize`
+- called on non-NULL :c:member:`~Py_buffer.format` values.
++ called on non-``NULL`` :c:member:`~Py_buffer.format` values.
+
+ Important exception: If a consumer requests a buffer without the
+ :c:macro:`PyBUF_FORMAT` flag, :c:member:`~Py_buffer.format` will
+- be set to *NULL*, but :c:member:`~Py_buffer.itemsize` still has
++ be set to ``NULL``, but :c:member:`~Py_buffer.itemsize` still has
+ the value for the original format.
+
+ If :c:member:`~Py_buffer.shape` is present, the equality
+ ``product(shape) * itemsize == len`` still holds and the consumer
+ can use :c:member:`~Py_buffer.itemsize` to navigate the buffer.
+
+- If :c:member:`~Py_buffer.shape` is *NULL* as a result of a :c:macro:`PyBUF_SIMPLE`
++ If :c:member:`~Py_buffer.shape` is ``NULL`` as a result of a :c:macro:`PyBUF_SIMPLE`
+ or a :c:macro:`PyBUF_WRITABLE` request, the consumer must disregard
+ :c:member:`~Py_buffer.itemsize` and assume ``itemsize == 1``.
+
+ .. c:member:: const char \*format
+
+ A *NUL* terminated string in :mod:`struct` module style syntax describing
+- the contents of a single item. If this is *NULL*, ``"B"`` (unsigned bytes)
++ the contents of a single item. If this is ``NULL``, ``"B"`` (unsigned bytes)
+ is assumed.
+
+ This field is controlled by the :c:macro:`PyBUF_FORMAT` flag.
+@@ -158,7 +158,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`.
+ The number of dimensions the memory represents as an n-dimensional array.
+ If it is ``0``, :c:member:`~Py_buffer.buf` points to a single item representing
+ a scalar. In this case, :c:member:`~Py_buffer.shape`, :c:member:`~Py_buffer.strides`
+- and :c:member:`~Py_buffer.suboffsets` MUST be *NULL*.
++ and :c:member:`~Py_buffer.suboffsets` MUST be ``NULL``.
+
+ The macro :c:macro:`PyBUF_MAX_NDIM` limits the maximum number of dimensions
+ to 64. Exporters MUST respect this limit, consumers of multi-dimensional
+@@ -199,7 +199,7 @@ a buffer, see :c:func:`PyObject_GetBuffer`.
+ memory block).
+
+ If all suboffsets are negative (i.e. no de-referencing is needed), then
+- this field must be NULL (the default value).
++ this field must be ``NULL`` (the default value).
+
+ This type of array representation is used by the Python Imaging Library
+ (PIL). See `complex arrays`_ for further information how to access elements
+@@ -248,7 +248,7 @@ readonly, format
+ .. c:macro:: PyBUF_FORMAT
+
+ Controls the :c:member:`~Py_buffer.format` field. If set, this field MUST
+- be filled in correctly. Otherwise, this field MUST be *NULL*.
++ be filled in correctly. Otherwise, this field MUST be ``NULL``.
+
+
+ :c:macro:`PyBUF_WRITABLE` can be \|'d to any of the flags in the next section.
+@@ -349,9 +349,9 @@ The logical structure of NumPy-style arrays is defined by :c:member:`~Py_buffer.
+
+ If ``ndim == 0``, the memory location pointed to by :c:member:`~Py_buffer.buf` is
+ interpreted as a scalar of size :c:member:`~Py_buffer.itemsize`. In that case,
+-both :c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides` are *NULL*.
++both :c:member:`~Py_buffer.shape` and :c:member:`~Py_buffer.strides` are ``NULL``.
+
+-If :c:member:`~Py_buffer.strides` is *NULL*, the array is interpreted as
++If :c:member:`~Py_buffer.strides` is ``NULL``, the array is interpreted as
+ a standard n-dimensional C-array. Otherwise, the consumer must access an
+ n-dimensional array as follows:
+
+@@ -407,7 +407,7 @@ to two ``char x[2][3]`` arrays that can be located anywhere in memory.
+
+
+ Here is a function that returns a pointer to the element in an N-D array
+-pointed to by an N-dimensional index when there are both non-NULL strides
++pointed to by an N-dimensional index when there are both non-``NULL`` strides
+ and suboffsets::
+
+ void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,
+@@ -438,7 +438,7 @@ Buffer-related functions
+
+ Send a request to *exporter* to fill in *view* as specified by *flags*.
+ If the exporter cannot provide a buffer of the exact type, it MUST raise
+- :c:data:`PyExc_BufferError`, set :c:member:`view->obj` to *NULL* and
++ :c:data:`PyExc_BufferError`, set :c:member:`view->obj` to ``NULL`` and
+ return ``-1``.
+
+ On success, fill in *view*, set :c:member:`view->obj` to a new reference
+@@ -516,8 +516,8 @@ Buffer-related functions
+
+ On success, set :c:member:`view->obj` to a new reference to *exporter* and
+ return 0. Otherwise, raise :c:data:`PyExc_BufferError`, set
+- :c:member:`view->obj` to *NULL* and return ``-1``;
++ :c:member:`view->obj` to ``NULL`` and return ``-1``;
+
+ If this function is used as part of a :ref:`getbufferproc <buffer-structs>`,
+ *exporter* MUST be set to the exporting object and *flags* must be passed
+- unmodified. Otherwise, *exporter* MUST be NULL.
++ unmodified. Otherwise, *exporter* MUST be ``NULL``.
+diff --git a/Doc/c-api/bytearray.rst b/Doc/c-api/bytearray.rst
+index b4a9660a91..b2f409c15a 100644
+--- a/Doc/c-api/bytearray.rst
++++ b/Doc/c-api/bytearray.rst
+@@ -48,7 +48,7 @@ Direct API functions
+ .. c:function:: PyObject* PyByteArray_FromStringAndSize(const char *string, Py_ssize_t len)
+
+ Create a new bytearray object from *string* and its length, *len*. On
+- failure, *NULL* is returned.
++ failure, ``NULL`` is returned.
+
+
+ .. c:function:: PyObject* PyByteArray_Concat(PyObject *a, PyObject *b)
+@@ -58,13 +58,13 @@ Direct API functions
+
+ .. c:function:: Py_ssize_t PyByteArray_Size(PyObject *bytearray)
+
+- Return the size of *bytearray* after checking for a *NULL* pointer.
++ Return the size of *bytearray* after checking for a ``NULL`` pointer.
+
+
+ .. c:function:: char* PyByteArray_AsString(PyObject *bytearray)
+
+ Return the contents of *bytearray* as a char array after checking for a
+- *NULL* pointer. The returned array always has an extra
++ ``NULL`` pointer. The returned array always has an extra
+ null byte appended.
+
+
+diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst
+index 9a62fb682d..0e33ed2c7c 100644
+--- a/Doc/c-api/bytes.rst
++++ b/Doc/c-api/bytes.rst
+@@ -37,14 +37,14 @@ called with a non-bytes parameter.
+ .. c:function:: PyObject* PyBytes_FromString(const char *v)
+
+ Return a new bytes object with a copy of the string *v* as value on success,
+- and *NULL* on failure. The parameter *v* must not be *NULL*; it will not be
++ and ``NULL`` on failure. The parameter *v* must not be ``NULL``; it will not be
+ checked.
+
+
+ .. c:function:: PyObject* PyBytes_FromStringAndSize(const char *v, Py_ssize_t len)
+
+ Return a new bytes object with a copy of the string *v* as value and length
+- *len* on success, and *NULL* on failure. If *v* is *NULL*, the contents of
++ *len* on success, and ``NULL`` on failure. If *v* is ``NULL``, the contents of
+ the bytes object are uninitialized.
+
+
+@@ -145,7 +145,7 @@ called with a non-bytes parameter.
+ whether there are any other null bytes. The data must not be
+ modified in any way, unless the object was just created using
+ ``PyBytes_FromStringAndSize(NULL, size)``. It must not be deallocated. If
+- *o* is not a bytes object at all, :c:func:`PyBytes_AsString` returns *NULL*
++ *o* is not a bytes object at all, :c:func:`PyBytes_AsString` returns ``NULL``
+ and raises :exc:`TypeError`.
+
+
+@@ -159,7 +159,7 @@ called with a non-bytes parameter.
+ Return the null-terminated contents of the object *obj*
+ through the output variables *buffer* and *length*.
+
+- If *length* is *NULL*, the bytes object
++ If *length* is ``NULL``, the bytes object
+ may not contain embedded null bytes;
+ if it does, the function returns ``-1`` and a :exc:`ValueError` is raised.
+
+@@ -181,7 +181,7 @@ called with a non-bytes parameter.
+ appended to *bytes*; the caller will own the new reference. The reference to
+ the old value of *bytes* will be stolen. If the new object cannot be
+ created, the old reference to *bytes* will still be discarded and the value
+- of *\*bytes* will be set to *NULL*; the appropriate exception will be set.
++ of *\*bytes* will be set to ``NULL``; the appropriate exception will be set.
+
+
+ .. c:function:: void PyBytes_ConcatAndDel(PyObject **bytes, PyObject *newpart)
+@@ -201,5 +201,5 @@ called with a non-bytes parameter.
+ desired. On success, *\*bytes* holds the resized bytes object and ``0`` is
+ returned; the address in *\*bytes* may differ from its input value. If the
+ reallocation fails, the original bytes object at *\*bytes* is deallocated,
+- *\*bytes* is set to *NULL*, :exc:`MemoryError` is set, and ``-1`` is
++ *\*bytes* is set to ``NULL``, :exc:`MemoryError` is set, and ``-1`` is
+ returned.
+diff --git a/Doc/c-api/capsule.rst b/Doc/c-api/capsule.rst
+index 3c921bbde3..78e21140b2 100644
+--- a/Doc/c-api/capsule.rst
++++ b/Doc/c-api/capsule.rst
+@@ -40,15 +40,15 @@ Refer to :ref:`using-capsules` for more information on using these objects.
+ .. c:function:: PyObject* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)
+
+ Create a :c:type:`PyCapsule` encapsulating the *pointer*. The *pointer*
+- argument may not be *NULL*.
++ argument may not be ``NULL``.
+
+- On failure, set an exception and return *NULL*.
++ On failure, set an exception and return ``NULL``.
+
+- The *name* string may either be *NULL* or a pointer to a valid C string. If
+- non-*NULL*, this string must outlive the capsule. (Though it is permitted to
++ The *name* string may either be ``NULL`` or a pointer to a valid C string. If
++ non-``NULL``, this string must outlive the capsule. (Though it is permitted to
+ free it inside the *destructor*.)
+
+- If the *destructor* argument is not *NULL*, it will be called with the
++ If the *destructor* argument is not ``NULL``, it will be called with the
+ capsule as its argument when it is destroyed.
+
+ If this capsule will be stored as an attribute of a module, the *name* should
+@@ -59,20 +59,20 @@ Refer to :ref:`using-capsules` for more information on using these objects.
+ .. c:function:: void* PyCapsule_GetPointer(PyObject *capsule, const char *name)
+
+ Retrieve the *pointer* stored in the capsule. On failure, set an exception
+- and return *NULL*.
++ and return ``NULL``.
+
+ The *name* parameter must compare exactly to the name stored in the capsule.
+- If the name stored in the capsule is *NULL*, the *name* passed in must also
+- be *NULL*. Python uses the C function :c:func:`strcmp` to compare capsule
++ If the name stored in the capsule is ``NULL``, the *name* passed in must also
++ be ``NULL``. Python uses the C function :c:func:`strcmp` to compare capsule
+ names.
+
+
+ .. c:function:: PyCapsule_Destructor PyCapsule_GetDestructor(PyObject *capsule)
+
+ Return the current destructor stored in the capsule. On failure, set an
+- exception and return *NULL*.
++ exception and return ``NULL``.
+
+- It is legal for a capsule to have a *NULL* destructor. This makes a *NULL*
++ It is legal for a capsule to have a ``NULL`` destructor. This makes a ``NULL``
+ return code somewhat ambiguous; use :c:func:`PyCapsule_IsValid` or
+ :c:func:`PyErr_Occurred` to disambiguate.
+
+@@ -80,9 +80,9 @@ Refer to :ref:`using-capsules` for more information on using these objects.
+ .. c:function:: void* PyCapsule_GetContext(PyObject *capsule)
+
+ Return the current context stored in the capsule. On failure, set an
+- exception and return *NULL*.
++ exception and return ``NULL``.
+
+- It is legal for a capsule to have a *NULL* context. This makes a *NULL*
++ It is legal for a capsule to have a ``NULL`` context. This makes a ``NULL``
+ return code somewhat ambiguous; use :c:func:`PyCapsule_IsValid` or
+ :c:func:`PyErr_Occurred` to disambiguate.
+
+@@ -90,9 +90,9 @@ Refer to :ref:`using-capsules` for more information on using these objects.
+ .. c:function:: const char* PyCapsule_GetName(PyObject *capsule)
+
+ Return the current name stored in the capsule. On failure, set an exception
+- and return *NULL*.
++ and return ``NULL``.
+
+- It is legal for a capsule to have a *NULL* name. This makes a *NULL* return
++ It is legal for a capsule to have a ``NULL`` name. This makes a ``NULL`` return
+ code somewhat ambiguous; use :c:func:`PyCapsule_IsValid` or
+ :c:func:`PyErr_Occurred` to disambiguate.
+
+@@ -107,13 +107,13 @@ Refer to :ref:`using-capsules` for more information on using these objects.
+ import the module conventionally (using :c:func:`PyImport_ImportModule`).
+
+ Return the capsule's internal *pointer* on success. On failure, set an
+- exception and return *NULL*.
++ exception and return ``NULL``.
+
+
+ .. c:function:: int PyCapsule_IsValid(PyObject *capsule, const char *name)
+
+ Determines whether or not *capsule* is a valid capsule. A valid capsule is
+- non-*NULL*, passes :c:func:`PyCapsule_CheckExact`, has a non-*NULL* pointer
++ non-``NULL``, passes :c:func:`PyCapsule_CheckExact`, has a non-``NULL`` pointer
+ stored in it, and its internal name matches the *name* parameter. (See
+ :c:func:`PyCapsule_GetPointer` for information on how capsule names are
+ compared.)
+@@ -142,9 +142,9 @@ Refer to :ref:`using-capsules` for more information on using these objects.
+
+ .. c:function:: int PyCapsule_SetName(PyObject *capsule, const char *name)
+
+- Set the name inside *capsule* to *name*. If non-*NULL*, the name must
++ Set the name inside *capsule* to *name*. If non-``NULL``, the name must
+ outlive the capsule. If the previous *name* stored in the capsule was not
+- *NULL*, no attempt is made to free it.
++ ``NULL``, no attempt is made to free it.
+
+ Return ``0`` on success. Return nonzero and set an exception on failure.
+
+@@ -152,6 +152,6 @@ Refer to :ref:`using-capsules` for more information on using these objects.
+ .. c:function:: int PyCapsule_SetPointer(PyObject *capsule, void *pointer)
+
+ Set the void pointer inside *capsule* to *pointer*. The pointer may not be
+- *NULL*.
++ ``NULL``.
+
+ Return ``0`` on success. Return nonzero and set an exception on failure.
+diff --git a/Doc/c-api/cell.rst b/Doc/c-api/cell.rst
+index 8514afe928..8408f7e398 100644
+--- a/Doc/c-api/cell.rst
++++ b/Doc/c-api/cell.rst
+@@ -27,13 +27,13 @@ Cell objects are not likely to be useful elsewhere.
+
+ .. c:function:: int PyCell_Check(ob)
+
+- Return true if *ob* is a cell object; *ob* must not be *NULL*.
++ Return true if *ob* is a cell object; *ob* must not be ``NULL``.
+
+
+ .. c:function:: PyObject* PyCell_New(PyObject *ob)
+
+ Create and return a new cell object containing the value *ob*. The parameter may
+- be *NULL*.
++ be ``NULL``.
+
+
+ .. c:function:: PyObject* PyCell_Get(PyObject *cell)
+@@ -44,19 +44,19 @@ Cell objects are not likely to be useful elsewhere.
+ .. c:function:: PyObject* PyCell_GET(PyObject *cell)
+
+ Return the contents of the cell *cell*, but without checking that *cell* is
+- non-*NULL* and a cell object.
++ non-``NULL`` and a cell object.
+
+
+ .. c:function:: int PyCell_Set(PyObject *cell, PyObject *value)
+
+ Set the contents of the cell object *cell* to *value*. This releases the
+- reference to any current content of the cell. *value* may be *NULL*. *cell*
+- must be non-*NULL*; if it is not a cell object, ``-1`` will be returned. On
++ reference to any current content of the cell. *value* may be ``NULL``. *cell*
++ must be non-``NULL``; if it is not a cell object, ``-1`` will be returned. On
+ success, ``0`` will be returned.
+
+
+ .. c:function:: void PyCell_SET(PyObject *cell, PyObject *value)
+
+ Sets the value of the cell object *cell* to *value*. No reference counts are
+- adjusted, and no checks are made for safety; *cell* must be non-*NULL* and must
++ adjusted, and no checks are made for safety; *cell* must be non-``NULL`` and must
+ be a cell object.
+diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst
+index 3c4f66923d..45a6b4a753 100644
+--- a/Doc/c-api/code.rst
++++ b/Doc/c-api/code.rst
+@@ -40,8 +40,6 @@ bound into a function.
+ can bind you to a precise Python version since the definition of the bytecode
+ changes often.
+
+- .. audit-event:: code.__new__ code,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags c.PyCode_New
+-
+ .. c:function:: PyCodeObject* PyCode_NewWithPosOnlyArgs(int argcount, int posonlyargcount, int kwonlyargcount, int nlocals, int stacksize, int flags, PyObject *code, PyObject *consts, PyObject *names, PyObject *varnames, PyObject *freevars, PyObject *cellvars, PyObject *filename, PyObject *name, int firstlineno, PyObject *lnotab)
+
+ Similar to :c:func:`PyCode_New`, but with an extra "posonlyargcount" for positonal-only arguments.
+diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst
+index c55f19970e..172dcb326a 100644
+--- a/Doc/c-api/codec.rst
++++ b/Doc/c-api/codec.rst
+@@ -21,7 +21,7 @@ Codec registry and support functions
+
+ *object* is passed through the encoder function found for the given
+ *encoding* using the error handling method defined by *errors*. *errors* may
+- be *NULL* to use the default method defined for the codec. Raises a
++ be ``NULL`` to use the default method defined for the codec. Raises a
+ :exc:`LookupError` if no encoder can be found.
+
+ .. c:function:: PyObject* PyCodec_Decode(PyObject *object, const char *encoding, const char *errors)
+@@ -30,7 +30,7 @@ Codec registry and support functions
+
+ *object* is passed through the decoder function found for the given
+ *encoding* using the error handling method defined by *errors*. *errors* may
+- be *NULL* to use the default method defined for the codec. Raises a
++ be ``NULL`` to use the default method defined for the codec. Raises a
+ :exc:`LookupError` if no encoder can be found.
+
+
+@@ -40,7 +40,7 @@ Codec lookup API
+ In the following functions, the *encoding* string is looked up converted to all
+ lower-case characters, which makes encodings looked up through this mechanism
+ effectively case-insensitive. If no codec is found, a :exc:`KeyError` is set
+-and *NULL* returned.
++and ``NULL`` returned.
+
+ .. c:function:: PyObject* PyCodec_Encoder(const char *encoding)
+
+@@ -92,7 +92,7 @@ Registry API for Unicode encoding error handlers
+ .. c:function:: PyObject* PyCodec_LookupError(const char *name)
+
+ Lookup the error handling callback function registered under *name*. As a
+- special case *NULL* can be passed, in which case the error handling callback
++ special case ``NULL`` can be passed, in which case the error handling callback
+ for "strict" will be returned.
+
+ .. c:function:: PyObject* PyCodec_StrictErrors(PyObject *exc)
+diff --git a/Doc/c-api/concrete.rst b/Doc/c-api/concrete.rst
+index f83d711795..c1d9fa1b41 100644
+--- a/Doc/c-api/concrete.rst
++++ b/Doc/c-api/concrete.rst
+@@ -17,8 +17,8 @@ dictionary, use :c:func:`PyDict_Check`. The chapter is structured like the
+ .. warning::
+
+ While the functions described in this chapter carefully check the type of the
+- objects which are passed in, many of them do not check for *NULL* being passed
+- instead of a valid object. Allowing *NULL* to be passed in can cause memory
++ objects which are passed in, many of them do not check for ``NULL`` being passed
++ instead of a valid object. Allowing ``NULL`` to be passed in can cause memory
+ access violations and immediate termination of the interpreter.
+
+
+diff --git a/Doc/c-api/contextvars.rst b/Doc/c-api/contextvars.rst
+index a7cde7fb19..38256a3b0f 100644
+--- a/Doc/c-api/contextvars.rst
++++ b/Doc/c-api/contextvars.rst
+@@ -60,17 +60,17 @@ Type-check macros:
+ .. c:function:: int PyContext_CheckExact(PyObject *o)
+
+ Return true if *o* is of type :c:data:`PyContext_Type`. *o* must not be
+- *NULL*. This function always succeeds.
++ ``NULL``. This function always succeeds.
+
+ .. c:function:: int PyContextVar_CheckExact(PyObject *o)
+
+ Return true if *o* is of type :c:data:`PyContextVar_Type`. *o* must not be
+- *NULL*. This function always succeeds.
++ ``NULL``. This function always succeeds.
+
+ .. c:function:: int PyContextToken_CheckExact(PyObject *o)
+
+ Return true if *o* is of type :c:data:`PyContextToken_Type`.
+- *o* must not be *NULL*. This function always succeeds.
++ *o* must not be ``NULL``. This function always succeeds.
+
+
+ Context object management functions:
+diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst
+index ed101c791e..b310fcb5e4 100644
+--- a/Doc/c-api/conversion.rst
++++ b/Doc/c-api/conversion.rst
+@@ -32,7 +32,7 @@ NULL``.
+
+ If the platform doesn't have :c:func:`vsnprintf` and the buffer size needed to
+ avoid truncation exceeds *size* by more than 512 bytes, Python aborts with a
+-*Py_FatalError*.
++:c:func:`Py_FatalError`.
+
+ The return value (*rv*) for these functions should be interpreted as follows:
+
+@@ -95,25 +95,25 @@ The following functions provide locale-independent string to number conversions.
+ must be 0 and is ignored. The ``'r'`` format code specifies the
+ standard :func:`repr` format.
+
+- *flags* can be zero or more of the values *Py_DTSF_SIGN*,
+- *Py_DTSF_ADD_DOT_0*, or *Py_DTSF_ALT*, or-ed together:
++ *flags* can be zero or more of the values ``Py_DTSF_SIGN``,
++ ``Py_DTSF_ADD_DOT_0``, or ``Py_DTSF_ALT``, or-ed together:
+
+- * *Py_DTSF_SIGN* means to always precede the returned string with a sign
++ * ``Py_DTSF_SIGN`` means to always precede the returned string with a sign
+ character, even if *val* is non-negative.
+
+- * *Py_DTSF_ADD_DOT_0* means to ensure that the returned string will not look
++ * ``Py_DTSF_ADD_DOT_0`` means to ensure that the returned string will not look
+ like an integer.
+
+- * *Py_DTSF_ALT* means to apply "alternate" formatting rules. See the
++ * ``Py_DTSF_ALT`` means to apply "alternate" formatting rules. See the
+ documentation for the :c:func:`PyOS_snprintf` ``'#'`` specifier for
+ details.
+
+- If *ptype* is non-NULL, then the value it points to will be set to one of
+- *Py_DTST_FINITE*, *Py_DTST_INFINITE*, or *Py_DTST_NAN*, signifying that
++ If *ptype* is non-``NULL``, then the value it points to will be set to one of
++ ``Py_DTST_FINITE``, ``Py_DTST_INFINITE``, or ``Py_DTST_NAN``, signifying that
+ *val* is a finite number, an infinite number, or not a number, respectively.
+
+ The return value is a pointer to *buffer* with the converted string or
+- *NULL* if the conversion failed. The caller is responsible for freeing the
++ ``NULL`` if the conversion failed. The caller is responsible for freeing the
+ returned string by calling :c:func:`PyMem_Free`.
+
+ .. versionadded:: 3.1
+diff --git a/Doc/c-api/coro.rst b/Doc/c-api/coro.rst
+index 50428c7eb4..2260944a9a 100644
+--- a/Doc/c-api/coro.rst
++++ b/Doc/c-api/coro.rst
+@@ -23,7 +23,7 @@ return.
+
+ .. c:function:: int PyCoro_CheckExact(PyObject *ob)
+
+- Return true if *ob*'s type is *PyCoro_Type*; *ob* must not be *NULL*.
++ Return true if *ob*'s type is :c:type:`PyCoro_Type`; *ob* must not be ``NULL``.
+
+
+ .. c:function:: PyObject* PyCoro_New(PyFrameObject *frame, PyObject *name, PyObject *qualname)
+@@ -31,4 +31,4 @@ return.
+ Create and return a new coroutine object based on the *frame* object,
+ with ``__name__`` and ``__qualname__`` set to *name* and *qualname*.
+ A reference to *frame* is stolen by this function. The *frame* argument
+- must not be *NULL*.
++ must not be ``NULL``.
+diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst
+index 44a04373d1..bd4f1ff446 100644
+--- a/Doc/c-api/datetime.rst
++++ b/Doc/c-api/datetime.rst
+@@ -28,61 +28,61 @@ Type-check macros:
+ .. c:function:: int PyDate_Check(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_DateType` or a subtype of
+- :c:data:`PyDateTime_DateType`. *ob* must not be *NULL*.
++ :c:data:`PyDateTime_DateType`. *ob* must not be ``NULL``.
+
+
+ .. c:function:: int PyDate_CheckExact(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_DateType`. *ob* must not be
+- *NULL*.
++ ``NULL``.
+
+
+ .. c:function:: int PyDateTime_Check(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_DateTimeType` or a subtype of
+- :c:data:`PyDateTime_DateTimeType`. *ob* must not be *NULL*.
++ :c:data:`PyDateTime_DateTimeType`. *ob* must not be ``NULL``.
+
+
+ .. c:function:: int PyDateTime_CheckExact(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_DateTimeType`. *ob* must not
+- be *NULL*.
++ be ``NULL``.
+
+
+ .. c:function:: int PyTime_Check(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_TimeType` or a subtype of
+- :c:data:`PyDateTime_TimeType`. *ob* must not be *NULL*.
++ :c:data:`PyDateTime_TimeType`. *ob* must not be ``NULL``.
+
+
+ .. c:function:: int PyTime_CheckExact(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_TimeType`. *ob* must not be
+- *NULL*.
++ ``NULL``.
+
+
+ .. c:function:: int PyDelta_Check(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_DeltaType` or a subtype of
+- :c:data:`PyDateTime_DeltaType`. *ob* must not be *NULL*.
++ :c:data:`PyDateTime_DeltaType`. *ob* must not be ``NULL``.
+
+
+ .. c:function:: int PyDelta_CheckExact(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_DeltaType`. *ob* must not be
+- *NULL*.
++ ``NULL``.
+
+
+ .. c:function:: int PyTZInfo_Check(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_TZInfoType` or a subtype of
+- :c:data:`PyDateTime_TZInfoType`. *ob* must not be *NULL*.
++ :c:data:`PyDateTime_TZInfoType`. *ob* must not be ``NULL``.
+
+
+ .. c:function:: int PyTZInfo_CheckExact(PyObject *ob)
+
+ Return true if *ob* is of type :c:data:`PyDateTime_TZInfoType`. *ob* must not be
+- *NULL*.
++ ``NULL``.
+
+
+ Macros to create objects:
+@@ -144,7 +144,7 @@ Macros to create objects:
+
+ Macros to extract fields from date objects. The argument must be an instance of
+ :c:data:`PyDateTime_Date`, including subclasses (such as
+-:c:data:`PyDateTime_DateTime`). The argument must not be *NULL*, and the type is
++:c:data:`PyDateTime_DateTime`). The argument must not be ``NULL``, and the type is
+ not checked:
+
+ .. c:function:: int PyDateTime_GET_YEAR(PyDateTime_Date *o)
+@@ -164,7 +164,7 @@ not checked:
+
+ Macros to extract fields from datetime objects. The argument must be an
+ instance of :c:data:`PyDateTime_DateTime`, including subclasses. The argument
+-must not be *NULL*, and the type is not checked:
++must not be ``NULL``, and the type is not checked:
+
+ .. c:function:: int PyDateTime_DATE_GET_HOUR(PyDateTime_DateTime *o)
+
+@@ -187,7 +187,7 @@ must not be *NULL*, and the type is not checked:
+
+
+ Macros to extract fields from time objects. The argument must be an instance of
+-:c:data:`PyDateTime_Time`, including subclasses. The argument must not be *NULL*,
++:c:data:`PyDateTime_Time`, including subclasses. The argument must not be ``NULL``,
+ and the type is not checked:
+
+ .. c:function:: int PyDateTime_TIME_GET_HOUR(PyDateTime_Time *o)
+@@ -212,7 +212,7 @@ and the type is not checked:
+
+ Macros to extract fields from time delta objects. The argument must be an
+ instance of :c:data:`PyDateTime_Delta`, including subclasses. The argument must
+-not be *NULL*, and the type is not checked:
++not be ``NULL``, and the type is not checked:
+
+ .. c:function:: int PyDateTime_DELTA_GET_DAYS(PyDateTime_Delta *o)
+
+diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst
+index e970771893..e7922dc0c7 100644
+--- a/Doc/c-api/dict.rst
++++ b/Doc/c-api/dict.rst
+@@ -33,7 +33,7 @@ Dictionary Objects
+
+ .. c:function:: PyObject* PyDict_New()
+
+- Return a new empty dictionary, or *NULL* on failure.
++ Return a new empty dictionary, or ``NULL`` on failure.
+
+
+ .. c:function:: PyObject* PyDictProxy_New(PyObject *mapping)
+@@ -92,7 +92,7 @@ Dictionary Objects
+
+ .. c:function:: PyObject* PyDict_GetItem(PyObject *p, PyObject *key)
+
+- Return the object from dictionary *p* which has a key *key*. Return *NULL*
++ Return the object from dictionary *p* which has a key *key*. Return ``NULL``
+ if the key *key* is not present, but *without* setting an exception.
+
+ Note that exceptions which occur while calling :meth:`__hash__` and
+@@ -103,8 +103,8 @@ Dictionary Objects
+ .. c:function:: PyObject* PyDict_GetItemWithError(PyObject *p, PyObject *key)
+
+ Variant of :c:func:`PyDict_GetItem` that does not suppress
+- exceptions. Return *NULL* **with** an exception set if an exception
+- occurred. Return *NULL* **without** an exception set if the key
++ exceptions. Return ``NULL`` **with** an exception set if an exception
++ occurred. Return ``NULL`` **without** an exception set if the key
+ wasn't present.
+
+
+@@ -161,7 +161,7 @@ Dictionary Objects
+ function returns true for each pair in the dictionary, and false once all
+ pairs have been reported. The parameters *pkey* and *pvalue* should either
+ point to :c:type:`PyObject\*` variables that will be filled in with each key
+- and value, respectively, or may be *NULL*. Any references returned through
++ and value, respectively, or may be ``NULL``. Any references returned through
+ them are borrowed. *ppos* should not be altered during iteration. Its
+ value represents offsets within the internal dictionary structure, and
+ since the structure is sparse, the offsets are not consecutive.
+diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst
+index 25bb657dca..c7ba74cc8d 100644
+--- a/Doc/c-api/exceptions.rst
++++ b/Doc/c-api/exceptions.rst
+@@ -13,15 +13,15 @@ exception handling. It works somewhat like the POSIX :c:data:`errno` variable:
+ there is a global indicator (per thread) of the last error that occurred. Most
+ C API functions don't clear this on success, but will set it to indicate the
+ cause of the error on failure. Most C API functions also return an error
+-indicator, usually *NULL* if they are supposed to return a pointer, or ``-1``
++indicator, usually ``NULL`` if they are supposed to return a pointer, or ``-1``
+ if they return an integer (exception: the :c:func:`PyArg_\*` functions
+ return ``1`` for success and ``0`` for failure).
+
+ Concretely, the error indicator consists of three object pointers: the
+ exception's type, the exception's value, and the traceback object. Any
+-of those pointers can be NULL if non-set (although some combinations are
+-forbidden, for example you can't have a non-NULL traceback if the exception
+-type is NULL).
++of those pointers can be ``NULL`` if non-set (although some combinations are
++forbidden, for example you can't have a non-``NULL`` traceback if the exception
++type is ``NULL``).
+
+ When a function must fail because some function it called failed, it generally
+ doesn't set the error indicator; the function it called already set it. It is
+@@ -92,7 +92,7 @@ Raising exceptions
+
+ These functions help you set the current thread's error indicator.
+ For convenience, some of these functions will always return a
+-NULL pointer for use in a ``return`` statement.
++``NULL`` pointer for use in a ``return`` statement.
+
+
+ .. c:function:: void PyErr_SetString(PyObject *type, const char *message)
+@@ -111,7 +111,7 @@ NULL pointer for use in a ``return`` statement.
+
+ .. c:function:: PyObject* PyErr_Format(PyObject *exception, const char *format, ...)
+
+- This function sets the error indicator and returns *NULL*. *exception*
++ This function sets the error indicator and returns ``NULL``. *exception*
+ should be a Python exception class. The *format* and subsequent
+ parameters help format the error message; they have the same meaning and
+ values as in :c:func:`PyUnicode_FromFormat`. *format* is an ASCII-encoded
+@@ -140,7 +140,7 @@ NULL pointer for use in a ``return`` statement.
+
+ .. c:function:: PyObject* PyErr_NoMemory()
+
+- This is a shorthand for ``PyErr_SetNone(PyExc_MemoryError)``; it returns *NULL*
++ This is a shorthand for ``PyErr_SetNone(PyExc_MemoryError)``; it returns ``NULL``
+ so an object allocation function can write ``return PyErr_NoMemory();`` when it
+ runs out of memory.
+
+@@ -156,7 +156,7 @@ NULL pointer for use in a ``return`` statement.
+ and then calls ``PyErr_SetObject(type, object)``. On Unix, when the
+ :c:data:`errno` value is :const:`EINTR`, indicating an interrupted system call,
+ this calls :c:func:`PyErr_CheckSignals`, and if that set the error indicator,
+- leaves it set to that. The function always returns *NULL*, so a wrapper
++ leaves it set to that. The function always returns ``NULL``, so a wrapper
+ function around a system call can write ``return PyErr_SetFromErrno(type);``
+ when the system call returns an error.
+
+@@ -164,7 +164,7 @@ NULL pointer for use in a ``return`` statement.
+ .. c:function:: PyObject* PyErr_SetFromErrnoWithFilenameObject(PyObject *type, PyObject *filenameObject)
+
+ Similar to :c:func:`PyErr_SetFromErrno`, with the additional behavior that if
+- *filenameObject* is not *NULL*, it is passed to the constructor of *type* as
++ *filenameObject* is not ``NULL``, it is passed to the constructor of *type* as
+ a third parameter. In the case of :exc:`OSError` exception,
+ this is used to define the :attr:`filename` attribute of the
+ exception instance.
+@@ -195,7 +195,7 @@ NULL pointer for use in a ``return`` statement.
+ then it constructs a tuple object whose first item is the *ierr* value and whose
+ second item is the corresponding error message (gotten from
+ :c:func:`FormatMessage`), and then calls ``PyErr_SetObject(PyExc_WindowsError,
+- object)``. This function always returns *NULL*.
++ object)``. This function always returns ``NULL``.
+
+ .. availability:: Windows.
+
+@@ -304,7 +304,7 @@ an error value).
+ .. c:function:: int PyErr_WarnEx(PyObject *category, const char *message, Py_ssize_t stack_level)
+
+ Issue a warning message. The *category* argument is a warning category (see
+- below) or *NULL*; the *message* argument is a UTF-8 encoded string. *stack_level* is a
++ below) or ``NULL``; the *message* argument is a UTF-8 encoded string. *stack_level* is a
+ positive number giving a number of stack frames; the warning will be issued from
+ the currently executing line of code in that stack frame. A *stack_level* of 1
+ is the function calling :c:func:`PyErr_WarnEx`, 2 is the function above that,
+@@ -333,7 +333,7 @@ an error value).
+ Issue a warning message with explicit control over all warning attributes. This
+ is a straightforward wrapper around the Python function
+ :func:`warnings.warn_explicit`, see there for more information. The *module*
+- and *registry* arguments may be set to *NULL* to get the default effect
++ and *registry* arguments may be set to ``NULL`` to get the default effect
+ described there.
+
+ .. versionadded:: 3.4
+@@ -370,7 +370,7 @@ Querying the error indicator
+
+ Test whether the error indicator is set. If set, return the exception *type*
+ (the first argument to the last call to one of the :c:func:`PyErr_Set\*`
+- functions or to :c:func:`PyErr_Restore`). If not set, return *NULL*. You do not
++ functions or to :c:func:`PyErr_Restore`). If not set, return ``NULL``. You do not
+ own a reference to the return value, so you do not need to :c:func:`Py_DECREF`
+ it.
+
+@@ -400,9 +400,9 @@ Querying the error indicator
+ .. c:function:: void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
+
+ Retrieve the error indicator into three variables whose addresses are passed.
+- If the error indicator is not set, set all three variables to *NULL*. If it is
++ If the error indicator is not set, set all three variables to ``NULL``. If it is
+ set, it will be cleared and you own a reference to each object retrieved. The
+- value and traceback object may be *NULL* even when the type object is not.
++ value and traceback object may be ``NULL`` even when the type object is not.
+
+ .. note::
+
+@@ -422,8 +422,8 @@ Querying the error indicator
+ .. c:function:: void PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
+
+ Set the error indicator from the three objects. If the error indicator is
+- already set, it is cleared first. If the objects are *NULL*, the error
+- indicator is cleared. Do not pass a *NULL* type and non-*NULL* value or
++ already set, it is cleared first. If the objects are ``NULL``, the error
++ indicator is cleared. Do not pass a ``NULL`` type and non-``NULL`` value or
+ traceback. The exception type should be a class. Do not pass an invalid
+ exception type or value. (Violating these rules will cause subtle problems
+ later.) This call takes away a reference to each object: you must own a
+@@ -462,7 +462,7 @@ Querying the error indicator
+ Retrieve the exception info, as known from ``sys.exc_info()``. This refers
+ to an exception that was *already caught*, not to an exception that was
+ freshly raised. Returns new references for the three objects, any of which
+- may be *NULL*. Does not modify the exception info state.
++ may be ``NULL``. Does not modify the exception info state.
+
+ .. note::
+
+@@ -479,7 +479,7 @@ Querying the error indicator
+ Set the exception info, as known from ``sys.exc_info()``. This refers
+ to an exception that was *already caught*, not to an exception that was
+ freshly raised. This function steals the references of the arguments.
+- To clear the exception state, pass *NULL* for all three arguments.
++ To clear the exception state, pass ``NULL`` for all three arguments.
+ For general rules about the three arguments, see :c:func:`PyErr_Restore`.
+
+ .. note::
+@@ -549,7 +549,7 @@ Exception Classes
+
+ This utility function creates and returns a new exception class. The *name*
+ argument must be the name of the new exception, a C string of the form
+- ``module.classname``. The *base* and *dict* arguments are normally *NULL*.
++ ``module.classname``. The *base* and *dict* arguments are normally ``NULL``.
+ This creates a class object derived from :exc:`Exception` (accessible in C as
+ :c:data:`PyExc_Exception`).
+
+@@ -563,7 +563,7 @@ Exception Classes
+ .. c:function:: PyObject* PyErr_NewExceptionWithDoc(const char *name, const char *doc, PyObject *base, PyObject *dict)
+
+ Same as :c:func:`PyErr_NewException`, except that the new exception class can
+- easily be given a docstring: If *doc* is non-*NULL*, it will be used as the
++ easily be given a docstring: If *doc* is non-``NULL``, it will be used as the
+ docstring for the exception class.
+
+ .. versionadded:: 3.2
+@@ -576,7 +576,7 @@ Exception Objects
+
+ Return the traceback associated with the exception as a new reference, as
+ accessible from Python through :attr:`__traceback__`. If there is no
+- traceback associated, this returns *NULL*.
++ traceback associated, this returns ``NULL``.
+
+
+ .. c:function:: int PyException_SetTraceback(PyObject *ex, PyObject *tb)
+@@ -590,12 +590,12 @@ Exception Objects
+ Return the context (another exception instance during whose handling *ex* was
+ raised) associated with the exception as a new reference, as accessible from
+ Python through :attr:`__context__`. If there is no context associated, this
+- returns *NULL*.
++ returns ``NULL``.
+
+
+ .. c:function:: void PyException_SetContext(PyObject *ex, PyObject *ctx)
+
+- Set the context associated with the exception to *ctx*. Use *NULL* to clear
++ Set the context associated with the exception to *ctx*. Use ``NULL`` to clear
+ it. There is no type check to make sure that *ctx* is an exception instance.
+ This steals a reference to *ctx*.
+
+@@ -609,7 +609,7 @@ Exception Objects
+
+ .. c:function:: void PyException_SetCause(PyObject *ex, PyObject *cause)
+
+- Set the cause associated with the exception to *cause*. Use *NULL* to clear
++ Set the cause associated with the exception to *cause*. Use ``NULL`` to clear
+ it. There is no type check to make sure that *cause* is either an exception
+ instance or :const:`None`. This steals a reference to *cause*.
+
+@@ -656,7 +656,7 @@ The following functions are used to create and modify Unicode exceptions from C.
+ int PyUnicodeTranslateError_GetStart(PyObject *exc, Py_ssize_t *start)
+
+ Get the *start* attribute of the given exception object and place it into
+- *\*start*. *start* must not be *NULL*. Return ``0`` on success, ``-1`` on
++ *\*start*. *start* must not be ``NULL``. Return ``0`` on success, ``-1`` on
+ failure.
+
+ .. c:function:: int PyUnicodeDecodeError_SetStart(PyObject *exc, Py_ssize_t start)
+@@ -671,7 +671,7 @@ The following functions are used to create and modify Unicode exceptions from C.
+ int PyUnicodeTranslateError_GetEnd(PyObject *exc, Py_ssize_t *end)
+
+ Get the *end* attribute of the given exception object and place it into
+- *\*end*. *end* must not be *NULL*. Return ``0`` on success, ``-1`` on
++ *\*end*. *end* must not be ``NULL``. Return ``0`` on success, ``-1`` on
+ failure.
+
+ .. c:function:: int PyUnicodeDecodeError_SetEnd(PyObject *exc, Py_ssize_t end)
+diff --git a/Doc/c-api/file.rst b/Doc/c-api/file.rst
+index 543dc60b9f..5370c4e350 100644
+--- a/Doc/c-api/file.rst
++++ b/Doc/c-api/file.rst
+@@ -21,9 +21,9 @@ the :mod:`io` APIs instead.
+
+ Create a Python file object from the file descriptor of an already
+ opened file *fd*. The arguments *name*, *encoding*, *errors* and *newline*
+- can be *NULL* to use the defaults; *buffering* can be *-1* to use the
++ can be ``NULL`` to use the defaults; *buffering* can be *-1* to use the
+ default. *name* is ignored and kept for backward compatibility. Return
+- *NULL* on failure. For a more comprehensive description of the arguments,
++ ``NULL`` on failure. For a more comprehensive description of the arguments,
+ please refer to the :func:`io.open` function documentation.
+
+ .. warning::
+diff --git a/Doc/c-api/float.rst b/Doc/c-api/float.rst
+index 057ff52251..bfc28a79ec 100644
+--- a/Doc/c-api/float.rst
++++ b/Doc/c-api/float.rst
+@@ -34,12 +34,12 @@ Floating Point Objects
+ .. c:function:: PyObject* PyFloat_FromString(PyObject *str)
+
+ Create a :c:type:`PyFloatObject` object based on the string value in *str*, or
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+
+ .. c:function:: PyObject* PyFloat_FromDouble(double v)
+
+- Create a :c:type:`PyFloatObject` object from *v*, or *NULL* on failure.
++ Create a :c:type:`PyFloatObject` object from *v*, or ``NULL`` on failure.
+
+
+ .. c:function:: double PyFloat_AsDouble(PyObject *pyfloat)
+diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst
+index 02c4ebdbed..bb416f4bb6 100644
+--- a/Doc/c-api/function.rst
++++ b/Doc/c-api/function.rst
+@@ -26,7 +26,7 @@ There are a few functions specific to Python functions.
+ .. c:function:: int PyFunction_Check(PyObject *o)
+
+ Return true if *o* is a function object (has type :c:data:`PyFunction_Type`).
+- The parameter must not be *NULL*.
++ The parameter must not be ``NULL``.
+
+
+ .. c:function:: PyObject* PyFunction_New(PyObject *code, PyObject *globals)
+@@ -36,14 +36,14 @@ There are a few functions specific to Python functions.
+
+ The function's docstring and name are retrieved from the code object. *__module__*
+ is retrieved from *globals*. The argument defaults, annotations and closure are
+- set to *NULL*. *__qualname__* is set to the same value as the function's name.
++ set to ``NULL``. *__qualname__* is set to the same value as the function's name.
+
+
+ .. c:function:: PyObject* PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
+
+ As :c:func:`PyFunction_New`, but also allows setting the function object's
+- ``__qualname__`` attribute. *qualname* should be a unicode object or NULL;
+- if NULL, the ``__qualname__`` attribute is set to the same value as its
++ ``__qualname__`` attribute. *qualname* should be a unicode object or ``NULL``;
++ if ``NULL``, the ``__qualname__`` attribute is set to the same value as its
+ ``__name__`` attribute.
+
+ .. versionadded:: 3.3
+@@ -69,27 +69,27 @@ There are a few functions specific to Python functions.
+ .. c:function:: PyObject* PyFunction_GetDefaults(PyObject *op)
+
+ Return the argument default values of the function object *op*. This can be a
+- tuple of arguments or *NULL*.
++ tuple of arguments or ``NULL``.
+
+
+ .. c:function:: int PyFunction_SetDefaults(PyObject *op, PyObject *defaults)
+
+ Set the argument default values for the function object *op*. *defaults* must be
+- *Py_None* or a tuple.
++ ``Py_None`` or a tuple.
+
+ Raises :exc:`SystemError` and returns ``-1`` on failure.
+
+
+ .. c:function:: PyObject* PyFunction_GetClosure(PyObject *op)
+
+- Return the closure associated with the function object *op*. This can be *NULL*
++ Return the closure associated with the function object *op*. This can be ``NULL``
+ or a tuple of cell objects.
+
+
+ .. c:function:: int PyFunction_SetClosure(PyObject *op, PyObject *closure)
+
+ Set the closure associated with the function object *op*. *closure* must be
+- *Py_None* or a tuple of cell objects.
++ ``Py_None`` or a tuple of cell objects.
+
+ Raises :exc:`SystemError` and returns ``-1`` on failure.
+
+@@ -97,12 +97,12 @@ There are a few functions specific to Python functions.
+ .. c:function:: PyObject *PyFunction_GetAnnotations(PyObject *op)
+
+ Return the annotations of the function object *op*. This can be a
+- mutable dictionary or *NULL*.
++ mutable dictionary or ``NULL``.
+
+
+ .. c:function:: int PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)
+
+ Set the annotations for the function object *op*. *annotations*
+- must be a dictionary or *Py_None*.
++ must be a dictionary or ``Py_None``.
+
+ Raises :exc:`SystemError` and returns ``-1`` on failure.
+diff --git a/Doc/c-api/gcsupport.rst b/Doc/c-api/gcsupport.rst
+index b3f30b2ed9..924a7fd2fd 100644
+--- a/Doc/c-api/gcsupport.rst
++++ b/Doc/c-api/gcsupport.rst
+@@ -49,7 +49,7 @@ Constructors for container types must conform to two rules:
+ .. c:function:: TYPE* PyObject_GC_Resize(TYPE, PyVarObject *op, Py_ssize_t newsize)
+
+ Resize an object allocated by :c:func:`PyObject_NewVar`. Returns the
+- resized object or *NULL* on failure. *op* must not be tracked by the collector yet.
++ resized object or ``NULL`` on failure. *op* must not be tracked by the collector yet.
+
+
+ .. c:function:: void PyObject_GC_Track(PyObject *op)
+@@ -110,7 +110,7 @@ The :c:member:`~PyTypeObject.tp_traverse` handler must have the following type:
+ Traversal function for a container object. Implementations must call the
+ *visit* function for each object directly contained by *self*, with the
+ parameters to *visit* being the contained object and the *arg* value passed
+- to the handler. The *visit* function must not be called with a *NULL*
++ to the handler. The *visit* function must not be called with a ``NULL``
+ object argument. If *visit* returns a non-zero value that value should be
+ returned immediately.
+
+@@ -121,7 +121,7 @@ must name its arguments exactly *visit* and *arg*:
+
+ .. c:function:: void Py_VISIT(PyObject *o)
+
+- If *o* is not *NULL*, call the *visit* callback, with arguments *o*
++ If *o* is not ``NULL``, call the *visit* callback, with arguments *o*
+ and *arg*. If *visit* returns a non-zero value, then return it.
+ Using this macro, :c:member:`~PyTypeObject.tp_traverse` handlers
+ look like::
+@@ -134,7 +134,7 @@ must name its arguments exactly *visit* and *arg*:
+ return 0;
+ }
+
+-The :c:member:`~PyTypeObject.tp_clear` handler must be of the :c:type:`inquiry` type, or *NULL*
++The :c:member:`~PyTypeObject.tp_clear` handler must be of the :c:type:`inquiry` type, or ``NULL``
+ if the object is immutable.
+
+
+diff --git a/Doc/c-api/gen.rst b/Doc/c-api/gen.rst
+index 8d54021c18..74410927bf 100644
+--- a/Doc/c-api/gen.rst
++++ b/Doc/c-api/gen.rst
+@@ -22,23 +22,23 @@ than explicitly calling :c:func:`PyGen_New` or :c:func:`PyGen_NewWithQualName`.
+
+ .. c:function:: int PyGen_Check(PyObject *ob)
+
+- Return true if *ob* is a generator object; *ob* must not be *NULL*.
++ Return true if *ob* is a generator object; *ob* must not be ``NULL``.
+
+
+ .. c:function:: int PyGen_CheckExact(PyObject *ob)
+
+- Return true if *ob*'s type is *PyGen_Type*; *ob* must not be *NULL*.
++ Return true if *ob*'s type is :c:type:`PyGen_Type`; *ob* must not be ``NULL``.
+
+
+ .. c:function:: PyObject* PyGen_New(PyFrameObject *frame)
+
+ Create and return a new generator object based on the *frame* object.
+ A reference to *frame* is stolen by this function. The argument must not be
+- *NULL*.
++ ``NULL``.
+
+ .. c:function:: PyObject* PyGen_NewWithQualName(PyFrameObject *frame, PyObject *name, PyObject *qualname)
+
+ Create and return a new generator object based on the *frame* object,
+ with ``__name__`` and ``__qualname__`` set to *name* and *qualname*.
+ A reference to *frame* is stolen by this function. The *frame* argument
+- must not be *NULL*.
++ must not be ``NULL``.
+diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst
+index 86cc403161..78f935a291 100644
+--- a/Doc/c-api/import.rst
++++ b/Doc/c-api/import.rst
+@@ -14,7 +14,7 @@ Importing Modules
+ single: modules (in module sys)
+
+ This is a simplified interface to :c:func:`PyImport_ImportModuleEx` below,
+- leaving the *globals* and *locals* arguments set to *NULL* and *level* set
++ leaving the *globals* and *locals* arguments set to ``NULL`` and *level* set
+ to 0. When the *name*
+ argument contains a dot (when it specifies a submodule of a package), the
+ *fromlist* argument is set to the list ``['*']`` so that the return value is the
+@@ -22,7 +22,7 @@ Importing Modules
+ be the case. (Unfortunately, this has an additional side effect when *name* in
+ fact specifies a subpackage instead of a submodule: the submodules specified in
+ the package's ``__all__`` variable are loaded.) Return a new reference to the
+- imported module, or *NULL* with an exception set on failure. A failing
++ imported module, or ``NULL`` with an exception set on failure. A failing
+ import of a module doesn't leave the module in :data:`sys.modules`.
+
+ This function always uses absolute imports.
+@@ -47,7 +47,7 @@ Importing Modules
+ function :func:`__import__`.
+
+ The return value is a new reference to the imported module or top-level
+- package, or *NULL* with an exception set on failure. Like for
++ package, or ``NULL`` with an exception set on failure. Like for
+ :func:`__import__`, the return value when a submodule of a package was
+ requested is normally the top-level package, unless a non-empty *fromlist*
+ was given.
+@@ -63,7 +63,7 @@ Importing Modules
+ this function directly.
+
+ The return value is a new reference to the imported module or top-level package,
+- or *NULL* with an exception set on failure. Like for :func:`__import__`,
++ or ``NULL`` with an exception set on failure. Like for :func:`__import__`,
+ the return value when a submodule of a package was requested is normally the
+ top-level package, unless a non-empty *fromlist* was given.
+
+@@ -91,7 +91,7 @@ Importing Modules
+
+ .. c:function:: PyObject* PyImport_ReloadModule(PyObject *m)
+
+- Reload a module. Return a new reference to the reloaded module, or *NULL* with
++ Reload a module. Return a new reference to the reloaded module, or ``NULL`` with
+ an exception set on failure (the module still exists in this case).
+
+
+@@ -100,7 +100,7 @@ Importing Modules
+ Return the module object corresponding to a module name. The *name* argument
+ may be of the form ``package.module``. First check the modules dictionary if
+ there's one there, and if not, create a new one and insert it in the modules
+- dictionary. Return *NULL* with an exception set on failure.
++ dictionary. Return ``NULL`` with an exception set on failure.
+
+ .. note::
+
+@@ -125,7 +125,7 @@ Importing Modules
+ Given a module name (possibly of the form ``package.module``) and a code object
+ read from a Python bytecode file or obtained from the built-in function
+ :func:`compile`, load the module. Return a new reference to the module object,
+- or *NULL* with an exception set if an error occurred. *name*
++ or ``NULL`` with an exception set if an error occurred. *name*
+ is removed from :attr:`sys.modules` in error cases, even if *name* was already
+ in :attr:`sys.modules` on entry to :c:func:`PyImport_ExecCodeModule`. Leaving
+ incompletely initialized modules in :attr:`sys.modules` is dangerous, as imports of
+@@ -207,8 +207,8 @@ Importing Modules
+ .. c:function:: PyObject* PyImport_GetModule(PyObject *name)
+
+ Return the already imported module with the given name. If the
+- module has not been imported yet then returns NULL but does not set
+- an error. Returns NULL and sets an error if the lookup failed.
++ module has not been imported yet then returns ``NULL`` but does not set
++ an error. Returns ``NULL`` and sets an error if the lookup failed.
+
+ .. versionadded:: 3.7
+
+@@ -277,7 +277,7 @@ Importing Modules
+ .. c:var:: const struct _frozen* PyImport_FrozenModules
+
+ This pointer is initialized to point to an array of :c:type:`struct _frozen`
+- records, terminated by one whose members are all *NULL* or zero. When a frozen
++ records, terminated by one whose members are all ``NULL`` or zero. When a frozen
+ module is imported, it is searched in this table. Third-party code could play
+ tricks with this to provide a dynamically created collection of frozen modules.
+
+@@ -310,7 +310,7 @@ Importing Modules
+ .. c:function:: int PyImport_ExtendInittab(struct _inittab *newtab)
+
+ Add a collection of modules to the table of built-in modules. The *newtab*
+- array must end with a sentinel entry which contains *NULL* for the :attr:`name`
++ array must end with a sentinel entry which contains ``NULL`` for the :attr:`name`
+ field; failure to provide the sentinel value can result in a memory fault.
+ Returns ``0`` on success or ``-1`` if insufficient memory could be allocated to
+ extend the internal table. In the event of failure, no modules are added to the
+diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst
+index 0b7a84d031..155edba82f 100644
+--- a/Doc/c-api/init.rst
++++ b/Doc/c-api/init.rst
+@@ -329,7 +329,7 @@ Process-wide parameters
+ It overrides :envvar:`PYTHONIOENCODING` values, and allows embedding code
+ to control IO encoding when the environment variable does not work.
+
+- ``encoding`` and/or ``errors`` may be NULL to use
++ *encoding* and/or *errors* may be ``NULL`` to use
+ :envvar:`PYTHONIOENCODING` and/or default values (depending on other
+ settings).
+
+@@ -769,9 +769,19 @@ supports the creation of additional interpreters (using
+ :c:func:`Py_NewInterpreter`), but mixing multiple interpreters and the
+ :c:func:`PyGILState_\*` API is unsupported.
+
++
++.. _fork-and-threads:
++
++Cautions about fork()
++---------------------
++
+ Another important thing to note about threads is their behaviour in the face
+ of the C :c:func:`fork` call. On most systems with :c:func:`fork`, after a
+-process forks only the thread that issued the fork will exist. That also
++process forks only the thread that issued the fork will exist. This has a
++concrete impact both on how locks must be handled and on all stored state
++in CPython's runtime.
++
++The fact that only the "current" thread remains
+ means any locks held by other threads will never be released. Python solves
+ this for :func:`os.fork` by acquiring the locks it uses internally before
+ the fork, and releasing them afterwards. In addition, it resets any
+@@ -786,6 +796,17 @@ being held by a thread that is defunct after the fork.
+ :c:func:`PyOS_AfterFork_Child` tries to reset the necessary locks, but is not
+ always able to.
+
++The fact that all other threads go away also means that CPython's
++runtime state there must be cleaned up properly, which :func:`os.fork`
++does. This means finalizing all other :c:type:`PyThreadState` objects
++belonging to the current interpreter and all other
++:c:type:`PyInterpreterState` objects. Due to this and the special
++nature of the :ref:`"main" interpreter <sub-interpreter-support>`,
++:c:func:`fork` should only be called in that interpreter's "main"
++thread, where the CPython global runtime was originally initialized.
++The only exception is if :c:func:`exec` will be called immediately
++after.
++
+
+ High-level API
+ --------------
+@@ -851,15 +872,15 @@ code, or when embedding the Python interpreter:
+ .. c:function:: PyThreadState* PyEval_SaveThread()
+
+ Release the global interpreter lock (if it has been created) and reset the
+- thread state to *NULL*, returning the previous thread state (which is not
+- *NULL*). If the lock has been created, the current thread must have
++ thread state to ``NULL``, returning the previous thread state (which is not
++ ``NULL``). If the lock has been created, the current thread must have
+ acquired it.
+
+
+ .. c:function:: void PyEval_RestoreThread(PyThreadState *tstate)
+
+ Acquire the global interpreter lock (if it has been created) and set the
+- thread state to *tstate*, which must not be *NULL*. If the lock has been
++ thread state to *tstate*, which must not be ``NULL``. If the lock has been
+ created, the current thread must not have acquired it, otherwise deadlock
+ ensues.
+
+@@ -873,14 +894,14 @@ code, or when embedding the Python interpreter:
+ .. c:function:: PyThreadState* PyThreadState_Get()
+
+ Return the current thread state. The global interpreter lock must be held.
+- When the current thread state is *NULL*, this issues a fatal error (so that
+- the caller needn't check for *NULL*).
++ When the current thread state is ``NULL``, this issues a fatal error (so that
++ the caller needn't check for ``NULL``).
+
+
+ .. c:function:: PyThreadState* PyThreadState_Swap(PyThreadState *tstate)
+
+ Swap the current thread state with the thread state given by the argument
+- *tstate*, which may be *NULL*. The global interpreter lock must be held
++ *tstate*, which may be ``NULL``. The global interpreter lock must be held
+ and is not released.
+
+
+@@ -1046,7 +1067,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
+ .. c:function:: PyObject* PyInterpreterState_GetDict(PyInterpreterState *interp)
+
+ Return a dictionary in which interpreter-specific data may be stored.
+- If this function returns *NULL* then no exception has been raised and
++ If this function returns ``NULL`` then no exception has been raised and
+ the caller should assume no interpreter-specific dict is available.
+
+ This is not a replacement for :c:func:`PyModule_GetState()`, which
+@@ -1060,7 +1081,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
+ Return a dictionary in which extensions can store thread-specific state
+ information. Each extension should use a unique key to use to store state in
+ the dictionary. It is okay to call this function when no current thread state
+- is available. If this function returns *NULL*, no exception has been raised and
++ is available. If this function returns ``NULL``, no exception has been raised and
+ the caller should assume no current thread state is available.
+
+
+@@ -1081,7 +1102,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
+ .. c:function:: void PyEval_AcquireThread(PyThreadState *tstate)
+
+ Acquire the global interpreter lock and set the current thread state to
+- *tstate*, which should not be *NULL*. The lock must have been created earlier.
++ *tstate*, which should not be ``NULL``. The lock must have been created earlier.
+ If this thread already has the lock, deadlock ensues.
+
+ .. note::
+@@ -1102,9 +1123,9 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
+
+ .. c:function:: void PyEval_ReleaseThread(PyThreadState *tstate)
+
+- Reset the current thread state to *NULL* and release the global interpreter
++ Reset the current thread state to ``NULL`` and release the global interpreter
+ lock. The lock must have been created earlier and must be held by the current
+- thread. The *tstate* argument, which must not be *NULL*, is only used to check
++ thread. The *tstate* argument, which must not be ``NULL``, is only used to check
+ that it represents the current thread state --- if it isn't, a fatal error is
+ reported.
+
+@@ -1189,7 +1210,7 @@ function. You can create and destroy them using the following functions:
+ The return value points to the first thread state created in the new
+ sub-interpreter. This thread state is made in the current thread state.
+ Note that no actual thread is created; see the discussion of thread states
+- below. If creation of the new interpreter is unsuccessful, *NULL* is
++ below. If creation of the new interpreter is unsuccessful, ``NULL`` is
+ returned; no exception is set since the exception state is stored in the
+ current thread state and there may not be a current thread state. (Like all
+ other Python/C API functions, the global interpreter lock must be held before
+@@ -1220,7 +1241,7 @@ function. You can create and destroy them using the following functions:
+
+ Destroy the (sub-)interpreter represented by the given thread state. The given
+ thread state must be the current thread state. See the discussion of thread
+- states below. When the call returns, the current thread state is *NULL*. All
++ states below. When the call returns, the current thread state is ``NULL``. All
+ thread states associated with this interpreter are destroyed. (The global
+ interpreter lock must be held before calling this function and is still held
+ when it returns.) :c:func:`Py_FinalizeEx` will destroy all sub-interpreters that
+@@ -1327,27 +1348,27 @@ Python-level trace functions in previous versions.
+ :const:`PyTrace_C_CALL`, :const:`PyTrace_C_EXCEPTION`, :const:`PyTrace_C_RETURN`,
+ or :const:`PyTrace_OPCODE`, and *arg* depends on the value of *what*:
+
+- +------------------------------+--------------------------------------+
+- | Value of *what* | Meaning of *arg* |
+- +==============================+======================================+
+- | :const:`PyTrace_CALL` | Always :c:data:`Py_None`. |
+- +------------------------------+--------------------------------------+
+- | :const:`PyTrace_EXCEPTION` | Exception information as returned by |
+- | | :func:`sys.exc_info`. |
+- +------------------------------+--------------------------------------+
+- | :const:`PyTrace_LINE` | Always :c:data:`Py_None`. |
+- +------------------------------+--------------------------------------+
+- | :const:`PyTrace_RETURN` | Value being returned to the caller, |
+- | | or *NULL* if caused by an exception. |
+- +------------------------------+--------------------------------------+
+- | :const:`PyTrace_C_CALL` | Function object being called. |
+- +------------------------------+--------------------------------------+
+- | :const:`PyTrace_C_EXCEPTION` | Function object being called. |
+- +------------------------------+--------------------------------------+
+- | :const:`PyTrace_C_RETURN` | Function object being called. |
+- +------------------------------+--------------------------------------+
+- | :const:`PyTrace_OPCODE` | Always :c:data:`Py_None`. |
+- +------------------------------+--------------------------------------+
++ +------------------------------+----------------------------------------+
++ | Value of *what* | Meaning of *arg* |
++ +==============================+========================================+
++ | :const:`PyTrace_CALL` | Always :c:data:`Py_None`. |
++ +------------------------------+----------------------------------------+
++ | :const:`PyTrace_EXCEPTION` | Exception information as returned by |
++ | | :func:`sys.exc_info`. |
++ +------------------------------+----------------------------------------+
++ | :const:`PyTrace_LINE` | Always :c:data:`Py_None`. |
++ +------------------------------+----------------------------------------+
++ | :const:`PyTrace_RETURN` | Value being returned to the caller, |
++ | | or ``NULL`` if caused by an exception. |
++ +------------------------------+----------------------------------------+
++ | :const:`PyTrace_C_CALL` | Function object being called. |
++ +------------------------------+----------------------------------------+
++ | :const:`PyTrace_C_EXCEPTION` | Function object being called. |
++ +------------------------------+----------------------------------------+
++ | :const:`PyTrace_C_RETURN` | Function object being called. |
++ +------------------------------+----------------------------------------+
++ | :const:`PyTrace_OPCODE` | Always :c:data:`Py_None`. |
++ +------------------------------+----------------------------------------+
+
+ .. c:var:: int PyTrace_CALL
+
+@@ -1411,7 +1432,7 @@ Python-level trace functions in previous versions.
+ .. c:function:: void PyEval_SetProfile(Py_tracefunc func, PyObject *obj)
+
+ Set the profiler function to *func*. The *obj* parameter is passed to the
+- function as its first parameter, and may be any Python object, or *NULL*. If
++ function as its first parameter, and may be any Python object, or ``NULL``. If
+ the profile function needs to maintain state, using a different value for *obj*
+ for each thread provides a convenient and thread-safe place to store it. The
+ profile function is called for all monitored events except :const:`PyTrace_LINE`
+@@ -1534,7 +1555,7 @@ is not possible due to its implementation being opaque at build time.
+ .. c:function:: Py_tss_t* PyThread_tss_alloc()
+
+ Return a value which is the same state as a value initialized with
+- :c:macro:`Py_tss_NEEDS_INIT`, or *NULL* in the case of dynamic allocation
++ :c:macro:`Py_tss_NEEDS_INIT`, or ``NULL`` in the case of dynamic allocation
+ failure.
+
+
+@@ -1553,7 +1574,7 @@ is not possible due to its implementation being opaque at build time.
+ Methods
+ ~~~~~~~
+
+-The parameter *key* of these functions must not be *NULL*. Moreover, the
++The parameter *key* of these functions must not be ``NULL``. Moreover, the
+ behaviors of :c:func:`PyThread_tss_set` and :c:func:`PyThread_tss_get` are
+ undefined if the given :c:type:`Py_tss_t` has not been initialized by
+ :c:func:`PyThread_tss_create`.
+@@ -1593,7 +1614,7 @@ undefined if the given :c:type:`Py_tss_t` has not been initialized by
+ .. c:function:: void* PyThread_tss_get(Py_tss_t *key)
+
+ Return the :c:type:`void\*` value associated with a TSS key in the current
+- thread. This returns *NULL* if no value is associated with the key in the
++ thread. This returns ``NULL`` if no value is associated with the key in the
+ current thread.
+
+
+diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst
+index 5e18300471..6b16b5bb72 100644
+--- a/Doc/c-api/init_config.rst
++++ b/Doc/c-api/init_config.rst
+@@ -61,8 +61,8 @@ PyWideStringList
+
+ List of ``wchar_t*`` strings.
+
+- If *length* is non-zero, *items* must be non-NULL and all strings must be
+- non-NULL.
++ If *length* is non-zero, *items* must be non-``NULL`` and all strings must be
++ non-``NULL``.
+
+ Methods:
+
+@@ -608,7 +608,7 @@ PyConfig
+
+ :data:`sys.pycache_prefix`: ``.pyc`` cache prefix.
+
+- If NULL, :data:`sys.pycache_prefix` is set to ``None``.
++ If ``NULL``, :data:`sys.pycache_prefix` is set to ``None``.
+
+ .. c:member:: int quiet
+
+diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst
+index 80eebd89ad..d08d4f97a3 100644
+--- a/Doc/c-api/intro.rst
++++ b/Doc/c-api/intro.rst
+@@ -152,7 +152,7 @@ complete listing.
+
+ .. c:macro:: Py_GETENV(s)
+
+- Like ``getenv(s)``, but returns *NULL* if :option:`-E` was passed on the
++ Like ``getenv(s)``, but returns ``NULL`` if :option:`-E` was passed on the
+ command line (i.e. if ``Py_IgnoreEnvironmentFlag`` is set).
+
+ .. c:macro:: Py_UNUSED(arg)
+@@ -475,7 +475,7 @@ functions in the Python/C API can raise exceptions, unless an explicit claim is
+ made otherwise in a function's documentation. In general, when a function
+ encounters an error, it sets an exception, discards any object references that
+ it owns, and returns an error indicator. If not documented otherwise, this
+-indicator is either *NULL* or ``-1``, depending on the function's return type.
++indicator is either ``NULL`` or ``-1``, depending on the function's return type.
+ A few functions return a Boolean true/false result, with false indicating an
+ error. Very few functions return no explicit error indicator or have an
+ ambiguous return value, and require explicit testing for errors with
+@@ -490,13 +490,13 @@ using global storage in an unthreaded application). A thread can be in one of
+ two states: an exception has occurred, or not. The function
+ :c:func:`PyErr_Occurred` can be used to check for this: it returns a borrowed
+ reference to the exception type object when an exception has occurred, and
+-*NULL* otherwise. There are a number of functions to set the exception state:
++``NULL`` otherwise. There are a number of functions to set the exception state:
+ :c:func:`PyErr_SetString` is the most common (though not the most general)
+ function to set the exception state, and :c:func:`PyErr_Clear` clears the
+ exception state.
+
+ The full exception state consists of three objects (all of which can be
+-*NULL*): the exception type, the corresponding exception value, and the
++``NULL``): the exception type, the corresponding exception value, and the
+ traceback. These have the same meanings as the Python result of
+ ``sys.exc_info()``; however, they are not the same: the Python objects represent
+ the last exception being handled by a Python :keyword:`try` ...
+@@ -597,10 +597,10 @@ Here is the corresponding C code, in all its glory::
+ This example represents an endorsed use of the ``goto`` statement in C!
+ It illustrates the use of :c:func:`PyErr_ExceptionMatches` and
+ :c:func:`PyErr_Clear` to handle specific exceptions, and the use of
+-:c:func:`Py_XDECREF` to dispose of owned references that may be *NULL* (note the
++:c:func:`Py_XDECREF` to dispose of owned references that may be ``NULL`` (note the
+ ``'X'`` in the name; :c:func:`Py_DECREF` would crash when confronted with a
+-*NULL* reference). It is important that the variables used to hold owned
+-references are initialized to *NULL* for this to work; likewise, the proposed
++``NULL`` reference). It is important that the variables used to hold owned
++references are initialized to ``NULL`` for this to work; likewise, the proposed
+ return value is initialized to ``-1`` (failure) and only set to success after
+ the final call made is successful.
+
+diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst
+index 546efb518a..0224d37f1a 100644
+--- a/Doc/c-api/iter.rst
++++ b/Doc/c-api/iter.rst
+@@ -16,8 +16,8 @@ There are two functions specifically for working with iterators.
+
+ Return the next value from the iteration *o*. The object must be an iterator
+ (it is up to the caller to check this). If there are no remaining values,
+- returns *NULL* with no exception set. If an error occurs while retrieving
+- the item, returns *NULL* and passes along the exception.
++ returns ``NULL`` with no exception set. If an error occurs while retrieving
++ the item, returns ``NULL`` and passes along the exception.
+
+ To write a loop which iterates over an iterator, the C code should look
+ something like this::
+diff --git a/Doc/c-api/list.rst b/Doc/c-api/list.rst
+index dc9026605b..b247cdfba0 100644
+--- a/Doc/c-api/list.rst
++++ b/Doc/c-api/list.rst
+@@ -33,7 +33,7 @@ List Objects
+
+ .. c:function:: PyObject* PyList_New(Py_ssize_t len)
+
+- Return a new list of length *len* on success, or *NULL* on failure.
++ Return a new list of length *len* on success, or ``NULL`` on failure.
+
+ .. note::
+
+@@ -61,7 +61,7 @@ List Objects
+ Return the object at position *index* in the list pointed to by *list*. The
+ position must be non-negative; indexing from the end of the list is not
+ supported. If *index* is out of bounds (<0 or >=len(list)),
+- return *NULL* and set an :exc:`IndexError` exception.
++ return ``NULL`` and set an :exc:`IndexError` exception.
+
+
+ .. c:function:: PyObject* PyList_GET_ITEM(PyObject *list, Py_ssize_t i)
+@@ -71,8 +71,9 @@ List Objects
+
+ .. c:function:: int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item)
+
+- Set the item at index *index* in list to *item*. Return ``0`` on success
+- or ``-1`` on failure.
++ Set the item at index *index* in list to *item*. Return ``0`` on success.
++ If *index* is out of bounds, return ``-1`` and set an :exc:`IndexError`
++ exception.
+
+ .. note::
+
+@@ -110,18 +111,17 @@ List Objects
+ .. c:function:: PyObject* PyList_GetSlice(PyObject *list, Py_ssize_t low, Py_ssize_t high)
+
+ Return a list of the objects in *list* containing the objects *between* *low*
+- and *high*. Return *NULL* and set an exception if unsuccessful. Analogous
+- to ``list[low:high]``. Negative indices, as when slicing from Python, are not
+- supported.
++ and *high*. Return ``NULL`` and set an exception if unsuccessful. Analogous
++ to ``list[low:high]``. Indexing from the end of the list is not supported.
+
+
+ .. c:function:: int PyList_SetSlice(PyObject *list, Py_ssize_t low, Py_ssize_t high, PyObject *itemlist)
+
+ Set the slice of *list* between *low* and *high* to the contents of
+ *itemlist*. Analogous to ``list[low:high] = itemlist``. The *itemlist* may
+- be *NULL*, indicating the assignment of an empty list (slice deletion).
+- Return ``0`` on success, ``-1`` on failure. Negative indices, as when
+- slicing from Python, are not supported.
++ be ``NULL``, indicating the assignment of an empty list (slice deletion).
++ Return ``0`` on success, ``-1`` on failure. Indexing from the end of the
++ list is not supported.
+
+
+ .. c:function:: int PyList_Sort(PyObject *list)
+diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst
+index fdaefafe21..33f6b3be58 100644
+--- a/Doc/c-api/long.rst
++++ b/Doc/c-api/long.rst
+@@ -38,7 +38,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate.
+
+ .. c:function:: PyObject* PyLong_FromLong(long v)
+
+- Return a new :c:type:`PyLongObject` object from *v*, or *NULL* on failure.
++ Return a new :c:type:`PyLongObject` object from *v*, or ``NULL`` on failure.
+
+ The current implementation keeps an array of integer objects for all integers
+ between ``-5`` and ``256``, when you create an int in that range you actually
+@@ -50,43 +50,43 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate.
+ .. c:function:: PyObject* PyLong_FromUnsignedLong(unsigned long v)
+
+ Return a new :c:type:`PyLongObject` object from a C :c:type:`unsigned long`, or
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+
+ .. c:function:: PyObject* PyLong_FromSsize_t(Py_ssize_t v)
+
+ Return a new :c:type:`PyLongObject` object from a C :c:type:`Py_ssize_t`, or
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+
+ .. c:function:: PyObject* PyLong_FromSize_t(size_t v)
+
+ Return a new :c:type:`PyLongObject` object from a C :c:type:`size_t`, or
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+
+ .. c:function:: PyObject* PyLong_FromLongLong(long long v)
+
+- Return a new :c:type:`PyLongObject` object from a C :c:type:`long long`, or *NULL*
++ Return a new :c:type:`PyLongObject` object from a C :c:type:`long long`, or ``NULL``
+ on failure.
+
+
+ .. c:function:: PyObject* PyLong_FromUnsignedLongLong(unsigned long long v)
+
+ Return a new :c:type:`PyLongObject` object from a C :c:type:`unsigned long long`,
+- or *NULL* on failure.
++ or ``NULL`` on failure.
+
+
+ .. c:function:: PyObject* PyLong_FromDouble(double v)
+
+ Return a new :c:type:`PyLongObject` object from the integer part of *v*, or
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+
+ .. c:function:: PyObject* PyLong_FromString(const char *str, char **pend, int base)
+
+ Return a new :c:type:`PyLongObject` based on the string value in *str*, which
+- is interpreted according to the radix in *base*. If *pend* is non-*NULL*,
++ is interpreted according to the radix in *base*. If *pend* is non-``NULL``,
+ *\*pend* will point to the first character in *str* which follows the
+ representation of the number. If *base* is ``0``, *str* is interpreted using
+ the :ref:`integers` definition; in this case, leading zeros in a
+@@ -336,4 +336,4 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate.
+ is only assured to produce a usable :c:type:`void` pointer for values created
+ with :c:func:`PyLong_FromVoidPtr`.
+
+- Returns *NULL* on error. Use :c:func:`PyErr_Occurred` to disambiguate.
++ Returns ``NULL`` on error. Use :c:func:`PyErr_Occurred` to disambiguate.
+diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst
+index 4244b47af7..6a80b033b6 100644
+--- a/Doc/c-api/mapping.rst
++++ b/Doc/c-api/mapping.rst
+@@ -14,8 +14,7 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and
+ Return ``1`` if the object provides mapping protocol or supports slicing,
+ and ``0`` otherwise. Note that it returns ``1`` for Python classes with
+ a :meth:`__getitem__` method since in general case it is impossible to
+- determine what the type of keys it supports. This function always
+- succeeds.
++ determine what type of keys it supports. This function always succeeds.
+
+
+ .. c:function:: Py_ssize_t PyMapping_Size(PyObject *o)
+@@ -29,7 +28,7 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and
+
+ .. c:function:: PyObject* PyMapping_GetItemString(PyObject *o, const char *key)
+
+- Return element of *o* corresponding to the string *key* or *NULL* on failure.
++ Return element of *o* corresponding to the string *key* or ``NULL`` on failure.
+ This is the equivalent of the Python expression ``o[key]``.
+ See also :c:func:`PyObject_GetItem`.
+
+@@ -79,7 +78,7 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and
+ .. c:function:: PyObject* PyMapping_Keys(PyObject *o)
+
+ On success, return a list of the keys in object *o*. On failure, return
+- *NULL*.
++ ``NULL``.
+
+ .. versionchanged:: 3.7
+ Previously, the function returned a list or a tuple.
+@@ -88,7 +87,7 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and
+ .. c:function:: PyObject* PyMapping_Values(PyObject *o)
+
+ On success, return a list of the values in object *o*. On failure, return
+- *NULL*.
++ ``NULL``.
+
+ .. versionchanged:: 3.7
+ Previously, the function returned a list or a tuple.
+@@ -97,7 +96,7 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and
+ .. c:function:: PyObject* PyMapping_Items(PyObject *o)
+
+ On success, return a list of the items in object *o*, where each item is a
+- tuple containing a key-value pair. On failure, return *NULL*.
++ tuple containing a key-value pair. On failure, return ``NULL``.
+
+ .. versionchanged:: 3.7
+ Previously, the function returned a list or a tuple.
+diff --git a/Doc/c-api/marshal.rst b/Doc/c-api/marshal.rst
+index b086830feb..7b179e22e2 100644
+--- a/Doc/c-api/marshal.rst
++++ b/Doc/c-api/marshal.rst
+@@ -16,7 +16,7 @@ Numeric values are stored with the least significant byte first.
+ The module supports two versions of the data format: version 0 is the
+ historical version, version 1 shares interned strings in the file, and upon
+ unmarshalling. Version 2 uses a binary format for floating point numbers.
+-*Py_MARSHAL_VERSION* indicates the current file format (currently 2).
++``Py_MARSHAL_VERSION`` indicates the current file format (currently 2).
+
+
+ .. c:function:: void PyMarshal_WriteLongToFile(long value, FILE *file, int version)
+@@ -67,7 +67,7 @@ The following functions allow marshalled values to be read back in.
+ reading.
+
+ On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError`
+- or :exc:`TypeError`) and returns *NULL*.
++ or :exc:`TypeError`) and returns ``NULL``.
+
+
+ .. c:function:: PyObject* PyMarshal_ReadLastObjectFromFile(FILE *file)
+@@ -81,7 +81,7 @@ The following functions allow marshalled values to be read back in.
+ anything else from the file.
+
+ On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError`
+- or :exc:`TypeError`) and returns *NULL*.
++ or :exc:`TypeError`) and returns ``NULL``.
+
+
+ .. c:function:: PyObject* PyMarshal_ReadObjectFromString(const char *data, Py_ssize_t len)
+@@ -90,5 +90,5 @@ The following functions allow marshalled values to be read back in.
+ containing *len* bytes pointed to by *data*.
+
+ On error, sets the appropriate exception (:exc:`EOFError`, :exc:`ValueError`
+- or :exc:`TypeError`) and returns *NULL*.
++ or :exc:`TypeError`) and returns ``NULL``.
+
+diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst
+index d3c8b30d36..ba7bd3b9a5 100644
+--- a/Doc/c-api/memory.rst
++++ b/Doc/c-api/memory.rst
+@@ -110,9 +110,9 @@ zero bytes.
+ .. c:function:: void* PyMem_RawMalloc(size_t n)
+
+ Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the
+- allocated memory, or *NULL* if the request fails.
++ allocated memory, or ``NULL`` if the request fails.
+
+- Requesting zero bytes returns a distinct non-*NULL* pointer if possible, as
++ Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, as
+ if ``PyMem_RawMalloc(1)`` had been called instead. The memory will not have
+ been initialized in any way.
+
+@@ -120,11 +120,11 @@ zero bytes.
+ .. c:function:: void* PyMem_RawCalloc(size_t nelem, size_t elsize)
+
+ Allocates *nelem* elements each whose size in bytes is *elsize* and returns
+- a pointer of type :c:type:`void\*` to the allocated memory, or *NULL* if the
++ a pointer of type :c:type:`void\*` to the allocated memory, or ``NULL`` if the
+ request fails. The memory is initialized to zeros.
+
+ Requesting zero elements or elements of size zero bytes returns a distinct
+- non-*NULL* pointer if possible, as if ``PyMem_RawCalloc(1, 1)`` had been
++ non-``NULL`` pointer if possible, as if ``PyMem_RawCalloc(1, 1)`` had been
+ called instead.
+
+ .. versionadded:: 3.5
+@@ -135,15 +135,15 @@ zero bytes.
+ Resizes the memory block pointed to by *p* to *n* bytes. The contents will
+ be unchanged to the minimum of the old and the new sizes.
+
+- If *p* is *NULL*, the call is equivalent to ``PyMem_RawMalloc(n)``; else if
++ If *p* is ``NULL``, the call is equivalent to ``PyMem_RawMalloc(n)``; else if
+ *n* is equal to zero, the memory block is resized but is not freed, and the
+- returned pointer is non-*NULL*.
++ returned pointer is non-``NULL``.
+
+- Unless *p* is *NULL*, it must have been returned by a previous call to
++ Unless *p* is ``NULL``, it must have been returned by a previous call to
+ :c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawRealloc` or
+ :c:func:`PyMem_RawCalloc`.
+
+- If the request fails, :c:func:`PyMem_RawRealloc` returns *NULL* and *p*
++ If the request fails, :c:func:`PyMem_RawRealloc` returns ``NULL`` and *p*
+ remains a valid pointer to the previous memory area.
+
+
+@@ -154,7 +154,7 @@ zero bytes.
+ :c:func:`PyMem_RawCalloc`. Otherwise, or if ``PyMem_RawFree(p)`` has been
+ called before, undefined behavior occurs.
+
+- If *p* is *NULL*, no operation is performed.
++ If *p* is ``NULL``, no operation is performed.
+
+
+ .. _memoryinterface:
+@@ -181,9 +181,9 @@ The :ref:`default memory allocator <default-memory-allocators>` uses the
+ .. c:function:: void* PyMem_Malloc(size_t n)
+
+ Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the
+- allocated memory, or *NULL* if the request fails.
++ allocated memory, or ``NULL`` if the request fails.
+
+- Requesting zero bytes returns a distinct non-*NULL* pointer if possible, as
++ Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, as
+ if ``PyMem_Malloc(1)`` had been called instead. The memory will not have
+ been initialized in any way.
+
+@@ -191,11 +191,11 @@ The :ref:`default memory allocator <default-memory-allocators>` uses the
+ .. c:function:: void* PyMem_Calloc(size_t nelem, size_t elsize)
+
+ Allocates *nelem* elements each whose size in bytes is *elsize* and returns
+- a pointer of type :c:type:`void\*` to the allocated memory, or *NULL* if the
++ a pointer of type :c:type:`void\*` to the allocated memory, or ``NULL`` if the
+ request fails. The memory is initialized to zeros.
+
+ Requesting zero elements or elements of size zero bytes returns a distinct
+- non-*NULL* pointer if possible, as if ``PyMem_Calloc(1, 1)`` had been called
++ non-``NULL`` pointer if possible, as if ``PyMem_Calloc(1, 1)`` had been called
+ instead.
+
+ .. versionadded:: 3.5
+@@ -206,14 +206,14 @@ The :ref:`default memory allocator <default-memory-allocators>` uses the
+ Resizes the memory block pointed to by *p* to *n* bytes. The contents will be
+ unchanged to the minimum of the old and the new sizes.
+
+- If *p* is *NULL*, the call is equivalent to ``PyMem_Malloc(n)``; else if *n*
++ If *p* is ``NULL``, the call is equivalent to ``PyMem_Malloc(n)``; else if *n*
+ is equal to zero, the memory block is resized but is not freed, and the
+- returned pointer is non-*NULL*.
++ returned pointer is non-``NULL``.
+
+- Unless *p* is *NULL*, it must have been returned by a previous call to
++ Unless *p* is ``NULL``, it must have been returned by a previous call to
+ :c:func:`PyMem_Malloc`, :c:func:`PyMem_Realloc` or :c:func:`PyMem_Calloc`.
+
+- If the request fails, :c:func:`PyMem_Realloc` returns *NULL* and *p* remains
++ If the request fails, :c:func:`PyMem_Realloc` returns ``NULL`` and *p* remains
+ a valid pointer to the previous memory area.
+
+
+@@ -224,7 +224,7 @@ The :ref:`default memory allocator <default-memory-allocators>` uses the
+ :c:func:`PyMem_Calloc`. Otherwise, or if ``PyMem_Free(p)`` has been called
+ before, undefined behavior occurs.
+
+- If *p* is *NULL*, no operation is performed.
++ If *p* is ``NULL``, no operation is performed.
+
+ The following type-oriented macros are provided for convenience. Note that
+ *TYPE* refers to any C type.
+@@ -241,7 +241,7 @@ The following type-oriented macros are provided for convenience. Note that
+
+ Same as :c:func:`PyMem_Realloc`, but the memory block is resized to ``(n *
+ sizeof(TYPE))`` bytes. Returns a pointer cast to :c:type:`TYPE\*`. On return,
+- *p* will be a pointer to the new memory area, or *NULL* in the event of
++ *p* will be a pointer to the new memory area, or ``NULL`` in the event of
+ failure.
+
+ This is a C preprocessor macro; *p* is always reassigned. Save the original
+@@ -283,9 +283,9 @@ The :ref:`default object allocator <default-memory-allocators>` uses the
+ .. c:function:: void* PyObject_Malloc(size_t n)
+
+ Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the
+- allocated memory, or *NULL* if the request fails.
++ allocated memory, or ``NULL`` if the request fails.
+
+- Requesting zero bytes returns a distinct non-*NULL* pointer if possible, as
++ Requesting zero bytes returns a distinct non-``NULL`` pointer if possible, as
+ if ``PyObject_Malloc(1)`` had been called instead. The memory will not have
+ been initialized in any way.
+
+@@ -293,11 +293,11 @@ The :ref:`default object allocator <default-memory-allocators>` uses the
+ .. c:function:: void* PyObject_Calloc(size_t nelem, size_t elsize)
+
+ Allocates *nelem* elements each whose size in bytes is *elsize* and returns
+- a pointer of type :c:type:`void\*` to the allocated memory, or *NULL* if the
++ a pointer of type :c:type:`void\*` to the allocated memory, or ``NULL`` if the
+ request fails. The memory is initialized to zeros.
+
+ Requesting zero elements or elements of size zero bytes returns a distinct
+- non-*NULL* pointer if possible, as if ``PyObject_Calloc(1, 1)`` had been called
++ non-``NULL`` pointer if possible, as if ``PyObject_Calloc(1, 1)`` had been called
+ instead.
+
+ .. versionadded:: 3.5
+@@ -308,14 +308,14 @@ The :ref:`default object allocator <default-memory-allocators>` uses the
+ Resizes the memory block pointed to by *p* to *n* bytes. The contents will be
+ unchanged to the minimum of the old and the new sizes.
+
+- If *p* is *NULL*, the call is equivalent to ``PyObject_Malloc(n)``; else if *n*
++ If *p* is ``NULL``, the call is equivalent to ``PyObject_Malloc(n)``; else if *n*
+ is equal to zero, the memory block is resized but is not freed, and the
+- returned pointer is non-*NULL*.
++ returned pointer is non-``NULL``.
+
+- Unless *p* is *NULL*, it must have been returned by a previous call to
++ Unless *p* is ``NULL``, it must have been returned by a previous call to
+ :c:func:`PyObject_Malloc`, :c:func:`PyObject_Realloc` or :c:func:`PyObject_Calloc`.
+
+- If the request fails, :c:func:`PyObject_Realloc` returns *NULL* and *p* remains
++ If the request fails, :c:func:`PyObject_Realloc` returns ``NULL`` and *p* remains
+ a valid pointer to the previous memory area.
+
+
+@@ -326,7 +326,7 @@ The :ref:`default object allocator <default-memory-allocators>` uses the
+ :c:func:`PyObject_Calloc`. Otherwise, or if ``PyObject_Free(p)`` has been called
+ before, undefined behavior occurs.
+
+- If *p* is *NULL*, no operation is performed.
++ If *p* is ``NULL``, no operation is performed.
+
+
+ .. _default-memory-allocators:
+@@ -424,7 +424,7 @@ Customize Memory Allocators
+
+ Set the memory block allocator of the specified domain.
+
+- The new allocator must return a distinct non-NULL pointer when requesting
++ The new allocator must return a distinct non-``NULL`` pointer when requesting
+ zero bytes.
+
+ For the :c:data:`PYMEM_DOMAIN_RAW` domain, the allocator must be
+diff --git a/Doc/c-api/memoryview.rst b/Doc/c-api/memoryview.rst
+index 77afb02040..de429e5c11 100644
+--- a/Doc/c-api/memoryview.rst
++++ b/Doc/c-api/memoryview.rst
+@@ -57,7 +57,7 @@ any other object.
+ .. c:function:: Py_buffer *PyMemoryView_GET_BASE(PyObject *mview)
+
+ Return either a pointer to the exporting object that the memoryview is based
+- on or *NULL* if the memoryview has been created by one of the functions
++ on or ``NULL`` if the memoryview has been created by one of the functions
+ :c:func:`PyMemoryView_FromMemory` or :c:func:`PyMemoryView_FromBuffer`.
+ *mview* **must** be a memoryview instance.
+
+diff --git a/Doc/c-api/method.rst b/Doc/c-api/method.rst
+index 1ad805e269..b1862d796c 100644
+--- a/Doc/c-api/method.rst
++++ b/Doc/c-api/method.rst
+@@ -21,7 +21,7 @@ to bind a :c:data:`PyCFunction` to a class object. It replaces the former call
+ .. c:function:: int PyInstanceMethod_Check(PyObject *o)
+
+ Return true if *o* is an instance method object (has type
+- :c:data:`PyInstanceMethod_Type`). The parameter must not be *NULL*.
++ :c:data:`PyInstanceMethod_Type`). The parameter must not be ``NULL``.
+
+
+ .. c:function:: PyObject* PyInstanceMethod_New(PyObject *func)
+@@ -64,14 +64,14 @@ no longer available.
+ .. c:function:: int PyMethod_Check(PyObject *o)
+
+ Return true if *o* is a method object (has type :c:data:`PyMethod_Type`). The
+- parameter must not be *NULL*.
++ parameter must not be ``NULL``.
+
+
+ .. c:function:: PyObject* PyMethod_New(PyObject *func, PyObject *self)
+
+ Return a new method object, with *func* being any callable object and *self*
+ the instance the method should be bound. *func* is the function that will
+- be called when the method is called. *self* must not be *NULL*.
++ be called when the method is called. *self* must not be ``NULL``.
+
+
+ .. c:function:: PyObject* PyMethod_Function(PyObject *meth)
+diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst
+index feca1ec2a0..57902a9c7f 100644
+--- a/Doc/c-api/module.rst
++++ b/Doc/c-api/module.rst
+@@ -61,7 +61,7 @@ Module Objects
+ Return the dictionary object that implements *module*'s namespace; this object
+ is the same as the :attr:`~object.__dict__` attribute of the module object.
+ If *module* is not a module object (or a subtype of a module object),
+- :exc:`SystemError` is raised and *NULL* is returned.
++ :exc:`SystemError` is raised and ``NULL`` is returned.
+
+ It is recommended extensions use other :c:func:`PyModule_\*` and
+ :c:func:`PyObject_\*` functions rather than directly manipulate a module's
+@@ -75,7 +75,7 @@ Module Objects
+ single: SystemError (built-in exception)
+
+ Return *module*'s :attr:`__name__` value. If the module does not provide one,
+- or if it is not a string, :exc:`SystemError` is raised and *NULL* is returned.
++ or if it is not a string, :exc:`SystemError` is raised and ``NULL`` is returned.
+
+ .. versionadded:: 3.3
+
+@@ -88,14 +88,14 @@ Module Objects
+ .. c:function:: void* PyModule_GetState(PyObject *module)
+
+ Return the "state" of the module, that is, a pointer to the block of memory
+- allocated at module creation time, or *NULL*. See
++ allocated at module creation time, or ``NULL``. See
+ :c:member:`PyModuleDef.m_size`.
+
+
+ .. c:function:: PyModuleDef* PyModule_GetDef(PyObject *module)
+
+ Return a pointer to the :c:type:`PyModuleDef` struct from which the module was
+- created, or *NULL* if the module wasn't created from a definition.
++ created, or ``NULL`` if the module wasn't created from a definition.
+
+
+ .. c:function:: PyObject* PyModule_GetFilenameObject(PyObject *module)
+@@ -106,7 +106,7 @@ Module Objects
+
+ Return the name of the file from which *module* was loaded using *module*'s
+ :attr:`__file__` attribute. If this is not defined, or if it is not a
+- unicode string, raise :exc:`SystemError` and return *NULL*; otherwise return
++ unicode string, raise :exc:`SystemError` and return ``NULL``; otherwise return
+ a reference to a Unicode object.
+
+ .. versionadded:: 3.2
+@@ -178,17 +178,17 @@ or request "multi-phase initialization" by returning the definition struct itsel
+ .. c:member:: PyMethodDef* m_methods
+
+ A pointer to a table of module-level functions, described by
+- :c:type:`PyMethodDef` values. Can be *NULL* if no functions are present.
++ :c:type:`PyMethodDef` values. Can be ``NULL`` if no functions are present.
+
+ .. c:member:: PyModuleDef_Slot* m_slots
+
+ An array of slot definitions for multi-phase initialization, terminated by
+ a ``{0, NULL}`` entry.
+- When using single-phase initialization, *m_slots* must be *NULL*.
++ When using single-phase initialization, *m_slots* must be ``NULL``.
+
+ .. versionchanged:: 3.5
+
+- Prior to version 3.5, this member was always set to *NULL*,
++ Prior to version 3.5, this member was always set to ``NULL``,
+ and was defined as:
+
+ .. c:member:: inquiry m_reload
+@@ -196,20 +196,20 @@ or request "multi-phase initialization" by returning the definition struct itsel
+ .. c:member:: traverseproc m_traverse
+
+ A traversal function to call during GC traversal of the module object, or
+- *NULL* if not needed. This function may be called before module state
++ ``NULL`` if not needed. This function may be called before module state
+ is allocated (:c:func:`PyModule_GetState()` may return `NULL`),
+ and before the :c:member:`Py_mod_exec` function is executed.
+
+ .. c:member:: inquiry m_clear
+
+ A clear function to call during GC clearing of the module object, or
+- *NULL* if not needed. This function may be called before module state
++ ``NULL`` if not needed. This function may be called before module state
+ is allocated (:c:func:`PyModule_GetState()` may return `NULL`),
+ and before the :c:member:`Py_mod_exec` function is executed.
+
+ .. c:member:: freefunc m_free
+
+- A function to call during deallocation of the module object, or *NULL* if
++ A function to call during deallocation of the module object, or ``NULL`` if
+ not needed. This function may be called before module state
+ is allocated (:c:func:`PyModule_GetState()` may return `NULL`),
+ and before the :c:member:`Py_mod_exec` function is executed.
+@@ -278,7 +278,7 @@ instance must be initialized with the following function:
+ Ensures a module definition is a properly initialized Python object that
+ correctly reports its type and reference count.
+
+- Returns *def* cast to ``PyObject*``, or *NULL* if an error occurred.
++ Returns *def* cast to ``PyObject*``, or ``NULL`` if an error occurred.
+
+ .. versionadded:: 3.5
+
+@@ -311,7 +311,7 @@ The available slot types are:
+ The function receives a :py:class:`~importlib.machinery.ModuleSpec`
+ instance, as defined in :PEP:`451`, and the module definition.
+ It should return a new module object, or set an error
+- and return *NULL*.
++ and return ``NULL``.
+
+ This function should be kept minimal. In particular, it should not
+ call arbitrary Python code, as trying to import the same module again may
+@@ -330,7 +330,7 @@ The available slot types are:
+ :c:type:`PyModule_Type`. Any type can be used, as long as it supports
+ setting and getting import-related attributes.
+ However, only ``PyModule_Type`` instances may be returned if the
+- ``PyModuleDef`` has non-*NULL* ``m_traverse``, ``m_clear``,
++ ``PyModuleDef`` has non-``NULL`` ``m_traverse``, ``m_clear``,
+ ``m_free``; non-zero ``m_size``; or slots other than ``Py_mod_create``.
+
+ .. c:var:: Py_mod_exec
+@@ -394,7 +394,7 @@ objects dynamically. Note that both ``PyModule_FromDefAndSpec`` and
+
+ .. c:function:: int PyModule_AddFunctions(PyObject *module, PyMethodDef *functions)
+
+- Add the functions from the *NULL* terminated *functions* array to *module*.
++ Add the functions from the ``NULL`` terminated *functions* array to *module*.
+ Refer to the :c:type:`PyMethodDef` documentation for details on individual
+ entries (due to the lack of a shared module namespace, module level
+ "functions" implemented in C typically receive the module as their first
+@@ -445,7 +445,7 @@ state:
+
+ Add a string constant to *module* as *name*. This convenience function can be
+ used from the module's initialization function. The string *value* must be
+- *NULL*-terminated. Return ``-1`` on error, ``0`` on success.
++ ``NULL``-terminated. Return ``-1`` on error, ``0`` on success.
+
+
+ .. c:function:: int PyModule_AddIntMacro(PyObject *module, macro)
+@@ -476,7 +476,7 @@ since multiple such modules can be created from a single definition.
+ Returns the module object that was created from *def* for the current interpreter.
+ This method requires that the module object has been attached to the interpreter state with
+ :c:func:`PyState_AddModule` beforehand. In case the corresponding module object is not
+- found or has not been attached to the interpreter state yet, it returns *NULL*.
++ found or has not been attached to the interpreter state yet, it returns ``NULL``.
+
+ .. c:function:: int PyState_AddModule(PyObject *module, PyModuleDef *def)
+
+@@ -485,10 +485,21 @@ since multiple such modules can be created from a single definition.
+
+ Only effective on modules created using single-phase initialization.
+
++ Python calls ``PyState_AddModule`` automatically after importing a module,
++ so it is unnecessary (but harmless) to call it from module initialization
++ code. An explicit call is needed only if the module's own init code
++ subsequently calls ``PyState_FindModule``.
++ The function is mainly intended for implementing alternative import
++ mechanisms (either by calling it directly, or by referring to its
++ implementation for details of the required state updates).
++
++ Return 0 on success or -1 on failure.
++
+ .. versionadded:: 3.3
+
+ .. c:function:: int PyState_RemoveModule(PyModuleDef *def)
+
+ Removes the module object created from *def* from the interpreter state.
++ Return 0 on success or -1 on failure.
+
+ .. versionadded:: 3.3
+diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst
+index 74932f6e74..620204ca8e 100644
+--- a/Doc/c-api/number.rst
++++ b/Doc/c-api/number.rst
+@@ -17,25 +17,25 @@ Number Protocol
+
+ .. c:function:: PyObject* PyNumber_Add(PyObject *o1, PyObject *o2)
+
+- Returns the result of adding *o1* and *o2*, or *NULL* on failure. This is the
++ Returns the result of adding *o1* and *o2*, or ``NULL`` on failure. This is the
+ equivalent of the Python expression ``o1 + o2``.
+
+
+ .. c:function:: PyObject* PyNumber_Subtract(PyObject *o1, PyObject *o2)
+
+- Returns the result of subtracting *o2* from *o1*, or *NULL* on failure. This is
++ Returns the result of subtracting *o2* from *o1*, or ``NULL`` on failure. This is
+ the equivalent of the Python expression ``o1 - o2``.
+
+
+ .. c:function:: PyObject* PyNumber_Multiply(PyObject *o1, PyObject *o2)
+
+- Returns the result of multiplying *o1* and *o2*, or *NULL* on failure. This is
++ Returns the result of multiplying *o1* and *o2*, or ``NULL`` on failure. This is
+ the equivalent of the Python expression ``o1 * o2``.
+
+
+ .. c:function:: PyObject* PyNumber_MatrixMultiply(PyObject *o1, PyObject *o2)
+
+- Returns the result of matrix multiplication on *o1* and *o2*, or *NULL* on
++ Returns the result of matrix multiplication on *o1* and *o2*, or ``NULL`` on
+ failure. This is the equivalent of the Python expression ``o1 @ o2``.
+
+ .. versionadded:: 3.5
+@@ -43,14 +43,14 @@ Number Protocol
+
+ .. c:function:: PyObject* PyNumber_FloorDivide(PyObject *o1, PyObject *o2)
+
+- Return the floor of *o1* divided by *o2*, or *NULL* on failure. This is
++ Return the floor of *o1* divided by *o2*, or ``NULL`` on failure. This is
+ equivalent to the "classic" division of integers.
+
+
+ .. c:function:: PyObject* PyNumber_TrueDivide(PyObject *o1, PyObject *o2)
+
+ Return a reasonable approximation for the mathematical value of *o1* divided by
+- *o2*, or *NULL* on failure. The return value is "approximate" because binary
++ *o2*, or ``NULL`` on failure. The return value is "approximate" because binary
+ floating point numbers are approximate; it is not possible to represent all real
+ numbers in base two. This function can return a floating point value when
+ passed two integers.
+@@ -58,7 +58,7 @@ Number Protocol
+
+ .. c:function:: PyObject* PyNumber_Remainder(PyObject *o1, PyObject *o2)
+
+- Returns the remainder of dividing *o1* by *o2*, or *NULL* on failure. This is
++ Returns the remainder of dividing *o1* by *o2*, or ``NULL`` on failure. This is
+ the equivalent of the Python expression ``o1 % o2``.
+
+
+@@ -66,7 +66,7 @@ Number Protocol
+
+ .. index:: builtin: divmod
+
+- See the built-in function :func:`divmod`. Returns *NULL* on failure. This is
++ See the built-in function :func:`divmod`. Returns ``NULL`` on failure. This is
+ the equivalent of the Python expression ``divmod(o1, o2)``.
+
+
+@@ -74,21 +74,21 @@ Number Protocol
+
+ .. index:: builtin: pow
+
+- See the built-in function :func:`pow`. Returns *NULL* on failure. This is the
++ See the built-in function :func:`pow`. Returns ``NULL`` on failure. This is the
+ equivalent of the Python expression ``pow(o1, o2, o3)``, where *o3* is optional.
+- If *o3* is to be ignored, pass :c:data:`Py_None` in its place (passing *NULL* for
++ If *o3* is to be ignored, pass :c:data:`Py_None` in its place (passing ``NULL`` for
+ *o3* would cause an illegal memory access).
+
+
+ .. c:function:: PyObject* PyNumber_Negative(PyObject *o)
+
+- Returns the negation of *o* on success, or *NULL* on failure. This is the
++ Returns the negation of *o* on success, or ``NULL`` on failure. This is the
+ equivalent of the Python expression ``-o``.
+
+
+ .. c:function:: PyObject* PyNumber_Positive(PyObject *o)
+
+- Returns *o* on success, or *NULL* on failure. This is the equivalent of the
++ Returns *o* on success, or ``NULL`` on failure. This is the equivalent of the
+ Python expression ``+o``.
+
+
+@@ -96,70 +96,70 @@ Number Protocol
+
+ .. index:: builtin: abs
+
+- Returns the absolute value of *o*, or *NULL* on failure. This is the equivalent
++ Returns the absolute value of *o*, or ``NULL`` on failure. This is the equivalent
+ of the Python expression ``abs(o)``.
+
+
+ .. c:function:: PyObject* PyNumber_Invert(PyObject *o)
+
+- Returns the bitwise negation of *o* on success, or *NULL* on failure. This is
++ Returns the bitwise negation of *o* on success, or ``NULL`` on failure. This is
+ the equivalent of the Python expression ``~o``.
+
+
+ .. c:function:: PyObject* PyNumber_Lshift(PyObject *o1, PyObject *o2)
+
+- Returns the result of left shifting *o1* by *o2* on success, or *NULL* on
++ Returns the result of left shifting *o1* by *o2* on success, or ``NULL`` on
+ failure. This is the equivalent of the Python expression ``o1 << o2``.
+
+
+ .. c:function:: PyObject* PyNumber_Rshift(PyObject *o1, PyObject *o2)
+
+- Returns the result of right shifting *o1* by *o2* on success, or *NULL* on
++ Returns the result of right shifting *o1* by *o2* on success, or ``NULL`` on
+ failure. This is the equivalent of the Python expression ``o1 >> o2``.
+
+
+ .. c:function:: PyObject* PyNumber_And(PyObject *o1, PyObject *o2)
+
+- Returns the "bitwise and" of *o1* and *o2* on success and *NULL* on failure.
++ Returns the "bitwise and" of *o1* and *o2* on success and ``NULL`` on failure.
+ This is the equivalent of the Python expression ``o1 & o2``.
+
+
+ .. c:function:: PyObject* PyNumber_Xor(PyObject *o1, PyObject *o2)
+
+- Returns the "bitwise exclusive or" of *o1* by *o2* on success, or *NULL* on
++ Returns the "bitwise exclusive or" of *o1* by *o2* on success, or ``NULL`` on
+ failure. This is the equivalent of the Python expression ``o1 ^ o2``.
+
+
+ .. c:function:: PyObject* PyNumber_Or(PyObject *o1, PyObject *o2)
+
+- Returns the "bitwise or" of *o1* and *o2* on success, or *NULL* on failure.
++ Returns the "bitwise or" of *o1* and *o2* on success, or ``NULL`` on failure.
+ This is the equivalent of the Python expression ``o1 | o2``.
+
+
+ .. c:function:: PyObject* PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2)
+
+- Returns the result of adding *o1* and *o2*, or *NULL* on failure. The operation
++ Returns the result of adding *o1* and *o2*, or ``NULL`` on failure. The operation
+ is done *in-place* when *o1* supports it. This is the equivalent of the Python
+ statement ``o1 += o2``.
+
+
+ .. c:function:: PyObject* PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2)
+
+- Returns the result of subtracting *o2* from *o1*, or *NULL* on failure. The
++ Returns the result of subtracting *o2* from *o1*, or ``NULL`` on failure. The
+ operation is done *in-place* when *o1* supports it. This is the equivalent of
+ the Python statement ``o1 -= o2``.
+
+
+ .. c:function:: PyObject* PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2)
+
+- Returns the result of multiplying *o1* and *o2*, or *NULL* on failure. The
++ Returns the result of multiplying *o1* and *o2*, or ``NULL`` on failure. The
+ operation is done *in-place* when *o1* supports it. This is the equivalent of
+ the Python statement ``o1 *= o2``.
+
+
+ .. c:function:: PyObject* PyNumber_InPlaceMatrixMultiply(PyObject *o1, PyObject *o2)
+
+- Returns the result of matrix multiplication on *o1* and *o2*, or *NULL* on
++ Returns the result of matrix multiplication on *o1* and *o2*, or ``NULL`` on
+ failure. The operation is done *in-place* when *o1* supports it. This is
+ the equivalent of the Python statement ``o1 @= o2``.
+
+@@ -168,7 +168,7 @@ Number Protocol
+
+ .. c:function:: PyObject* PyNumber_InPlaceFloorDivide(PyObject *o1, PyObject *o2)
+
+- Returns the mathematical floor of dividing *o1* by *o2*, or *NULL* on failure.
++ Returns the mathematical floor of dividing *o1* by *o2*, or ``NULL`` on failure.
+ The operation is done *in-place* when *o1* supports it. This is the equivalent
+ of the Python statement ``o1 //= o2``.
+
+@@ -176,7 +176,7 @@ Number Protocol
+ .. c:function:: PyObject* PyNumber_InPlaceTrueDivide(PyObject *o1, PyObject *o2)
+
+ Return a reasonable approximation for the mathematical value of *o1* divided by
+- *o2*, or *NULL* on failure. The return value is "approximate" because binary
++ *o2*, or ``NULL`` on failure. The return value is "approximate" because binary
+ floating point numbers are approximate; it is not possible to represent all real
+ numbers in base two. This function can return a floating point value when
+ passed two integers. The operation is done *in-place* when *o1* supports it.
+@@ -184,7 +184,7 @@ Number Protocol
+
+ .. c:function:: PyObject* PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2)
+
+- Returns the remainder of dividing *o1* by *o2*, or *NULL* on failure. The
++ Returns the remainder of dividing *o1* by *o2*, or ``NULL`` on failure. The
+ operation is done *in-place* when *o1* supports it. This is the equivalent of
+ the Python statement ``o1 %= o2``.
+
+@@ -193,44 +193,44 @@ Number Protocol
+
+ .. index:: builtin: pow
+
+- See the built-in function :func:`pow`. Returns *NULL* on failure. The operation
++ See the built-in function :func:`pow`. Returns ``NULL`` on failure. The operation
+ is done *in-place* when *o1* supports it. This is the equivalent of the Python
+ statement ``o1 **= o2`` when o3 is :c:data:`Py_None`, or an in-place variant of
+ ``pow(o1, o2, o3)`` otherwise. If *o3* is to be ignored, pass :c:data:`Py_None`
+- in its place (passing *NULL* for *o3* would cause an illegal memory access).
++ in its place (passing ``NULL`` for *o3* would cause an illegal memory access).
+
+
+ .. c:function:: PyObject* PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2)
+
+- Returns the result of left shifting *o1* by *o2* on success, or *NULL* on
++ Returns the result of left shifting *o1* by *o2* on success, or ``NULL`` on
+ failure. The operation is done *in-place* when *o1* supports it. This is the
+ equivalent of the Python statement ``o1 <<= o2``.
+
+
+ .. c:function:: PyObject* PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2)
+
+- Returns the result of right shifting *o1* by *o2* on success, or *NULL* on
++ Returns the result of right shifting *o1* by *o2* on success, or ``NULL`` on
+ failure. The operation is done *in-place* when *o1* supports it. This is the
+ equivalent of the Python statement ``o1 >>= o2``.
+
+
+ .. c:function:: PyObject* PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2)
+
+- Returns the "bitwise and" of *o1* and *o2* on success and *NULL* on failure. The
++ Returns the "bitwise and" of *o1* and *o2* on success and ``NULL`` on failure. The
+ operation is done *in-place* when *o1* supports it. This is the equivalent of
+ the Python statement ``o1 &= o2``.
+
+
+ .. c:function:: PyObject* PyNumber_InPlaceXor(PyObject *o1, PyObject *o2)
+
+- Returns the "bitwise exclusive or" of *o1* by *o2* on success, or *NULL* on
++ Returns the "bitwise exclusive or" of *o1* by *o2* on success, or ``NULL`` on
+ failure. The operation is done *in-place* when *o1* supports it. This is the
+ equivalent of the Python statement ``o1 ^= o2``.
+
+
+ .. c:function:: PyObject* PyNumber_InPlaceOr(PyObject *o1, PyObject *o2)
+
+- Returns the "bitwise or" of *o1* and *o2* on success, or *NULL* on failure. The
++ Returns the "bitwise or" of *o1* and *o2* on success, or ``NULL`` on failure. The
+ operation is done *in-place* when *o1* supports it. This is the equivalent of
+ the Python statement ``o1 |= o2``.
+
+@@ -239,7 +239,7 @@ Number Protocol
+
+ .. index:: builtin: int
+
+- Returns the *o* converted to an integer object on success, or *NULL* on
++ Returns the *o* converted to an integer object on success, or ``NULL`` on
+ failure. This is the equivalent of the Python expression ``int(o)``.
+
+
+@@ -247,13 +247,13 @@ Number Protocol
+
+ .. index:: builtin: float
+
+- Returns the *o* converted to a float object on success, or *NULL* on failure.
++ Returns the *o* converted to a float object on success, or ``NULL`` on failure.
+ This is the equivalent of the Python expression ``float(o)``.
+
+
+ .. c:function:: PyObject* PyNumber_Index(PyObject *o)
+
+- Returns the *o* converted to a Python int on success or *NULL* with a
++ Returns the *o* converted to a Python int on success or ``NULL`` with a
+ :exc:`TypeError` exception raised on failure.
+
+
+@@ -274,9 +274,9 @@ Number Protocol
+ If *o* can be converted to a Python int but the attempt to
+ convert to a Py_ssize_t value would raise an :exc:`OverflowError`, then the
+ *exc* argument is the type of exception that will be raised (usually
+- :exc:`IndexError` or :exc:`OverflowError`). If *exc* is *NULL*, then the
+- exception is cleared and the value is clipped to *PY_SSIZE_T_MIN* for a negative
+- integer or *PY_SSIZE_T_MAX* for a positive integer.
++ :exc:`IndexError` or :exc:`OverflowError`). If *exc* is ``NULL``, then the
++ exception is cleared and the value is clipped to ``PY_SSIZE_T_MIN`` for a negative
++ integer or ``PY_SSIZE_T_MAX`` for a positive integer.
+
+
+ .. c:function:: int PyIndex_Check(PyObject *o)
+diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst
+index 187a025a67..404a98fb41 100644
+--- a/Doc/c-api/object.rst
++++ b/Doc/c-api/object.rst
+@@ -53,14 +53,14 @@ Object Protocol
+ .. c:function:: PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name)
+
+ Retrieve an attribute named *attr_name* from object *o*. Returns the attribute
+- value on success, or *NULL* on failure. This is the equivalent of the Python
++ value on success, or ``NULL`` on failure. This is the equivalent of the Python
+ expression ``o.attr_name``.
+
+
+ .. c:function:: PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name)
+
+ Retrieve an attribute named *attr_name* from object *o*. Returns the attribute
+- value on success, or *NULL* on failure. This is the equivalent of the Python
++ value on success, or ``NULL`` on failure. This is the equivalent of the Python
+ expression ``o.attr_name``.
+
+
+@@ -81,7 +81,7 @@ Object Protocol
+ return ``0`` on success. This is the equivalent of the Python statement
+ ``o.attr_name = v``.
+
+- If *v* is *NULL*, the attribute is deleted, however this feature is
++ If *v* is ``NULL``, the attribute is deleted, however this feature is
+ deprecated in favour of using :c:func:`PyObject_DelAttr`.
+
+
+@@ -92,7 +92,7 @@ Object Protocol
+ return ``0`` on success. This is the equivalent of the Python statement
+ ``o.attr_name = v``.
+
+- If *v* is *NULL*, the attribute is deleted, however this feature is
++ If *v* is ``NULL``, the attribute is deleted, however this feature is
+ deprecated in favour of using :c:func:`PyObject_DelAttrString`.
+
+
+@@ -143,7 +143,7 @@ Object Protocol
+ :const:`Py_NE`, :const:`Py_GT`, or :const:`Py_GE`, corresponding to ``<``,
+ ``<=``, ``==``, ``!=``, ``>``, or ``>=`` respectively. This is the equivalent of
+ the Python expression ``o1 op o2``, where ``op`` is the operator corresponding
+- to *opid*. Returns the value of the comparison on success, or *NULL* on failure.
++ to *opid*. Returns the value of the comparison on success, or ``NULL`` on failure.
+
+
+ .. c:function:: int PyObject_RichCompareBool(PyObject *o1, PyObject *o2, int opid)
+@@ -165,7 +165,7 @@ Object Protocol
+ .. index:: builtin: repr
+
+ Compute a string representation of object *o*. Returns the string
+- representation on success, *NULL* on failure. This is the equivalent of the
++ representation on success, ``NULL`` on failure. This is the equivalent of the
+ Python expression ``repr(o)``. Called by the :func:`repr` built-in function.
+
+ .. versionchanged:: 3.4
+@@ -188,7 +188,7 @@ Object Protocol
+ .. c:function:: PyObject* PyObject_Str(PyObject *o)
+
+ Compute a string representation of object *o*. Returns the string
+- representation on success, *NULL* on failure. This is the equivalent of the
++ representation on success, ``NULL`` on failure. This is the equivalent of the
+ Python expression ``str(o)``. Called by the :func:`str` built-in function
+ and, therefore, by the :func:`print` function.
+
+@@ -200,7 +200,7 @@ Object Protocol
+
+ .. index:: builtin: bytes
+
+- Compute a bytes representation of object *o*. *NULL* is returned on
++ Compute a bytes representation of object *o*. ``NULL`` is returned on
+ failure and a bytes object on success. This is equivalent to the Python
+ expression ``bytes(o)``, when *o* is not an integer. Unlike ``bytes(o)``,
+ a TypeError is raised when *o* is an integer instead of a zero-initialized
+@@ -258,11 +258,11 @@ Object Protocol
+ Call a callable Python object *callable*, with arguments given by the
+ tuple *args*, and named arguments given by the dictionary *kwargs*.
+
+- *args* must not be *NULL*, use an empty tuple if no arguments are needed.
+- If no named arguments are needed, *kwargs* can be *NULL*.
++ *args* must not be ``NULL``, use an empty tuple if no arguments are needed.
++ If no named arguments are needed, *kwargs* can be ``NULL``.
+
+ Return the result of the call on success, or raise an exception and return
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+ This is the equivalent of the Python expression:
+ ``callable(*args, **kwargs)``.
+@@ -271,10 +271,10 @@ Object Protocol
+ .. c:function:: PyObject* PyObject_CallObject(PyObject *callable, PyObject *args)
+
+ Call a callable Python object *callable*, with arguments given by the
+- tuple *args*. If no arguments are needed, then *args* can be *NULL*.
++ tuple *args*. If no arguments are needed, then *args* can be ``NULL``.
+
+ Return the result of the call on success, or raise an exception and return
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+ This is the equivalent of the Python expression: ``callable(*args)``.
+
+@@ -283,10 +283,10 @@ Object Protocol
+
+ Call a callable Python object *callable*, with a variable number of C arguments.
+ The C arguments are described using a :c:func:`Py_BuildValue` style format
+- string. The format can be *NULL*, indicating that no arguments are provided.
++ string. The format can be ``NULL``, indicating that no arguments are provided.
+
+ Return the result of the call on success, or raise an exception and return
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+ This is the equivalent of the Python expression: ``callable(*args)``.
+
+@@ -303,10 +303,10 @@ Object Protocol
+ arguments. The C arguments are described by a :c:func:`Py_BuildValue` format
+ string that should produce a tuple.
+
+- The format can be *NULL*, indicating that no arguments are provided.
++ The format can be ``NULL``, indicating that no arguments are provided.
+
+ Return the result of the call on success, or raise an exception and return
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+ This is the equivalent of the Python expression:
+ ``obj.name(arg1, arg2, ...)``.
+@@ -322,10 +322,10 @@ Object Protocol
+
+ Call a callable Python object *callable*, with a variable number of
+ :c:type:`PyObject\*` arguments. The arguments are provided as a variable number
+- of parameters followed by *NULL*.
++ of parameters followed by ``NULL``.
+
+ Return the result of the call on success, or raise an exception and return
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+ This is the equivalent of the Python expression:
+ ``callable(arg1, arg2, ...)``.
+@@ -336,10 +336,10 @@ Object Protocol
+ Calls a method of the Python object *obj*, where the name of the method is given as a
+ Python string object in *name*. It is called with a variable number of
+ :c:type:`PyObject\*` arguments. The arguments are provided as a variable number
+- of parameters followed by *NULL*.
++ of parameters followed by ``NULL``.
+
+ Return the result of the call on success, or raise an exception and return
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+
+ .. c:function:: PyObject* _PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames)
+@@ -354,7 +354,7 @@ Object Protocol
+ To get actual number of arguments, use
+ :c:func:`PyVectorcall_NARGS(nargsf) <PyVectorcall_NARGS>`.
+
+- *kwnames* can be either NULL (no keyword arguments) or a tuple of keyword
++ *kwnames* can be either ``NULL`` (no keyword arguments) or a tuple of keyword
+ names. In the latter case, the values of the keyword arguments are stored
+ in *args* after the positional arguments.
+ The number of keyword arguments does not influence *nargsf*.
+@@ -363,7 +363,7 @@ Object Protocol
+ and all keys must be unique.
+
+ Return the result of the call on success, or raise an exception and return
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+ This uses the vectorcall protocol if the callable supports it;
+ otherwise, the arguments are converted to use
+@@ -402,7 +402,7 @@ Object Protocol
+ .. c:function:: PyObject* _PyObject_FastCallDict(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwdict)
+
+ Same as :c:func:`_PyObject_Vectorcall` except that the keyword arguments
+- are passed as a dictionary in *kwdict*. This may be *NULL* if there
++ are passed as a dictionary in *kwdict*. This may be ``NULL`` if there
+ are no keyword arguments.
+
+ For callables supporting :c:data:`vectorcall <PyTypeObject.tp_vectorcall_offset>`,
+@@ -458,8 +458,8 @@ Object Protocol
+
+ .. index:: builtin: type
+
+- When *o* is non-*NULL*, returns a type object corresponding to the object type
+- of object *o*. On failure, raises :exc:`SystemError` and returns *NULL*. This
++ When *o* is non-``NULL``, returns a type object corresponding to the object type
++ of object *o*. On failure, raises :exc:`SystemError` and returns ``NULL``. This
+ is equivalent to the Python expression ``type(o)``. This function increments the
+ reference count of the return value. There's really no reason to use this
+ function instead of the common expression ``o->ob_type``, which returns a
+@@ -470,7 +470,7 @@ Object Protocol
+ .. c:function:: int PyObject_TypeCheck(PyObject *o, PyTypeObject *type)
+
+ Return true if the object *o* is of type *type* or a subtype of *type*. Both
+- parameters must be non-*NULL*.
++ parameters must be non-``NULL``.
+
+
+ .. c:function:: Py_ssize_t PyObject_Size(PyObject *o)
+@@ -495,7 +495,7 @@ Object Protocol
+
+ .. c:function:: PyObject* PyObject_GetItem(PyObject *o, PyObject *key)
+
+- Return element of *o* corresponding to the object *key* or *NULL* on failure.
++ Return element of *o* corresponding to the object *key* or ``NULL`` on failure.
+ This is the equivalent of the Python expression ``o[key]``.
+
+
+@@ -515,15 +515,15 @@ Object Protocol
+ .. c:function:: PyObject* PyObject_Dir(PyObject *o)
+
+ This is equivalent to the Python expression ``dir(o)``, returning a (possibly
+- empty) list of strings appropriate for the object argument, or *NULL* if there
+- was an error. If the argument is *NULL*, this is like the Python ``dir()``,
++ empty) list of strings appropriate for the object argument, or ``NULL`` if there
++ was an error. If the argument is ``NULL``, this is like the Python ``dir()``,
+ returning the names of the current locals; in this case, if no execution frame
+- is active then *NULL* is returned but :c:func:`PyErr_Occurred` will return false.
++ is active then ``NULL`` is returned but :c:func:`PyErr_Occurred` will return false.
+
+
+ .. c:function:: PyObject* PyObject_GetIter(PyObject *o)
+
+ This is equivalent to the Python expression ``iter(o)``. It returns a new
+ iterator for the object argument, or the object itself if the object is already
+- an iterator. Raises :exc:`TypeError` and returns *NULL* if the object cannot be
++ an iterator. Raises :exc:`TypeError` and returns ``NULL`` if the object cannot be
+ iterated.
+diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst
+index 6b07c87d62..0df12c67f4 100644
+--- a/Doc/c-api/refcounting.rst
++++ b/Doc/c-api/refcounting.rst
+@@ -13,22 +13,22 @@ objects.
+
+ .. c:function:: void Py_INCREF(PyObject *o)
+
+- Increment the reference count for object *o*. The object must not be *NULL*; if
+- you aren't sure that it isn't *NULL*, use :c:func:`Py_XINCREF`.
++ Increment the reference count for object *o*. The object must not be ``NULL``; if
++ you aren't sure that it isn't ``NULL``, use :c:func:`Py_XINCREF`.
+
+
+ .. c:function:: void Py_XINCREF(PyObject *o)
+
+- Increment the reference count for object *o*. The object may be *NULL*, in
++ Increment the reference count for object *o*. The object may be ``NULL``, in
+ which case the macro has no effect.
+
+
+ .. c:function:: void Py_DECREF(PyObject *o)
+
+- Decrement the reference count for object *o*. The object must not be *NULL*; if
+- you aren't sure that it isn't *NULL*, use :c:func:`Py_XDECREF`. If the reference
++ Decrement the reference count for object *o*. The object must not be ``NULL``; if
++ you aren't sure that it isn't ``NULL``, use :c:func:`Py_XDECREF`. If the reference
+ count reaches zero, the object's type's deallocation function (which must not be
+- *NULL*) is invoked.
++ ``NULL``) is invoked.
+
+ .. warning::
+
+@@ -44,18 +44,18 @@ objects.
+
+ .. c:function:: void Py_XDECREF(PyObject *o)
+
+- Decrement the reference count for object *o*. The object may be *NULL*, in
++ Decrement the reference count for object *o*. The object may be ``NULL``, in
+ which case the macro has no effect; otherwise the effect is the same as for
+ :c:func:`Py_DECREF`, and the same warning applies.
+
+
+ .. c:function:: void Py_CLEAR(PyObject *o)
+
+- Decrement the reference count for object *o*. The object may be *NULL*, in
++ Decrement the reference count for object *o*. The object may be ``NULL``, in
+ which case the macro has no effect; otherwise the effect is the same as for
+- :c:func:`Py_DECREF`, except that the argument is also set to *NULL*. The warning
++ :c:func:`Py_DECREF`, except that the argument is also set to ``NULL``. The warning
+ for :c:func:`Py_DECREF` does not apply with respect to the object passed because
+- the macro carefully uses a temporary variable and sets the argument to *NULL*
++ the macro carefully uses a temporary variable and sets the argument to ``NULL``
+ before decrementing its reference count.
+
+ It is a good idea to use this macro whenever decrementing the reference
+diff --git a/Doc/c-api/reflection.rst b/Doc/c-api/reflection.rst
+index 080ea3222c..1d86de66ed 100644
+--- a/Doc/c-api/reflection.rst
++++ b/Doc/c-api/reflection.rst
+@@ -14,18 +14,18 @@ Reflection
+ .. c:function:: PyObject* PyEval_GetLocals()
+
+ Return a dictionary of the local variables in the current execution frame,
+- or *NULL* if no frame is currently executing.
++ or ``NULL`` if no frame is currently executing.
+
+
+ .. c:function:: PyObject* PyEval_GetGlobals()
+
+ Return a dictionary of the global variables in the current execution frame,
+- or *NULL* if no frame is currently executing.
++ or ``NULL`` if no frame is currently executing.
+
+
+ .. c:function:: PyFrameObject* PyEval_GetFrame()
+
+- Return the current thread state's frame, which is *NULL* if no frame is
++ Return the current thread state's frame, which is ``NULL`` if no frame is
+ currently executing.
+
+
+diff --git a/Doc/c-api/sequence.rst b/Doc/c-api/sequence.rst
+index fe1c252ce9..6581885904 100644
+--- a/Doc/c-api/sequence.rst
++++ b/Doc/c-api/sequence.rst
+@@ -26,39 +26,39 @@ Sequence Protocol
+
+ .. c:function:: PyObject* PySequence_Concat(PyObject *o1, PyObject *o2)
+
+- Return the concatenation of *o1* and *o2* on success, and *NULL* on failure.
++ Return the concatenation of *o1* and *o2* on success, and ``NULL`` on failure.
+ This is the equivalent of the Python expression ``o1 + o2``.
+
+
+ .. c:function:: PyObject* PySequence_Repeat(PyObject *o, Py_ssize_t count)
+
+- Return the result of repeating sequence object *o* *count* times, or *NULL* on
++ Return the result of repeating sequence object *o* *count* times, or ``NULL`` on
+ failure. This is the equivalent of the Python expression ``o * count``.
+
+
+ .. c:function:: PyObject* PySequence_InPlaceConcat(PyObject *o1, PyObject *o2)
+
+- Return the concatenation of *o1* and *o2* on success, and *NULL* on failure.
++ Return the concatenation of *o1* and *o2* on success, and ``NULL`` on failure.
+ The operation is done *in-place* when *o1* supports it. This is the equivalent
+ of the Python expression ``o1 += o2``.
+
+
+ .. c:function:: PyObject* PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
+
+- Return the result of repeating sequence object *o* *count* times, or *NULL* on
++ Return the result of repeating sequence object *o* *count* times, or ``NULL`` on
+ failure. The operation is done *in-place* when *o* supports it. This is the
+ equivalent of the Python expression ``o *= count``.
+
+
+ .. c:function:: PyObject* PySequence_GetItem(PyObject *o, Py_ssize_t i)
+
+- Return the *i*\ th element of *o*, or *NULL* on failure. This is the equivalent of
++ Return the *i*\ th element of *o*, or ``NULL`` on failure. This is the equivalent of
+ the Python expression ``o[i]``.
+
+
+ .. c:function:: PyObject* PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
+
+- Return the slice of sequence object *o* between *i1* and *i2*, or *NULL* on
++ Return the slice of sequence object *o* between *i1* and *i2*, or ``NULL`` on
+ failure. This is the equivalent of the Python expression ``o[i1:i2]``.
+
+
+@@ -69,7 +69,7 @@ Sequence Protocol
+ is the equivalent of the Python statement ``o[i] = v``. This function *does
+ not* steal a reference to *v*.
+
+- If *v* is *NULL*, the element is deleted, however this feature is
++ If *v* is ``NULL``, the element is deleted, however this feature is
+ deprecated in favour of using :c:func:`PySequence_DelItem`.
+
+
+@@ -114,7 +114,7 @@ Sequence Protocol
+ .. c:function:: PyObject* PySequence_List(PyObject *o)
+
+ Return a list object with the same contents as the sequence or iterable *o*,
+- or *NULL* on failure. The returned list is guaranteed to be new. This is
++ or ``NULL`` on failure. The returned list is guaranteed to be new. This is
+ equivalent to the Python expression ``list(o)``.
+
+
+@@ -123,7 +123,7 @@ Sequence Protocol
+ .. index:: builtin: tuple
+
+ Return a tuple object with the same contents as the sequence or iterable *o*,
+- or *NULL* on failure. If *o* is a tuple, a new reference will be returned,
++ or ``NULL`` on failure. If *o* is a tuple, a new reference will be returned,
+ otherwise a tuple will be constructed with the appropriate contents. This is
+ equivalent to the Python expression ``tuple(o)``.
+
+@@ -133,7 +133,7 @@ Sequence Protocol
+ Return the sequence or iterable *o* as an object usable by the other
+ ``PySequence_Fast*`` family of functions. If the object is not a sequence or
+ iterable, raises :exc:`TypeError` with *m* as the message text. Returns
+- *NULL* on failure.
++ ``NULL`` on failure.
+
+ The ``PySequence_Fast*`` functions are thus named because they assume
+ *o* is a :c:type:`PyTupleObject` or a :c:type:`PyListObject` and access
+@@ -146,7 +146,7 @@ Sequence Protocol
+ .. c:function:: Py_ssize_t PySequence_Fast_GET_SIZE(PyObject *o)
+
+ Returns the length of *o*, assuming that *o* was returned by
+- :c:func:`PySequence_Fast` and that *o* is not *NULL*. The size can also be
++ :c:func:`PySequence_Fast` and that *o* is not ``NULL``. The size can also be
+ gotten by calling :c:func:`PySequence_Size` on *o*, but
+ :c:func:`PySequence_Fast_GET_SIZE` is faster because it can assume *o* is a
+ list or tuple.
+@@ -155,13 +155,13 @@ Sequence Protocol
+ .. c:function:: PyObject* PySequence_Fast_GET_ITEM(PyObject *o, Py_ssize_t i)
+
+ Return the *i*\ th element of *o*, assuming that *o* was returned by
+- :c:func:`PySequence_Fast`, *o* is not *NULL*, and that *i* is within bounds.
++ :c:func:`PySequence_Fast`, *o* is not ``NULL``, and that *i* is within bounds.
+
+
+ .. c:function:: PyObject** PySequence_Fast_ITEMS(PyObject *o)
+
+ Return the underlying array of PyObject pointers. Assumes that *o* was returned
+- by :c:func:`PySequence_Fast` and *o* is not *NULL*.
++ by :c:func:`PySequence_Fast` and *o* is not ``NULL``.
+
+ Note, if a list gets resized, the reallocation may relocate the items array.
+ So, only use the underlying array pointer in contexts where the sequence
+@@ -170,7 +170,7 @@ Sequence Protocol
+
+ .. c:function:: PyObject* PySequence_ITEM(PyObject *o, Py_ssize_t i)
+
+- Return the *i*\ th element of *o* or *NULL* on failure. Faster form of
++ Return the *i*\ th element of *o* or ``NULL`` on failure. Faster form of
+ :c:func:`PySequence_GetItem` but without checking that
+ :c:func:`PySequence_Check` on *o* is true and without adjustment for negative
+ indices.
+diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst
+index 074fcb877e..54819e8fd6 100644
+--- a/Doc/c-api/set.rst
++++ b/Doc/c-api/set.rst
+@@ -80,8 +80,8 @@ the constructor functions work with any iterable Python object.
+ .. c:function:: PyObject* PySet_New(PyObject *iterable)
+
+ Return a new :class:`set` containing objects returned by the *iterable*. The
+- *iterable* may be *NULL* to create a new empty set. Return the new set on
+- success or *NULL* on failure. Raise :exc:`TypeError` if *iterable* is not
++ *iterable* may be ``NULL`` to create a new empty set. Return the new set on
++ success or ``NULL`` on failure. Raise :exc:`TypeError` if *iterable* is not
+ actually iterable. The constructor is also useful for copying a set
+ (``c=set(s)``).
+
+@@ -89,8 +89,8 @@ the constructor functions work with any iterable Python object.
+ .. c:function:: PyObject* PyFrozenSet_New(PyObject *iterable)
+
+ Return a new :class:`frozenset` containing objects returned by the *iterable*.
+- The *iterable* may be *NULL* to create a new empty frozenset. Return the new
+- set on success or *NULL* on failure. Raise :exc:`TypeError` if *iterable* is
++ The *iterable* may be ``NULL`` to create a new empty frozenset. Return the new
++ set on success or ``NULL`` on failure. Raise :exc:`TypeError` if *iterable* is
+ not actually iterable.
+
+
+@@ -149,7 +149,7 @@ subtypes but not for instances of :class:`frozenset` or its subtypes.
+ .. c:function:: PyObject* PySet_Pop(PyObject *set)
+
+ Return a new reference to an arbitrary object in the *set*, and removes the
+- object from the *set*. Return *NULL* on failure. Raise :exc:`KeyError` if the
++ object from the *set*. Return ``NULL`` on failure. Raise :exc:`KeyError` if the
+ set is empty. Raise a :exc:`SystemError` if *set* is not an instance of
+ :class:`set` or its subtype.
+
+diff --git a/Doc/c-api/slice.rst b/Doc/c-api/slice.rst
+index d924308890..48a58c6c6f 100644
+--- a/Doc/c-api/slice.rst
++++ b/Doc/c-api/slice.rst
+@@ -14,15 +14,15 @@ Slice Objects
+
+ .. c:function:: int PySlice_Check(PyObject *ob)
+
+- Return true if *ob* is a slice object; *ob* must not be *NULL*.
++ Return true if *ob* is a slice object; *ob* must not be ``NULL``.
+
+
+ .. c:function:: PyObject* PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
+
+ Return a new slice object with the given values. The *start*, *stop*, and
+ *step* parameters are used as the values of the slice object attributes of
+- the same names. Any of the values may be *NULL*, in which case the
+- ``None`` will be used for the corresponding attribute. Return *NULL* if
++ the same names. Any of the values may be ``NULL``, in which case the
++ ``None`` will be used for the corresponding attribute. Return ``NULL`` if
+ the new object could not be allocated.
+
+
+diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst
+index 5184ad511c..2dc0762ee7 100644
+--- a/Doc/c-api/structures.rst
++++ b/Doc/c-api/structures.rst
+@@ -106,8 +106,8 @@ the definition of all other Python objects.
+
+ Type of the functions used to implement most Python callables in C.
+ Functions of this type take two :c:type:`PyObject\*` parameters and return
+- one such value. If the return value is *NULL*, an exception shall have
+- been set. If not *NULL*, the return value is interpreted as the return
++ one such value. If the return value is ``NULL``, an exception shall have
++ been set. If not ``NULL``, the return value is interpreted as the return
+ value of the function as exposed in Python. The function must return a new
+ reference.
+
+@@ -179,7 +179,7 @@ also keyword arguments. So there are a total of 6 calling conventions:
+
+ Methods with these flags must be of type :c:type:`PyCFunctionWithKeywords`.
+ The function expects three parameters: *self*, *args*, *kwargs* where
+- *kwargs* is a dictionary of all the keyword arguments or possibly *NULL*
++ *kwargs* is a dictionary of all the keyword arguments or possibly ``NULL``
+ if there are no keyword arguments. The parameters are typically processed
+ using :c:func:`PyArg_ParseTupleAndKeywords`.
+
+@@ -204,7 +204,7 @@ also keyword arguments. So there are a total of 6 calling conventions:
+ Keyword arguments are passed the same way as in the vectorcall protocol:
+ there is an additional fourth :c:type:`PyObject\*` parameter
+ which is a tuple representing the names of the keyword arguments
+- or possibly *NULL* if there are no keywords. The values of the keyword
++ or possibly ``NULL`` if there are no keywords. The values of the keyword
+ arguments are stored in the *args* array, after the positional arguments.
+
+ This is not part of the :ref:`limited API <stable>`.
+@@ -218,7 +218,7 @@ also keyword arguments. So there are a total of 6 calling conventions:
+ they are listed with the :const:`METH_NOARGS` flag. They need to be of type
+ :c:type:`PyCFunction`. The first parameter is typically named *self* and will
+ hold a reference to the module or object instance. In all cases the second
+- parameter will be *NULL*.
++ parameter will be ``NULL``.
+
+
+ .. data:: METH_O
+@@ -249,7 +249,7 @@ method.
+
+ .. index:: builtin: staticmethod
+
+- The method will be passed *NULL* as the first parameter rather than an
++ The method will be passed ``NULL`` as the first parameter rather than an
+ instance of the type. This is used to create *static methods*, similar to
+ what is created when using the :func:`staticmethod` built-in function.
+
+@@ -323,7 +323,7 @@ definition with the same method name.
+ =============== ==================
+
+ :c:macro:`T_OBJECT` and :c:macro:`T_OBJECT_EX` differ in that
+- :c:macro:`T_OBJECT` returns ``None`` if the member is *NULL* and
++ :c:macro:`T_OBJECT` returns ``None`` if the member is ``NULL`` and
+ :c:macro:`T_OBJECT_EX` raises an :exc:`AttributeError`. Try to use
+ :c:macro:`T_OBJECT_EX` over :c:macro:`T_OBJECT` because :c:macro:`T_OBJECT_EX`
+ handles use of the :keyword:`del` statement on that attribute more correctly
+@@ -333,7 +333,7 @@ definition with the same method name.
+ read-only access. Using :c:macro:`T_STRING` for :attr:`type` implies
+ :c:macro:`READONLY`. :c:macro:`T_STRING` data is interpreted as UTF-8.
+ Only :c:macro:`T_OBJECT` and :c:macro:`T_OBJECT_EX`
+- members can be deleted. (They are set to *NULL*).
++ members can be deleted. (They are set to ``NULL``).
+
+
+ .. c:type:: PyGetSetDef
+@@ -364,7 +364,7 @@ definition with the same method name.
+
+ typedef PyObject *(*getter)(PyObject *, void *);
+
+- It should return a new reference on success or *NULL* with a set exception
++ It should return a new reference on success or ``NULL`` with a set exception
+ on failure.
+
+ ``set`` functions take two :c:type:`PyObject\*` parameters (the instance and
+@@ -372,5 +372,5 @@ definition with the same method name.
+
+ typedef int (*setter)(PyObject *, PyObject *, void *);
+
+- In case the attribute should be deleted the second parameter is *NULL*.
++ In case the attribute should be deleted the second parameter is ``NULL``.
+ Should return ``0`` on success or ``-1`` with a set exception on failure.
+diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst
+index 838a97cacf..d3bbee23f5 100644
+--- a/Doc/c-api/sys.rst
++++ b/Doc/c-api/sys.rst
+@@ -22,7 +22,7 @@ Operating System Utilities
+ Return true (nonzero) if the standard I/O file *fp* with name *filename* is
+ deemed interactive. This is the case for files for which ``isatty(fileno(fp))``
+ is true. If the global flag :c:data:`Py_InteractiveFlag` is true, this function
+- also returns true if the *filename* pointer is *NULL* or if the name is equal to
++ also returns true if the *filename* pointer is ``NULL`` or if the name is equal to
+ one of the strings ``'<stdin>'`` or ``'???'``.
+
+
+@@ -33,6 +33,12 @@ Operating System Utilities
+ that clones the current process.
+ Only available on systems where :c:func:`fork` is defined.
+
++ .. warning::
++ The C :c:func:`fork` call should only be made from the
++ :ref:`"main" thread <fork-and-threads>` (of the
++ :ref:`"main" interpreter <sub-interpreter-support>`). The same is
++ true for ``PyOS_BeforeFork()``.
++
+ .. versionadded:: 3.7
+
+
+@@ -44,6 +50,12 @@ Operating System Utilities
+ of whether process cloning was successful.
+ Only available on systems where :c:func:`fork` is defined.
+
++ .. warning::
++ The C :c:func:`fork` call should only be made from the
++ :ref:`"main" thread <fork-and-threads>` (of the
++ :ref:`"main" interpreter <sub-interpreter-support>`). The same is
++ true for ``PyOS_AfterFork_Parent()``.
++
+ .. versionadded:: 3.7
+
+
+@@ -55,6 +67,12 @@ Operating System Utilities
+ any chance the process will call back into the Python interpreter.
+ Only available on systems where :c:func:`fork` is defined.
+
++ .. warning::
++ The C :c:func:`fork` call should only be made from the
++ :ref:`"main" thread <fork-and-threads>` (of the
++ :ref:`"main" interpreter <sub-interpreter-support>`). The same is
++ true for ``PyOS_AfterFork_Child()``.
++
+ .. versionadded:: 3.7
+
+ .. seealso::
+@@ -201,12 +219,12 @@ accessible to C code. They all work with the current interpreter thread's
+
+ .. c:function:: PyObject *PySys_GetObject(const char *name)
+
+- Return the object *name* from the :mod:`sys` module or *NULL* if it does
++ Return the object *name* from the :mod:`sys` module or ``NULL`` if it does
+ not exist, without setting an exception.
+
+ .. c:function:: int PySys_SetObject(const char *name, PyObject *v)
+
+- Set *name* in the :mod:`sys` module to *v* unless *v* is *NULL*, in which
++ Set *name* in the :mod:`sys` module to *v* unless *v* is ``NULL``, in which
+ case *name* is deleted from the sys module. Returns ``0`` on success, ``-1``
+ on error.
+
+@@ -283,7 +301,7 @@ accessible to C code. They all work with the current interpreter thread's
+ .. c:function:: PyObject *PySys_GetXOptions()
+
+ Return the current dictionary of :option:`-X` options, similarly to
+- :data:`sys._xoptions`. On error, *NULL* is returned and an exception is
++ :data:`sys._xoptions`. On error, ``NULL`` is returned and an exception is
+ set.
+
+ .. versionadded:: 3.2
+@@ -330,7 +348,16 @@ accessible to C code. They all work with the current interpreter thread's
+
+ See :pep:`578` for a detailed description of auditing. Functions in the
+ runtime and standard library that raise events include the details in each
+- function's documentation.
++ function's documentation and listed in the :ref:`audit events table
++ <audit-events>`.
++
++ .. audit-event:: sys.addaudithook "" c.PySys_AddAuditHook
++
++ If the interpreter is initialized, this function raises a auditing event
++ ``sys.addaudithook`` with no arguments. If any existing hooks raise an
++ exception derived from :class:`Exception`, the new hook will not be
++ added and the exception is cleared. As a result, callers cannot assume
++ that their hook has been added unless they control all existing hooks.
+
+ .. versionadded:: 3.8
+
+diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst
+index 259ec4fb48..25df3974e8 100644
+--- a/Doc/c-api/tuple.rst
++++ b/Doc/c-api/tuple.rst
+@@ -33,12 +33,12 @@ Tuple Objects
+
+ .. c:function:: PyObject* PyTuple_New(Py_ssize_t len)
+
+- Return a new tuple object of size *len*, or *NULL* on failure.
++ Return a new tuple object of size *len*, or ``NULL`` on failure.
+
+
+ .. c:function:: PyObject* PyTuple_Pack(Py_ssize_t n, ...)
+
+- Return a new tuple object of size *n*, or *NULL* on failure. The tuple values
++ Return a new tuple object of size *n*, or ``NULL`` on failure. The tuple values
+ are initialized to the subsequent *n* C arguments pointing to Python objects.
+ ``PyTuple_Pack(2, a, b)`` is equivalent to ``Py_BuildValue("(OO)", a, b)``.
+
+@@ -50,14 +50,14 @@ Tuple Objects
+
+ .. c:function:: Py_ssize_t PyTuple_GET_SIZE(PyObject *p)
+
+- Return the size of the tuple *p*, which must be non-*NULL* and point to a tuple;
++ Return the size of the tuple *p*, which must be non-``NULL`` and point to a tuple;
+ no error checking is performed.
+
+
+ .. c:function:: PyObject* PyTuple_GetItem(PyObject *p, Py_ssize_t pos)
+
+ Return the object at position *pos* in the tuple pointed to by *p*. If *pos* is
+- out of bounds, return *NULL* and sets an :exc:`IndexError` exception.
++ out of bounds, return ``NULL`` and set an :exc:`IndexError` exception.
+
+
+ .. c:function:: PyObject* PyTuple_GET_ITEM(PyObject *p, Py_ssize_t pos)
+@@ -67,18 +67,21 @@ Tuple Objects
+
+ .. c:function:: PyObject* PyTuple_GetSlice(PyObject *p, Py_ssize_t low, Py_ssize_t high)
+
+- Take a slice of the tuple pointed to by *p* from *low* to *high* and return it
+- as a new tuple.
++ Return the slice of the tuple pointed to by *p* between *low* and *high*,
++ or ``NULL`` on failure. This is the equivalent of the Python expression
++ ``p[low:high]``. Indexing from the end of the list is not supported.
+
+
+ .. c:function:: int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)
+
+ Insert a reference to object *o* at position *pos* of the tuple pointed to by
+- *p*. Return ``0`` on success.
++ *p*. Return ``0`` on success. If *pos* is out of bounds, return ``-1``
++ and set an :exc:`IndexError` exception.
+
+ .. note::
+
+- This function "steals" a reference to *o*.
++ This function "steals" a reference to *o* and discards a reference to
++ an item already in the tuple at the affected position.
+
+
+ .. c:function:: void PyTuple_SET_ITEM(PyObject *p, Py_ssize_t pos, PyObject *o)
+@@ -88,7 +91,10 @@ Tuple Objects
+
+ .. note::
+
+- This function "steals" a reference to *o*.
++ This macro "steals" a reference to *o*, and, unlike
++ :c:func:`PyTuple_SetItem`, does *not* discard a reference to any item that
++ is being replaced; any reference in the tuple at position *pos* will be
++ leaked.
+
+
+ .. c:function:: int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize)
+@@ -101,7 +107,7 @@ Tuple Objects
+ only more efficiently. Returns ``0`` on success. Client code should never
+ assume that the resulting value of ``*p`` will be the same as before calling
+ this function. If the object referenced by ``*p`` is replaced, the original
+- ``*p`` is destroyed. On failure, returns ``-1`` and sets ``*p`` to *NULL*, and
++ ``*p`` is destroyed. On failure, returns ``-1`` and sets ``*p`` to ``NULL``, and
+ raises :exc:`MemoryError` or :exc:`SystemError`.
+
+
+@@ -141,20 +147,20 @@ type.
+
+ Contains the meta information of a struct sequence type to create.
+
+- +-------------------+------------------------------+------------------------------------+
+- | Field | C Type | Meaning |
+- +===================+==============================+====================================+
+- | ``name`` | ``const char *`` | name of the struct sequence type |
+- +-------------------+------------------------------+------------------------------------+
+- | ``doc`` | ``const char *`` | pointer to docstring for the type |
+- | | | or NULL to omit |
+- +-------------------+------------------------------+------------------------------------+
+- | ``fields`` | ``PyStructSequence_Field *`` | pointer to *NULL*-terminated array |
+- | | | with field names of the new type |
+- +-------------------+------------------------------+------------------------------------+
+- | ``n_in_sequence`` | ``int`` | number of fields visible to the |
+- | | | Python side (if used as tuple) |
+- +-------------------+------------------------------+------------------------------------+
++ +-------------------+------------------------------+--------------------------------------+
++ | Field | C Type | Meaning |
++ +===================+==============================+======================================+
++ | ``name`` | ``const char *`` | name of the struct sequence type |
++ +-------------------+------------------------------+--------------------------------------+
++ | ``doc`` | ``const char *`` | pointer to docstring for the type |
++ | | | or ``NULL`` to omit |
++ +-------------------+------------------------------+--------------------------------------+
++ | ``fields`` | ``PyStructSequence_Field *`` | pointer to ``NULL``-terminated array |
++ | | | with field names of the new type |
++ +-------------------+------------------------------+--------------------------------------+
++ | ``n_in_sequence`` | ``int`` | number of fields visible to the |
++ | | | Python side (if used as tuple) |
++ +-------------------+------------------------------+--------------------------------------+
+
+
+ .. c:type:: PyStructSequence_Field
+@@ -164,16 +170,16 @@ type.
+ :attr:`fields` array of the :c:type:`PyStructSequence_Desc` determines which
+ field of the struct sequence is described.
+
+- +-----------+------------------+--------------------------------------+
+- | Field | C Type | Meaning |
+- +===========+==================+======================================+
+- | ``name`` | ``const char *`` | name for the field or *NULL* to end |
+- | | | the list of named fields, set to |
+- | | | PyStructSequence_UnnamedField to |
+- | | | leave unnamed |
+- +-----------+------------------+--------------------------------------+
+- | ``doc`` | ``const char *`` | field docstring or *NULL* to omit |
+- +-----------+------------------+--------------------------------------+
++ +-----------+------------------+-----------------------------------------+
++ | Field | C Type | Meaning |
++ +===========+==================+=========================================+
++ | ``name`` | ``const char *`` | name for the field or ``NULL`` to end |
++ | | | the list of named fields, set to |
++ | | | :c:data:`PyStructSequence_UnnamedField` |
++ | | | to leave unnamed |
++ +-----------+------------------+-----------------------------------------+
++ | ``doc`` | ``const char *`` | field docstring or ``NULL`` to omit |
++ +-----------+------------------+-----------------------------------------+
+
+
+ .. c:var:: char* PyStructSequence_UnnamedField
+diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst
+index 239355a802..dcdec5329b 100644
+--- a/Doc/c-api/type.rst
++++ b/Doc/c-api/type.rst
+@@ -81,7 +81,7 @@ Type Objects
+
+ Generic handler for the :c:member:`~PyTypeObject.tp_alloc` slot of a type object. Use
+ Python's default memory allocation mechanism to allocate a new instance and
+- initialize all its contents to *NULL*.
++ initialize all its contents to ``NULL``.
+
+ .. c:function:: PyObject* PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
+
+@@ -98,7 +98,7 @@ Type Objects
+ .. c:function:: void* PyType_GetSlot(PyTypeObject *type, int slot)
+
+ Return the function pointer stored in the given slot. If the
+- result is *NULL*, this indicates that either the slot is *NULL*,
++ result is ``NULL``, this indicates that either the slot is ``NULL``,
+ or that the function was called with invalid parameters.
+ Callers will typically cast the result pointer into the appropriate
+ function type.
+@@ -124,8 +124,8 @@ The following functions and structs are used to create
+ If *bases* is a tuple, the created heap type contains all types contained
+ in it as base types.
+
+- If *bases* is *NULL*, the *Py_tp_base* slot is used instead.
+- If that also is *NULL*, the new type derives from :class:`object`.
++ If *bases* is ``NULL``, the *Py_tp_base* slot is used instead.
++ If that also is ``NULL``, the new type derives from :class:`object`.
+
+ This function calls :c:func:`PyType_Ready` on the new type.
+
+@@ -181,7 +181,7 @@ The following functions and structs are used to create
+ * ``Py_nb_add`` to set :c:member:`PyNumberMethods.nb_add`
+ * ``Py_sq_length`` to set :c:member:`PySequenceMethods.sq_length`
+
+- The following fields cannot be set using *PyType_Spec* and *PyType_Slot*:
++ The following fields cannot be set using :c:type:`PyType_Spec` and :c:type:`PyType_Slot`:
+
+ * :c:member:`~PyTypeObject.tp_dict`
+ * :c:member:`~PyTypeObject.tp_mro`
+@@ -203,4 +203,4 @@ The following functions and structs are used to create
+ The desired value of the slot. In most cases, this is a pointer
+ to a function.
+
+- May not be *NULL*.
++ May not be ``NULL``.
+diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst
+index bb76750074..bff5abfea4 100644
+--- a/Doc/c-api/typeobj.rst
++++ b/Doc/c-api/typeobj.rst
+@@ -159,20 +159,20 @@ fields exist as well:
+ A slot name in parentheses indicates it is (effectively) deprecated.
+ Names in angle brackets should be treated as read-only.
+ Names in square brackets are for internal use only.
+- "<R>" (as a prefix) means the field is required (must be non-*NULL*).
++ "<R>" (as a prefix) means the field is required (must be non-``NULL``).
+ .. [#cols] Columns:
+
+ **"O"**: set on :c:type:`PyBaseObject_Type`
+
+ **"T"**: set on :c:type:`PyType_Type`
+
+- **"D"**: default (if slot is set to *NULL*)
++ **"D"**: default (if slot is set to ``NULL``)
+
+ .. code-block:: none
+
+- X - *PyType_Ready* sets this value if it is *NULL*
+- ~ - *PyType_Ready* always sets this value (it should be *NULL*)
+- ? - *PyType_Ready* may set this value depending on other slots
++ X - PyType_Ready sets this value if it is NULL
++ ~ - PyType_Ready always sets this value (it should be NULL)
++ ? - PyType_Ready may set this value depending on other slots
+
+ Also see the inheritance column ("I").
+
+@@ -180,7 +180,7 @@ fields exist as well:
+
+ .. code-block:: none
+
+- X - type slot is inherited via *PyType_Ready* if defined with a *NULL* value
++ X - type slot is inherited via PyType_Ready if defined with a NULL value
+ % - the slots of the sub-struct are inherited individually
+ G - inherited, but only in combination with other slots; see the slot's description
+ ? - it's complicated; see the slot's description
+@@ -491,8 +491,8 @@ type objects) *must* have the :attr:`ob_size` field.
+ PyObject* PyObject._ob_prev
+
+ These fields are only present when the macro ``Py_TRACE_REFS`` is defined.
+- Their initialization to *NULL* is taken care of by the ``PyObject_HEAD_INIT``
+- macro. For statically allocated objects, these fields always remain *NULL*.
++ Their initialization to ``NULL`` is taken care of by the ``PyObject_HEAD_INIT``
++ macro. For statically allocated objects, these fields always remain ``NULL``.
+ For dynamically allocated objects, these two fields are used to link the object
+ into a doubly-linked list of *all* live objects on the heap. This could be used
+ for various debugging purposes; currently the only use is to print the objects
+@@ -523,7 +523,7 @@ type objects) *must* have the :attr:`ob_size` field.
+ argument to the ``PyObject_HEAD_INIT`` macro, and its value should normally be
+ ``&PyType_Type``. However, for dynamically loadable extension modules that must
+ be usable on Windows (at least), the compiler complains that this is not a valid
+- initializer. Therefore, the convention is to pass *NULL* to the
++ initializer. Therefore, the convention is to pass ``NULL`` to the
+ ``PyObject_HEAD_INIT`` macro and to initialize this field explicitly at the
+ start of the module's initialization function, before doing anything else. This
+ is typically done like this::
+@@ -531,7 +531,7 @@ type objects) *must* have the :attr:`ob_size` field.
+ Foo_Type.ob_type = &PyType_Type;
+
+ This should be done before any instances of the type are created.
+- :c:func:`PyType_Ready` checks if :attr:`ob_type` is *NULL*, and if so,
++ :c:func:`PyType_Ready` checks if :attr:`ob_type` is ``NULL``, and if so,
+ initializes it to the :attr:`ob_type` field of the base class.
+ :c:func:`PyType_Ready` will not change this field if it is non-zero.
+
+@@ -557,7 +557,7 @@ PyTypeObject Slots
+ ------------------
+
+ Each slot has a section describing inheritance. If :c:func:`PyType_Ready`
+-may set a value when the field is set to *NULL* then there will also be
++may set a value when the field is set to ``NULL`` then there will also be
+ a "Default" section. (Note that many fields set on :c:type:`PyBaseObject_Type`
+ and :c:type:`PyType_Type` effectively act as defaults.)
+
+@@ -586,7 +586,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ type will be impossible to pickle. Additionally, it will not be listed in
+ module documentations created with pydoc.
+
+- This field must not be *NULL*. It is the only required field
++ This field must not be ``NULL``. It is the only required field
+ in :c:func:`PyTypeObject` (other than potentially
+ :c:member:`~PyTypeObject.tp_itemsize`).
+
+@@ -631,7 +631,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ :c:member:`~PyTypeObject.tp_basicsize` is a multiple of ``sizeof(double)`` (assuming this is the
+ alignment requirement for ``double``).
+
+- For any type with variable-length instances, this field must not be *NULL*.
++ For any type with variable-length instances, this field must not be ``NULL``.
+
+ **Inheritance:**
+
+@@ -740,7 +740,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ This field is inherited by subtypes together with
+ :c:member:`~PyTypeObject.tp_call`: a subtype inherits
+ :c:member:`~PyTypeObject.tp_vectorcall_offset` from its base type when
+- the subtype’s :c:member:`~PyTypeObject.tp_call` is NULL.
++ the subtype’s :c:member:`~PyTypeObject.tp_call` is ``NULL``.
+
+ Note that `heap types`_ (including subclasses defined in Python) do not
+ inherit the :const:`_Py_TPFLAGS_HAVE_VECTORCALL` flag.
+@@ -760,7 +760,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_getattro`: a subtype
+ inherits both :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` from its base type when
+- the subtype's :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` are both *NULL*.
++ the subtype's :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` are both ``NULL``.
+
+
+ .. c:member:: setattrfunc PyTypeObject.tp_setattr
+@@ -777,7 +777,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_setattro`: a subtype
+ inherits both :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` from its base type when
+- the subtype's :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` are both *NULL*.
++ the subtype's :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` are both ``NULL``.
+
+
+ .. c:member:: PyAsyncMethods* PyTypeObject.tp_as_async
+@@ -894,13 +894,13 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ This field is inherited by subtypes together with
+ :c:member:`~PyTypeObject.tp_richcompare`: a subtype inherits both of
+ :c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash`, when the subtype's
+- :c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash` are both *NULL*.
++ :c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash` are both ``NULL``.
+
+
+ .. c:member:: ternaryfunc PyTypeObject.tp_call
+
+ An optional pointer to a function that implements calling the object. This
+- should be *NULL* if the object is not callable. The signature is the same as
++ should be ``NULL`` if the object is not callable. The signature is the same as
+ for :c:func:`PyObject_Call`::
+
+ PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);
+@@ -952,7 +952,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_getattr`: a subtype
+ inherits both :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` from its base type when
+- the subtype's :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` are both *NULL*.
++ the subtype's :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` are both ``NULL``.
+
+ **Default:**
+
+@@ -967,7 +967,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ PyObject *tp_setattro(PyObject *self, PyObject *attr, PyObject *value);
+
+- In addition, setting *value* to *NULL* to delete an attribute must be
++ In addition, setting *value* to ``NULL`` to delete an attribute must be
+ supported. It is usually convenient to set this field to
+ :c:func:`PyObject_GenericSetAttr`, which implements the normal
+ way of setting object attributes.
+@@ -978,7 +978,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_setattr`: a subtype
+ inherits both :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` from its base type when
+- the subtype's :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` are both *NULL*.
++ the subtype's :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` are both ``NULL``.
+
+ **Default:**
+
+@@ -1005,7 +1005,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ :c:member:`~PyTypeObject.tp_as_number`, :c:member:`~PyTypeObject.tp_as_sequence`, :c:member:`~PyTypeObject.tp_as_mapping`, and
+ :c:member:`~PyTypeObject.tp_as_buffer`) that were historically not always present are valid; if
+ such a flag bit is clear, the type fields it guards must not be accessed and
+- must be considered to have a zero or *NULL* value instead.
++ must be considered to have a zero or ``NULL`` value instead.
+
+ **Inheritance:**
+
+@@ -1018,7 +1018,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ the :c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear` fields, i.e. if the
+ :const:`Py_TPFLAGS_HAVE_GC` flag bit is clear in the subtype and the
+ :c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear` fields in the subtype exist and have
+- *NULL* values.
++ ``NULL`` values.
+
+ .. XXX are most flag bits *really* inherited individually?
+
+@@ -1097,7 +1097,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ together with the :attr:`tp_traverse` and :attr:`tp_clear`
+ fields, i.e. if the :const:`Py_TPFLAGS_HAVE_GC` flag bit is
+ clear in the subtype and the :attr:`tp_traverse` and
+- :attr:`tp_clear` fields in the subtype exist and have *NULL*
++ :attr:`tp_clear` fields in the subtype exist and have ``NULL``
+ values.
+
+
+@@ -1180,7 +1180,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ This bit is set on *static* subtypes if ``tp_flags`` is not overridden:
+ a subtype inherits ``_Py_TPFLAGS_HAVE_VECTORCALL`` from its base type
+- when the subtype’s :c:member:`~PyTypeObject.tp_call` is NULL
++ when the subtype’s :c:member:`~PyTypeObject.tp_call` is ``NULL``
+ and the subtype's ``Py_TPFLAGS_HEAPTYPE`` is not set.
+
+ `Heap types`_ do not inherit ``_Py_TPFLAGS_HAVE_VECTORCALL``.
+@@ -1232,7 +1232,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ Note that :c:func:`Py_VISIT` is called only on those members that can participate
+ in reference cycles. Although there is also a ``self->key`` member, it can only
+- be *NULL* or a Python string and therefore cannot be part of a reference cycle.
++ be ``NULL`` or a Python string and therefore cannot be part of a reference cycle.
+
+ On the other hand, even if you know a member can never be part of a cycle, as a
+ debugging aid you may want to visit it anyway just so the :mod:`gc` module's
+@@ -1271,7 +1271,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ Implementations of :c:member:`~PyTypeObject.tp_clear` should drop the instance's references to
+ those of its members that may be Python objects, and set its pointers to those
+- members to *NULL*, as in the following example::
++ members to ``NULL``, as in the following example::
+
+ static int
+ local_clear(localobject *self)
+@@ -1285,12 +1285,12 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ The :c:func:`Py_CLEAR` macro should be used, because clearing references is
+ delicate: the reference to the contained object must not be decremented until
+- after the pointer to the contained object is set to *NULL*. This is because
++ after the pointer to the contained object is set to ``NULL``. This is because
+ decrementing the reference count may cause the contained object to become trash,
+ triggering a chain of reclamation activity that may include invoking arbitrary
+ Python code (due to finalizers, or weakref callbacks, associated with the
+ contained object). If it's possible for such code to reference *self* again,
+- it's important that the pointer to the contained object be *NULL* at that time,
++ it's important that the pointer to the contained object be ``NULL`` at that time,
+ so that *self* knows the contained object can no longer be used. The
+ :c:func:`Py_CLEAR` macro performs the operations in a safe order.
+
+@@ -1324,7 +1324,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ The function should return the result of the comparison (usually ``Py_True``
+ or ``Py_False``). If the comparison is undefined, it must return
+- ``Py_NotImplemented``, if another error occurred it must return *NULL* and
++ ``Py_NotImplemented``, if another error occurred it must return ``NULL`` and
+ set an exception condition.
+
+ The following constants are defined to be used as the third argument for
+@@ -1358,7 +1358,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ The return value's reference count is properly incremented.
+
+- On error, sets an exception and returns *NULL* from the function.
++ On error, sets an exception and returns ``NULL`` from the function.
+
+ .. versionadded:: 3.7
+
+@@ -1369,7 +1369,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_hash`:
+ a subtype inherits :c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash` when
+ the subtype's :c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash` are both
+- *NULL*.
++ ``NULL``.
+
+ **Default:**
+
+@@ -1387,7 +1387,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ reference list head (ignoring the GC header, if present); this offset is used by
+ :c:func:`PyObject_ClearWeakRefs` and the :c:func:`PyWeakref_\*` functions. The
+ instance structure needs to include a field of type :c:type:`PyObject\*` which is
+- initialized to *NULL*.
++ initialized to ``NULL``.
+
+ Do not confuse this field with :c:member:`~PyTypeObject.tp_weaklist`; that is the list head for
+ weak references to the type object itself.
+@@ -1436,9 +1436,9 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ PyObject *tp_iternext(PyObject *self);
+
+- When the iterator is exhausted, it must return *NULL*; a :exc:`StopIteration`
++ When the iterator is exhausted, it must return ``NULL``; a :exc:`StopIteration`
+ exception may or may not be set. When another error occurs, it must return
+- *NULL* too. Its presence signals that the instances of this type are
++ ``NULL`` too. Its presence signals that the instances of this type are
+ iterators.
+
+ Iterator types should also define the :c:member:`~PyTypeObject.tp_iter` function, and that
+@@ -1454,7 +1454,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ .. c:member:: struct PyMethodDef* PyTypeObject.tp_methods
+
+- An optional pointer to a static *NULL*-terminated array of :c:type:`PyMethodDef`
++ An optional pointer to a static ``NULL``-terminated array of :c:type:`PyMethodDef`
+ structures, declaring regular methods of this type.
+
+ For each entry in the array, an entry is added to the type's dictionary (see
+@@ -1468,7 +1468,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ .. c:member:: struct PyMemberDef* PyTypeObject.tp_members
+
+- An optional pointer to a static *NULL*-terminated array of :c:type:`PyMemberDef`
++ An optional pointer to a static ``NULL``-terminated array of :c:type:`PyMemberDef`
+ structures, declaring regular data members (fields or slots) of instances of
+ this type.
+
+@@ -1483,7 +1483,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ .. c:member:: struct PyGetSetDef* PyTypeObject.tp_getset
+
+- An optional pointer to a static *NULL*-terminated array of :c:type:`PyGetSetDef`
++ An optional pointer to a static ``NULL``-terminated array of :c:type:`PyGetSetDef`
+ structures, declaring computed attributes of instances of this type.
+
+ For each entry in the array, an entry is added to the type's dictionary (see
+@@ -1533,7 +1533,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ The type's dictionary is stored here by :c:func:`PyType_Ready`.
+
+- This field should normally be initialized to *NULL* before PyType_Ready is
++ This field should normally be initialized to ``NULL`` before PyType_Ready is
+ called; it may also be initialized to a dictionary containing initial attributes
+ for the type. Once :c:func:`PyType_Ready` has initialized the type, extra
+ attributes for the type may be added to this dictionary only if they don't
+@@ -1546,7 +1546,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ **Default:**
+
+- If this field is *NULL*, :c:func:`PyType_Ready` will assign a new
++ If this field is ``NULL``, :c:func:`PyType_Ready` will assign a new
+ dictionary to it.
+
+ .. warning::
+@@ -1579,7 +1579,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);
+
+- The *value* argument is set to *NULL* to delete the value.
++ The *value* argument is set to ``NULL`` to delete the value.
+
+ .. XXX explain more?
+
+@@ -1645,7 +1645,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ **Default:**
+
+ This slot has no default. For static types, if the field is
+- *NULL* then no :attr:`__dict__` gets created for instances.
++ ``NULL`` then no :attr:`__dict__` gets created for instances.
+
+
+ .. c:member:: initproc PyTypeObject.tp_init
+@@ -1665,7 +1665,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ arguments represent positional and keyword arguments of the call to
+ :meth:`__init__`.
+
+- The :c:member:`~PyTypeObject.tp_init` function, if not *NULL*, is called when an instance is
++ The :c:member:`~PyTypeObject.tp_init` function, if not ``NULL``, is called when an instance is
+ created normally by calling its type, after the type's :c:member:`~PyTypeObject.tp_new` function
+ has returned an instance of the type. If the :c:member:`~PyTypeObject.tp_new` function returns an
+ instance of some other type that is not a subtype of the original type, no
+@@ -1732,12 +1732,12 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+ **Inheritance:**
+
+ This field is inherited by subtypes, except it is not inherited by static types
+- whose :c:member:`~PyTypeObject.tp_base` is *NULL* or ``&PyBaseObject_Type``.
++ whose :c:member:`~PyTypeObject.tp_base` is ``NULL`` or ``&PyBaseObject_Type``.
+
+ **Default:**
+
+ For static types this field has no default. This means if the
+- slot is defined as *NULL*, the type cannot be called to create new
++ slot is defined as ``NULL``, the type cannot be called to create new
+ instances; presumably there is some other way to create
+ instances, like a factory function.
+
+@@ -1788,7 +1788,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ **Default:**
+
+- This slot has no default. If this field is *NULL*,
++ This slot has no default. If this field is ``NULL``,
+ :const:`Py_TPFLAGS_HAVE_GC` is used as the functional equivalent.
+
+
+@@ -1796,7 +1796,7 @@ and :c:type:`PyType_Type` effectively act as defaults.)
+
+ Tuple of base types.
+
+- This is set for types created by a class statement. It should be *NULL* for
++ This is set for types created by a class statement. It should be ``NULL`` for
+ statically defined types.
+
+ **Inheritance:**
+@@ -1955,7 +1955,7 @@ This results in types that are limited relative to types defined in Python:
+ :ref:`sub-interpreters <sub-interpreter-support>`, so they should not
+ include any subinterpreter-specific state.
+
+-Also, since *PyTypeObject* is not part of the :ref:`stable ABI <stable>`,
++Also, since :c:type:`PyTypeObject` is not part of the :ref:`stable ABI <stable>`,
+ any extension modules using static types must be compiled for a specific
+ Python minor version.
+
+@@ -2034,12 +2034,12 @@ Number Object Structures
+ and implement the necessary conversions (at least one of the operands is
+ an instance of the defined type). If the operation is not defined for the
+ given operands, binary and ternary functions must return
+- ``Py_NotImplemented``, if another error occurred they must return *NULL*
++ ``Py_NotImplemented``, if another error occurred they must return ``NULL``
+ and set an exception.
+
+ .. note::
+
+- The :c:data:`nb_reserved` field should always be *NULL*. It
++ The :c:data:`nb_reserved` field should always be ``NULL``. It
+ was previously called :c:data:`nb_long`, and was renamed in
+ Python 3.0.1.
+
+@@ -2098,14 +2098,14 @@ Mapping Object Structures
+
+ This function is used by :c:func:`PyMapping_Size` and
+ :c:func:`PyObject_Size`, and has the same signature. This slot may be set to
+- *NULL* if the object has no defined length.
++ ``NULL`` if the object has no defined length.
+
+ .. c:member:: binaryfunc PyMappingMethods.mp_subscript
+
+ This function is used by :c:func:`PyObject_GetItem` and
+ :c:func:`PySequence_GetSlice`, and has the same signature as
+ :c:func:`!PyObject_GetItem`. This slot must be filled for the
+- :c:func:`PyMapping_Check` function to return ``1``, it can be *NULL*
++ :c:func:`PyMapping_Check` function to return ``1``, it can be ``NULL``
+ otherwise.
+
+ .. c:member:: objobjargproc PyMappingMethods.mp_ass_subscript
+@@ -2113,8 +2113,8 @@ Mapping Object Structures
+ This function is used by :c:func:`PyObject_SetItem`,
+ :c:func:`PyObject_DelItem`, :c:func:`PyObject_SetSlice` and
+ :c:func:`PyObject_DelSlice`. It has the same signature as
+- :c:func:`!PyObject_SetItem`, but *v* can also be set to *NULL* to delete
+- an item. If this slot is *NULL*, the object does not support item
++ :c:func:`!PyObject_SetItem`, but *v* can also be set to ``NULL`` to delete
++ an item. If this slot is ``NULL``, the object does not support item
+ assignment and deletion.
+
+
+@@ -2156,11 +2156,11 @@ Sequence Object Structures
+ signature. It is also used by :c:func:`PyObject_GetItem`, after trying
+ the subscription via the :c:member:`~PyMappingMethods.mp_subscript` slot.
+ This slot must be filled for the :c:func:`PySequence_Check`
+- function to return ``1``, it can be *NULL* otherwise.
++ function to return ``1``, it can be ``NULL`` otherwise.
+
+ Negative indexes are handled as follows: if the :attr:`sq_length` slot is
+ filled, it is called and the sequence length is used to compute a positive
+- index which is passed to :attr:`sq_item`. If :attr:`sq_length` is *NULL*,
++ index which is passed to :attr:`sq_item`. If :attr:`sq_length` is ``NULL``,
+ the index is passed as is to the function.
+
+ .. c:member:: ssizeobjargproc PySequenceMethods.sq_ass_item
+@@ -2169,13 +2169,13 @@ Sequence Object Structures
+ signature. It is also used by :c:func:`PyObject_SetItem` and
+ :c:func:`PyObject_DelItem`, after trying the item assignment and deletion
+ via the :c:member:`~PyMappingMethods.mp_ass_subscript` slot.
+- This slot may be left to *NULL* if the object does not support
++ This slot may be left to ``NULL`` if the object does not support
+ item assignment and deletion.
+
+ .. c:member:: objobjproc PySequenceMethods.sq_contains
+
+ This function may be used by :c:func:`PySequence_Contains` and has the same
+- signature. This slot may be left to *NULL*, in this case
++ signature. This slot may be left to ``NULL``, in this case
+ :c:func:`!PySequence_Contains` simply traverses the sequence until it
+ finds a match.
+
+@@ -2183,7 +2183,7 @@ Sequence Object Structures
+
+ This function is used by :c:func:`PySequence_InPlaceConcat` and has the same
+ signature. It should modify its first operand, and return it. This slot
+- may be left to *NULL*, in this case :c:func:`!PySequence_InPlaceConcat`
++ may be left to ``NULL``, in this case :c:func:`!PySequence_InPlaceConcat`
+ will fall back to :c:func:`PySequence_Concat`. It is also used by the
+ augmented assignment ``+=``, after trying numeric in-place addition
+ via the :c:member:`~PyNumberMethods.nb_inplace_add` slot.
+@@ -2192,7 +2192,7 @@ Sequence Object Structures
+
+ This function is used by :c:func:`PySequence_InPlaceRepeat` and has the same
+ signature. It should modify its first operand, and return it. This slot
+- may be left to *NULL*, in this case :c:func:`!PySequence_InPlaceRepeat`
++ may be left to ``NULL``, in this case :c:func:`!PySequence_InPlaceRepeat`
+ will fall back to :c:func:`PySequence_Repeat`. It is also used by the
+ augmented assignment ``*=``, after trying numeric in-place multiplication
+ via the :c:member:`~PyNumberMethods.nb_inplace_multiply` slot.
+@@ -2224,7 +2224,7 @@ Buffer Object Structures
+ steps:
+
+ (1) Check if the request can be met. If not, raise :c:data:`PyExc_BufferError`,
+- set :c:data:`view->obj` to *NULL* and return ``-1``.
++ set :c:data:`view->obj` to ``NULL`` and return ``-1``.
+
+ (2) Fill in the requested fields.
+
+@@ -2270,7 +2270,7 @@ Buffer Object Structures
+
+ Handle a request to release the resources of the buffer. If no resources
+ need to be released, :c:member:`PyBufferProcs.bf_releasebuffer` may be
+- *NULL*. Otherwise, a standard implementation of this function will take
++ ``NULL``. Otherwise, a standard implementation of this function will take
+ these optional steps:
+
+ (1) Decrement an internal counter for the number of exports.
+@@ -2324,7 +2324,7 @@ Async Object Structures
+ The returned object must be an iterator, i.e. :c:func:`PyIter_Check` must
+ return ``1`` for it.
+
+- This slot may be set to *NULL* if an object is not an :term:`awaitable`.
++ This slot may be set to ``NULL`` if an object is not an :term:`awaitable`.
+
+ .. c:member:: unaryfunc PyAsyncMethods.am_aiter
+
+@@ -2334,7 +2334,7 @@ Async Object Structures
+
+ Must return an :term:`awaitable` object. See :meth:`__anext__` for details.
+
+- This slot may be set to *NULL* if an object does not implement
++ This slot may be set to ``NULL`` if an object does not implement
+ asynchronous iteration protocol.
+
+ .. c:member:: unaryfunc PyAsyncMethods.am_anext
+@@ -2344,7 +2344,7 @@ Async Object Structures
+ PyObject *am_anext(PyObject *self);
+
+ Must return an :term:`awaitable` object. See :meth:`__anext__` for details.
+- This slot may be set to *NULL*.
++ This slot may be set to ``NULL``.
+
+
+ .. _slot-typedefs:
+@@ -2400,7 +2400,7 @@ Slot Type typedefs
+ .. c:type:: int (*setattrfunc)(PyObject *self, char *attr, PyObject *value)
+
+ Set the value of the named attribute for the object.
+- The value argument is set to *NULL* to delete the attribute.
++ The value argument is set to ``NULL`` to delete the attribute.
+
+ .. c:type:: PyObject *(*getattrofunc)(PyObject *self, PyObject *attr)
+
+@@ -2411,7 +2411,7 @@ Slot Type typedefs
+ .. c:type:: int (*setattrofunc)(PyObject *self, PyObject *attr, PyObject *value)
+
+ Set the value of the named attribute for the object.
+- The value argument is set to *NULL* to delete the attribute.
++ The value argument is set to ``NULL`` to delete the attribute.
+
+ See :c:member:`~PyTypeObject.tp_setattro`.
+
+diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst
+index a150a9c39d..2bf4a0f56b 100644
+--- a/Doc/c-api/unicode.rst
++++ b/Doc/c-api/unicode.rst
+@@ -236,7 +236,7 @@ access internal read-only data of Unicode objects:
+ .. versionchanged:: 3.3
+ This macro is now inefficient -- because in many cases the
+ :c:type:`Py_UNICODE` representation does not exist and needs to be created
+- -- and can fail (return *NULL* with an exception set). Try to port the
++ -- and can fail (return ``NULL`` with an exception set). Try to port the
+ code to use the new :c:func:`PyUnicode_nBYTE_DATA` macros or use
+ :c:func:`PyUnicode_WRITE` or :c:func:`PyUnicode_READ`.
+
+@@ -413,11 +413,11 @@ APIs:
+
+ Create a Unicode object from the char buffer *u*. The bytes will be
+ interpreted as being UTF-8 encoded. The buffer is copied into the new
+- object. If the buffer is not *NULL*, the return value might be a shared
++ object. If the buffer is not ``NULL``, the return value might be a shared
+ object, i.e. modification of the data is not allowed.
+
+- If *u* is *NULL*, this function behaves like :c:func:`PyUnicode_FromUnicode`
+- with the buffer set to *NULL*. This usage is deprecated in favor of
++ If *u* is ``NULL``, this function behaves like :c:func:`PyUnicode_FromUnicode`
++ with the buffer set to ``NULL``. This usage is deprecated in favor of
+ :c:func:`PyUnicode_New`.
+
+
+@@ -443,82 +443,82 @@ APIs:
+
+ .. tabularcolumns:: |l|l|L|
+
+- +-------------------+---------------------+--------------------------------+
+- | Format Characters | Type | Comment |
+- +===================+=====================+================================+
+- | :attr:`%%` | *n/a* | The literal % character. |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%c` | int | A single character, |
+- | | | represented as a C int. |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%d` | int | Equivalent to |
+- | | | ``printf("%d")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%u` | unsigned int | Equivalent to |
+- | | | ``printf("%u")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%ld` | long | Equivalent to |
+- | | | ``printf("%ld")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%li` | long | Equivalent to |
+- | | | ``printf("%li")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%lu` | unsigned long | Equivalent to |
+- | | | ``printf("%lu")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%lld` | long long | Equivalent to |
+- | | | ``printf("%lld")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%lli` | long long | Equivalent to |
+- | | | ``printf("%lli")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%llu` | unsigned long long | Equivalent to |
+- | | | ``printf("%llu")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%zd` | Py_ssize_t | Equivalent to |
+- | | | ``printf("%zd")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%zi` | Py_ssize_t | Equivalent to |
+- | | | ``printf("%zi")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%zu` | size_t | Equivalent to |
+- | | | ``printf("%zu")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%i` | int | Equivalent to |
+- | | | ``printf("%i")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%x` | int | Equivalent to |
+- | | | ``printf("%x")``. [1]_ |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%s` | const char\* | A null-terminated C character |
+- | | | array. |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%p` | const void\* | The hex representation of a C |
+- | | | pointer. Mostly equivalent to |
+- | | | ``printf("%p")`` except that |
+- | | | it is guaranteed to start with |
+- | | | the literal ``0x`` regardless |
+- | | | of what the platform's |
+- | | | ``printf`` yields. |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%A` | PyObject\* | The result of calling |
+- | | | :func:`ascii`. |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%U` | PyObject\* | A Unicode object. |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%V` | PyObject\*, | A Unicode object (which may be |
+- | | const char\* | *NULL*) and a null-terminated |
+- | | | C character array as a second |
+- | | | parameter (which will be used, |
+- | | | if the first parameter is |
+- | | | *NULL*). |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%S` | PyObject\* | The result of calling |
+- | | | :c:func:`PyObject_Str`. |
+- +-------------------+---------------------+--------------------------------+
+- | :attr:`%R` | PyObject\* | The result of calling |
+- | | | :c:func:`PyObject_Repr`. |
+- +-------------------+---------------------+--------------------------------+
++ +-------------------+---------------------+----------------------------------+
++ | Format Characters | Type | Comment |
++ +===================+=====================+==================================+
++ | :attr:`%%` | *n/a* | The literal % character. |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%c` | int | A single character, |
++ | | | represented as a C int. |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%d` | int | Equivalent to |
++ | | | ``printf("%d")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%u` | unsigned int | Equivalent to |
++ | | | ``printf("%u")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%ld` | long | Equivalent to |
++ | | | ``printf("%ld")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%li` | long | Equivalent to |
++ | | | ``printf("%li")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%lu` | unsigned long | Equivalent to |
++ | | | ``printf("%lu")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%lld` | long long | Equivalent to |
++ | | | ``printf("%lld")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%lli` | long long | Equivalent to |
++ | | | ``printf("%lli")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%llu` | unsigned long long | Equivalent to |
++ | | | ``printf("%llu")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%zd` | Py_ssize_t | Equivalent to |
++ | | | ``printf("%zd")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%zi` | Py_ssize_t | Equivalent to |
++ | | | ``printf("%zi")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%zu` | size_t | Equivalent to |
++ | | | ``printf("%zu")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%i` | int | Equivalent to |
++ | | | ``printf("%i")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%x` | int | Equivalent to |
++ | | | ``printf("%x")``. [1]_ |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%s` | const char\* | A null-terminated C character |
++ | | | array. |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%p` | const void\* | The hex representation of a C |
++ | | | pointer. Mostly equivalent to |
++ | | | ``printf("%p")`` except that |
++ | | | it is guaranteed to start with |
++ | | | the literal ``0x`` regardless |
++ | | | of what the platform's |
++ | | | ``printf`` yields. |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%A` | PyObject\* | The result of calling |
++ | | | :func:`ascii`. |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%U` | PyObject\* | A Unicode object. |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%V` | PyObject\*, | A Unicode object (which may be |
++ | | const char\* | ``NULL``) and a null-terminated |
++ | | | C character array as a second |
++ | | | parameter (which will be used, |
++ | | | if the first parameter is |
++ | | | ``NULL``). |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%S` | PyObject\* | The result of calling |
++ | | | :c:func:`PyObject_Str`. |
++ +-------------------+---------------------+----------------------------------+
++ | :attr:`%R` | PyObject\* | The result of calling |
++ | | | :c:func:`PyObject_Repr`. |
++ +-------------------+---------------------+----------------------------------+
+
+ An unrecognized format character causes all the rest of the format string to be
+ copied as-is to the result string, and any extra arguments discarded.
+@@ -526,9 +526,9 @@ APIs:
+ .. note::
+ The width formatter unit is number of characters rather than bytes.
+ The precision formatter unit is number of bytes for ``"%s"`` and
+- ``"%V"`` (if the ``PyObject*`` argument is NULL), and a number of
++ ``"%V"`` (if the ``PyObject*`` argument is ``NULL``), and a number of
+ characters for ``"%A"``, ``"%U"``, ``"%S"``, ``"%R"`` and ``"%V"``
+- (if the ``PyObject*`` argument is not NULL).
++ (if the ``PyObject*`` argument is not ``NULL``).
+
+ .. [1] For integer specifiers (d, u, ld, li, lu, lld, lli, llu, zd, zi,
+ zu, i, x): the 0-conversion flag has effect even when a precision is given.
+@@ -558,13 +558,13 @@ APIs:
+ :class:`bytes`, :class:`bytearray` and other
+ :term:`bytes-like objects <bytes-like object>`
+ are decoded according to the given *encoding* and using the error handling
+- defined by *errors*. Both can be *NULL* to have the interface use the default
++ defined by *errors*. Both can be ``NULL`` to have the interface use the default
+ values (see :ref:`builtincodecs` for details).
+
+ All other objects, including Unicode objects, cause a :exc:`TypeError` to be
+ set.
+
+- The API returns *NULL* if there was an error. The caller is responsible for
++ The API returns ``NULL`` if there was an error. The caller is responsible for
+ decref'ing the returned objects.
+
+
+@@ -640,7 +640,7 @@ APIs:
+ Py_ssize_t buflen, int copy_null)
+
+ Copy the string *u* into a UCS4 buffer, including a null character, if
+- *copy_null* is set. Returns *NULL* and sets an exception on error (in
++ *copy_null* is set. Returns ``NULL`` and sets an exception on error (in
+ particular, a :exc:`SystemError` if *buflen* is smaller than the length of
+ *u*). *buffer* is returned on success.
+
+@@ -650,7 +650,7 @@ APIs:
+ .. c:function:: Py_UCS4* PyUnicode_AsUCS4Copy(PyObject *u)
+
+ Copy the string *u* into a new UCS4 buffer that is allocated using
+- :c:func:`PyMem_Malloc`. If this fails, *NULL* is returned with a
++ :c:func:`PyMem_Malloc`. If this fails, ``NULL`` is returned with a
+ :exc:`MemoryError` set. The returned buffer always has an extra
+ null code point appended.
+
+@@ -670,15 +670,15 @@ Extension modules can continue using them, as they will not be removed in Python
+ .. c:function:: PyObject* PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size)
+
+ Create a Unicode object from the Py_UNICODE buffer *u* of the given size. *u*
+- may be *NULL* which causes the contents to be undefined. It is the user's
++ may be ``NULL`` which causes the contents to be undefined. It is the user's
+ responsibility to fill in the needed data. The buffer is copied into the new
+ object.
+
+- If the buffer is not *NULL*, the return value might be a shared object.
++ If the buffer is not ``NULL``, the return value might be a shared object.
+ Therefore, modification of the resulting Unicode object is only allowed when
+- *u* is *NULL*.
++ *u* is ``NULL``.
+
+- If the buffer is *NULL*, :c:func:`PyUnicode_READY` must be called once the
++ If the buffer is ``NULL``, :c:func:`PyUnicode_READY` must be called once the
+ string content has been filled before using any of the access macros such as
+ :c:func:`PyUnicode_KIND`.
+
+@@ -689,7 +689,7 @@ Extension modules can continue using them, as they will not be removed in Python
+ .. c:function:: Py_UNICODE* PyUnicode_AsUnicode(PyObject *unicode)
+
+ Return a read-only pointer to the Unicode object's internal
+- :c:type:`Py_UNICODE` buffer, or *NULL* on error. This will create the
++ :c:type:`Py_UNICODE` buffer, or ``NULL`` on error. This will create the
+ :c:type:`Py_UNICODE*` representation of the object if it is not yet
+ available. The buffer is always terminated with an extra null code point.
+ Note that the resulting :c:type:`Py_UNICODE` string may also contain
+@@ -705,7 +705,7 @@ Extension modules can continue using them, as they will not be removed in Python
+
+ Create a Unicode object by replacing all decimal digits in
+ :c:type:`Py_UNICODE` buffer of the given *size* by ASCII digits 0--9
+- according to their decimal value. Return *NULL* if an exception occurs.
++ according to their decimal value. Return ``NULL`` if an exception occurs.
+
+
+ .. c:function:: Py_UNICODE* PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size)
+@@ -721,7 +721,7 @@ Extension modules can continue using them, as they will not be removed in Python
+
+ .. c:function:: Py_UNICODE* PyUnicode_AsUnicodeCopy(PyObject *unicode)
+
+- Create a copy of a Unicode string ending with a null code point. Return *NULL*
++ Create a copy of a Unicode string ending with a null code point. Return ``NULL``
+ and raise a :exc:`MemoryError` exception on memory allocation failure,
+ otherwise return a new allocated buffer (use :c:func:`PyMem_Free` to free
+ the buffer). Note that the resulting :c:type:`Py_UNICODE*` string may
+@@ -932,7 +932,7 @@ wchar_t Support
+ Create a Unicode object from the :c:type:`wchar_t` buffer *w* of the given *size*.
+ Passing ``-1`` as the *size* indicates that the function must itself compute the length,
+ using wcslen.
+- Return *NULL* on failure.
++ Return ``NULL`` on failure.
+
+
+ .. c:function:: Py_ssize_t PyUnicode_AsWideChar(PyObject *unicode, wchar_t *w, Py_ssize_t size)
+@@ -951,22 +951,22 @@ wchar_t Support
+ .. c:function:: wchar_t* PyUnicode_AsWideCharString(PyObject *unicode, Py_ssize_t *size)
+
+ Convert the Unicode object to a wide character string. The output string
+- always ends with a null character. If *size* is not *NULL*, write the number
++ always ends with a null character. If *size* is not ``NULL``, write the number
+ of wide characters (excluding the trailing null termination character) into
+ *\*size*. Note that the resulting :c:type:`wchar_t` string might contain
+ null characters, which would cause the string to be truncated when used with
+- most C functions. If *size* is *NULL* and the :c:type:`wchar_t*` string
++ most C functions. If *size* is ``NULL`` and the :c:type:`wchar_t*` string
+ contains null characters a :exc:`ValueError` is raised.
+
+ Returns a buffer allocated by :c:func:`PyMem_Alloc` (use
+- :c:func:`PyMem_Free` to free it) on success. On error, returns *NULL*
++ :c:func:`PyMem_Free` to free it) on success. On error, returns ``NULL``
+ and *\*size* is undefined. Raises a :exc:`MemoryError` if memory allocation
+ is failed.
+
+ .. versionadded:: 3.2
+
+ .. versionchanged:: 3.7
+- Raises a :exc:`ValueError` if *size* is *NULL* and the :c:type:`wchar_t*`
++ Raises a :exc:`ValueError` if *size* is ``NULL`` and the :c:type:`wchar_t*`
+ string contains null characters.
+
+
+@@ -982,7 +982,7 @@ Many of the following APIs take two arguments encoding and errors, and they
+ have the same semantics as the ones of the built-in :func:`str` string object
+ constructor.
+
+-Setting encoding to *NULL* causes the default encoding to be used
++Setting encoding to ``NULL`` causes the default encoding to be used
+ which is ASCII. The file system calls should use
+ :c:func:`PyUnicode_FSConverter` for encoding file names. This uses the
+ variable :c:data:`Py_FileSystemDefaultEncoding` internally. This
+@@ -990,7 +990,7 @@ variable should be treated as read-only: on some systems, it will be a
+ pointer to a static string, on others, it will change at run-time
+ (such as when the application invokes setlocale).
+
+-Error handling is set by errors which may also be set to *NULL* meaning to use
++Error handling is set by errors which may also be set to ``NULL`` meaning to use
+ the default handling defined for the codec. Default error handling for all
+ built-in codecs is "strict" (:exc:`ValueError` is raised).
+
+@@ -1010,7 +1010,7 @@ These are the generic codec APIs:
+ Create a Unicode object by decoding *size* bytes of the encoded string *s*.
+ *encoding* and *errors* have the same meaning as the parameters of the same name
+ in the :func:`str` built-in function. The codec to be used is looked up
+- using the Python codec registry. Return *NULL* if an exception was raised by
++ using the Python codec registry. Return ``NULL`` if an exception was raised by
+ the codec.
+
+
+@@ -1020,7 +1020,7 @@ These are the generic codec APIs:
+ Encode a Unicode object and return the result as Python bytes object.
+ *encoding* and *errors* have the same meaning as the parameters of the same
+ name in the Unicode :meth:`~str.encode` method. The codec to be used is looked up
+- using the Python codec registry. Return *NULL* if an exception was raised by
++ using the Python codec registry. Return ``NULL`` if an exception was raised by
+ the codec.
+
+
+@@ -1030,7 +1030,7 @@ These are the generic codec APIs:
+ Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* and return a Python
+ bytes object. *encoding* and *errors* have the same meaning as the
+ parameters of the same name in the Unicode :meth:`~str.encode` method. The codec
+- to be used is looked up using the Python codec registry. Return *NULL* if an
++ to be used is looked up using the Python codec registry. Return ``NULL`` if an
+ exception was raised by the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+@@ -1047,14 +1047,14 @@ These are the UTF-8 codec APIs:
+ .. c:function:: PyObject* PyUnicode_DecodeUTF8(const char *s, Py_ssize_t size, const char *errors)
+
+ Create a Unicode object by decoding *size* bytes of the UTF-8 encoded string
+- *s*. Return *NULL* if an exception was raised by the codec.
++ *s*. Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t size, \
+ const char *errors, Py_ssize_t *consumed)
+
+- If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF8`. If
+- *consumed* is not *NULL*, trailing incomplete UTF-8 byte sequences will not be
++ If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF8`. If
++ *consumed* is not ``NULL``, trailing incomplete UTF-8 byte sequences will not be
+ treated as an error. Those bytes will not be decoded and the number of bytes
+ that have been decoded will be stored in *consumed*.
+
+@@ -1062,7 +1062,7 @@ These are the UTF-8 codec APIs:
+ .. c:function:: PyObject* PyUnicode_AsUTF8String(PyObject *unicode)
+
+ Encode a Unicode object using UTF-8 and return the result as Python bytes
+- object. Error handling is "strict". Return *NULL* if an exception was
++ object. Error handling is "strict". Return ``NULL`` if an exception was
+ raised by the codec.
+
+
+@@ -1070,11 +1070,11 @@ These are the UTF-8 codec APIs:
+
+ Return a pointer to the UTF-8 encoding of the Unicode object, and
+ store the size of the encoded representation (in bytes) in *size*. The
+- *size* argument can be *NULL*; in this case no size will be stored. The
++ *size* argument can be ``NULL``; in this case no size will be stored. The
+ returned buffer always has an extra null byte appended (not included in
+ *size*), regardless of whether there are any other null code points.
+
+- In the case of an error, *NULL* is returned with an exception set and no
++ In the case of an error, ``NULL`` is returned with an exception set and no
+ *size* is stored.
+
+ This caches the UTF-8 representation of the string in the Unicode object, and
+@@ -1100,7 +1100,7 @@ These are the UTF-8 codec APIs:
+ .. c:function:: PyObject* PyUnicode_EncodeUTF8(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
+
+ Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* using UTF-8 and
+- return a Python bytes object. Return *NULL* if an exception was raised by
++ return a Python bytes object. Return ``NULL`` if an exception was raised by
+ the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+@@ -1119,10 +1119,10 @@ These are the UTF-32 codec APIs:
+ const char *errors, int *byteorder)
+
+ Decode *size* bytes from a UTF-32 encoded buffer string and return the
+- corresponding Unicode object. *errors* (if non-*NULL*) defines the error
++ corresponding Unicode object. *errors* (if non-``NULL``) defines the error
+ handling. It defaults to "strict".
+
+- If *byteorder* is non-*NULL*, the decoder starts decoding using the given byte
++ If *byteorder* is non-``NULL``, the decoder starts decoding using the given byte
+ order::
+
+ *byteorder == -1: little endian
+@@ -1137,16 +1137,16 @@ These are the UTF-32 codec APIs:
+ After completion, *\*byteorder* is set to the current byte order at the end
+ of input data.
+
+- If *byteorder* is *NULL*, the codec starts in native order mode.
++ If *byteorder* is ``NULL``, the codec starts in native order mode.
+
+- Return *NULL* if an exception was raised by the codec.
++ Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_DecodeUTF32Stateful(const char *s, Py_ssize_t size, \
+ const char *errors, int *byteorder, Py_ssize_t *consumed)
+
+- If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF32`. If
+- *consumed* is not *NULL*, :c:func:`PyUnicode_DecodeUTF32Stateful` will not treat
++ If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF32`. If
++ *consumed* is not ``NULL``, :c:func:`PyUnicode_DecodeUTF32Stateful` will not treat
+ trailing incomplete UTF-32 byte sequences (such as a number of bytes not divisible
+ by four) as an error. Those bytes will not be decoded and the number of bytes
+ that have been decoded will be stored in *consumed*.
+@@ -1156,7 +1156,7 @@ These are the UTF-32 codec APIs:
+
+ Return a Python byte string using the UTF-32 encoding in native byte
+ order. The string always starts with a BOM mark. Error handling is "strict".
+- Return *NULL* if an exception was raised by the codec.
++ Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_EncodeUTF32(const Py_UNICODE *s, Py_ssize_t size, \
+@@ -1172,10 +1172,10 @@ These are the UTF-32 codec APIs:
+ If byteorder is ``0``, the output string will always start with the Unicode BOM
+ mark (U+FEFF). In the other two modes, no BOM mark is prepended.
+
+- If *Py_UNICODE_WIDE* is not defined, surrogate pairs will be output
++ If ``Py_UNICODE_WIDE`` is not defined, surrogate pairs will be output
+ as a single code point.
+
+- Return *NULL* if an exception was raised by the codec.
++ Return ``NULL`` if an exception was raised by the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+@@ -1192,10 +1192,10 @@ These are the UTF-16 codec APIs:
+ const char *errors, int *byteorder)
+
+ Decode *size* bytes from a UTF-16 encoded buffer string and return the
+- corresponding Unicode object. *errors* (if non-*NULL*) defines the error
++ corresponding Unicode object. *errors* (if non-``NULL``) defines the error
+ handling. It defaults to "strict".
+
+- If *byteorder* is non-*NULL*, the decoder starts decoding using the given byte
++ If *byteorder* is non-``NULL``, the decoder starts decoding using the given byte
+ order::
+
+ *byteorder == -1: little endian
+@@ -1211,16 +1211,16 @@ These are the UTF-16 codec APIs:
+ After completion, *\*byteorder* is set to the current byte order at the end
+ of input data.
+
+- If *byteorder* is *NULL*, the codec starts in native order mode.
++ If *byteorder* is ``NULL``, the codec starts in native order mode.
+
+- Return *NULL* if an exception was raised by the codec.
++ Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_DecodeUTF16Stateful(const char *s, Py_ssize_t size, \
+ const char *errors, int *byteorder, Py_ssize_t *consumed)
+
+- If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF16`. If
+- *consumed* is not *NULL*, :c:func:`PyUnicode_DecodeUTF16Stateful` will not treat
++ If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF16`. If
++ *consumed* is not ``NULL``, :c:func:`PyUnicode_DecodeUTF16Stateful` will not treat
+ trailing incomplete UTF-16 byte sequences (such as an odd number of bytes or a
+ split surrogate pair) as an error. Those bytes will not be decoded and the
+ number of bytes that have been decoded will be stored in *consumed*.
+@@ -1230,7 +1230,7 @@ These are the UTF-16 codec APIs:
+
+ Return a Python byte string using the UTF-16 encoding in native byte
+ order. The string always starts with a BOM mark. Error handling is "strict".
+- Return *NULL* if an exception was raised by the codec.
++ Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_EncodeUTF16(const Py_UNICODE *s, Py_ssize_t size, \
+@@ -1246,11 +1246,11 @@ These are the UTF-16 codec APIs:
+ If byteorder is ``0``, the output string will always start with the Unicode BOM
+ mark (U+FEFF). In the other two modes, no BOM mark is prepended.
+
+- If *Py_UNICODE_WIDE* is defined, a single :c:type:`Py_UNICODE` value may get
++ If ``Py_UNICODE_WIDE`` is defined, a single :c:type:`Py_UNICODE` value may get
+ represented as a surrogate pair. If it is not defined, each :c:type:`Py_UNICODE`
+ values is interpreted as a UCS-2 character.
+
+- Return *NULL* if an exception was raised by the codec.
++ Return ``NULL`` if an exception was raised by the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+@@ -1266,14 +1266,14 @@ These are the UTF-7 codec APIs:
+ .. c:function:: PyObject* PyUnicode_DecodeUTF7(const char *s, Py_ssize_t size, const char *errors)
+
+ Create a Unicode object by decoding *size* bytes of the UTF-7 encoded string
+- *s*. Return *NULL* if an exception was raised by the codec.
++ *s*. Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_DecodeUTF7Stateful(const char *s, Py_ssize_t size, \
+ const char *errors, Py_ssize_t *consumed)
+
+- If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF7`. If
+- *consumed* is not *NULL*, trailing incomplete UTF-7 base-64 sections will not
++ If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeUTF7`. If
++ *consumed* is not ``NULL``, trailing incomplete UTF-7 base-64 sections will not
+ be treated as an error. Those bytes will not be decoded and the number of
+ bytes that have been decoded will be stored in *consumed*.
+
+@@ -1282,7 +1282,7 @@ These are the UTF-7 codec APIs:
+ int base64SetO, int base64WhiteSpace, const char *errors)
+
+ Encode the :c:type:`Py_UNICODE` buffer of the given size using UTF-7 and
+- return a Python bytes object. Return *NULL* if an exception was raised by
++ return a Python bytes object. Return ``NULL`` if an exception was raised by
+ the codec.
+
+ If *base64SetO* is nonzero, "Set O" (punctuation that has no otherwise
+@@ -1305,20 +1305,20 @@ These are the "Unicode Escape" codec APIs:
+ Py_ssize_t size, const char *errors)
+
+ Create a Unicode object by decoding *size* bytes of the Unicode-Escape encoded
+- string *s*. Return *NULL* if an exception was raised by the codec.
++ string *s*. Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_AsUnicodeEscapeString(PyObject *unicode)
+
+ Encode a Unicode object using Unicode-Escape and return the result as a
+- bytes object. Error handling is "strict". Return *NULL* if an exception was
++ bytes object. Error handling is "strict". Return ``NULL`` if an exception was
+ raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)
+
+ Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Unicode-Escape and
+- return a bytes object. Return *NULL* if an exception was raised by the codec.
++ return a bytes object. Return ``NULL`` if an exception was raised by the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+@@ -1335,13 +1335,13 @@ These are the "Raw Unicode Escape" codec APIs:
+ Py_ssize_t size, const char *errors)
+
+ Create a Unicode object by decoding *size* bytes of the Raw-Unicode-Escape
+- encoded string *s*. Return *NULL* if an exception was raised by the codec.
++ encoded string *s*. Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode)
+
+ Encode a Unicode object using Raw-Unicode-Escape and return the result as
+- a bytes object. Error handling is "strict". Return *NULL* if an exception
++ a bytes object. Error handling is "strict". Return ``NULL`` if an exception
+ was raised by the codec.
+
+
+@@ -1349,7 +1349,7 @@ These are the "Raw Unicode Escape" codec APIs:
+ Py_ssize_t size)
+
+ Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Raw-Unicode-Escape
+- and return a bytes object. Return *NULL* if an exception was raised by the codec.
++ and return a bytes object. Return ``NULL`` if an exception was raised by the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+@@ -1367,20 +1367,20 @@ ordinals and only these are accepted by the codecs during encoding.
+ .. c:function:: PyObject* PyUnicode_DecodeLatin1(const char *s, Py_ssize_t size, const char *errors)
+
+ Create a Unicode object by decoding *size* bytes of the Latin-1 encoded string
+- *s*. Return *NULL* if an exception was raised by the codec.
++ *s*. Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_AsLatin1String(PyObject *unicode)
+
+ Encode a Unicode object using Latin-1 and return the result as Python bytes
+- object. Error handling is "strict". Return *NULL* if an exception was
++ object. Error handling is "strict". Return ``NULL`` if an exception was
+ raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_EncodeLatin1(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
+
+ Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Latin-1 and
+- return a Python bytes object. Return *NULL* if an exception was raised by
++ return a Python bytes object. Return ``NULL`` if an exception was raised by
+ the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+@@ -1399,20 +1399,20 @@ codes generate errors.
+ .. c:function:: PyObject* PyUnicode_DecodeASCII(const char *s, Py_ssize_t size, const char *errors)
+
+ Create a Unicode object by decoding *size* bytes of the ASCII encoded string
+- *s*. Return *NULL* if an exception was raised by the codec.
++ *s*. Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_AsASCIIString(PyObject *unicode)
+
+ Encode a Unicode object using ASCII and return the result as Python bytes
+- object. Error handling is "strict". Return *NULL* if an exception was
++ object. Error handling is "strict". Return ``NULL`` if an exception was
+ raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_EncodeASCII(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
+
+ Encode the :c:type:`Py_UNICODE` buffer of the given *size* using ASCII and
+- return a Python bytes object. Return *NULL* if an exception was raised by
++ return a Python bytes object. Return ``NULL`` if an exception was raised by
+ the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+@@ -1436,10 +1436,10 @@ These are the mapping codec APIs:
+ PyObject *mapping, const char *errors)
+
+ Create a Unicode object by decoding *size* bytes of the encoded string *s*
+- using the given *mapping* object. Return *NULL* if an exception was raised
++ using the given *mapping* object. Return ``NULL`` if an exception was raised
+ by the codec.
+
+- If *mapping* is *NULL*, Latin-1 decoding will be applied. Else
++ If *mapping* is ``NULL``, Latin-1 decoding will be applied. Else
+ *mapping* must map bytes ordinals (integers in the range from 0 to 255)
+ to Unicode strings, integers (which are then interpreted as Unicode
+ ordinals) or ``None``. Unmapped data bytes -- ones which cause a
+@@ -1451,7 +1451,7 @@ These are the mapping codec APIs:
+ .. c:function:: PyObject* PyUnicode_AsCharmapString(PyObject *unicode, PyObject *mapping)
+
+ Encode a Unicode object using the given *mapping* object and return the
+- result as a bytes object. Error handling is "strict". Return *NULL* if an
++ result as a bytes object. Error handling is "strict". Return ``NULL`` if an
+ exception was raised by the codec.
+
+ The *mapping* object must map Unicode ordinal integers to bytes objects,
+@@ -1464,7 +1464,7 @@ These are the mapping codec APIs:
+ PyObject *mapping, const char *errors)
+
+ Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given
+- *mapping* object and return the result as a bytes object. Return *NULL* if
++ *mapping* object and return the result as a bytes object. Return ``NULL`` if
+ an exception was raised by the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+@@ -1479,7 +1479,7 @@ The following codec API is special in that maps Unicode to Unicode.
+ PyObject *mapping, const char *errors)
+
+ Translate a Unicode object using the given *mapping* object and return the
+- resulting Unicode object. Return *NULL* if an exception was raised by the
++ resulting Unicode object. Return ``NULL`` if an exception was raised by the
+ codec.
+
+ The *mapping* object must map Unicode ordinal integers to Unicode strings,
+@@ -1493,7 +1493,7 @@ The following codec API is special in that maps Unicode to Unicode.
+
+ Translate a :c:type:`Py_UNICODE` buffer of the given *size* by applying a
+ character *mapping* table to it and return the resulting Unicode object.
+- Return *NULL* when an exception was raised by the codec.
++ Return ``NULL`` when an exception was raised by the codec.
+
+ .. deprecated-removed:: 3.3 4.0
+ Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using
+@@ -1512,14 +1512,14 @@ the user settings on the machine running the codec.
+ .. c:function:: PyObject* PyUnicode_DecodeMBCS(const char *s, Py_ssize_t size, const char *errors)
+
+ Create a Unicode object by decoding *size* bytes of the MBCS encoded string *s*.
+- Return *NULL* if an exception was raised by the codec.
++ Return ``NULL`` if an exception was raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_DecodeMBCSStateful(const char *s, Py_ssize_t size, \
+ const char *errors, Py_ssize_t *consumed)
+
+- If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeMBCS`. If
+- *consumed* is not *NULL*, :c:func:`PyUnicode_DecodeMBCSStateful` will not decode
++ If *consumed* is ``NULL``, behave like :c:func:`PyUnicode_DecodeMBCS`. If
++ *consumed* is not ``NULL``, :c:func:`PyUnicode_DecodeMBCSStateful` will not decode
+ trailing lead byte and the number of bytes that have been decoded will be stored
+ in *consumed*.
+
+@@ -1527,14 +1527,14 @@ the user settings on the machine running the codec.
+ .. c:function:: PyObject* PyUnicode_AsMBCSString(PyObject *unicode)
+
+ Encode a Unicode object using MBCS and return the result as Python bytes
+- object. Error handling is "strict". Return *NULL* if an exception was
++ object. Error handling is "strict". Return ``NULL`` if an exception was
+ raised by the codec.
+
+
+ .. c:function:: PyObject* PyUnicode_EncodeCodePage(int code_page, PyObject *unicode, const char *errors)
+
+ Encode the Unicode object using the specified code page and return a Python
+- bytes object. Return *NULL* if an exception was raised by the codec. Use
++ bytes object. Return ``NULL`` if an exception was raised by the codec. Use
+ :c:data:`CP_ACP` code page to get the MBCS encoder.
+
+ .. versionadded:: 3.3
+@@ -1543,7 +1543,7 @@ the user settings on the machine running the codec.
+ .. c:function:: PyObject* PyUnicode_EncodeMBCS(const Py_UNICODE *s, Py_ssize_t size, const char *errors)
+
+ Encode the :c:type:`Py_UNICODE` buffer of the given *size* using MBCS and return
+- a Python bytes object. Return *NULL* if an exception was raised by the
++ a Python bytes object. Return ``NULL`` if an exception was raised by the
+ codec.
+
+ .. deprecated-removed:: 3.3 4.0
+@@ -1565,7 +1565,7 @@ The following APIs are capable of handling Unicode objects and strings on input
+ (we refer to them as strings in the descriptions) and return Unicode objects or
+ integers as appropriate.
+
+-They all return *NULL* or ``-1`` if an exception occurs.
++They all return ``NULL`` or ``-1`` if an exception occurs.
+
+
+ .. c:function:: PyObject* PyUnicode_Concat(PyObject *left, PyObject *right)
+@@ -1575,7 +1575,7 @@ They all return *NULL* or ``-1`` if an exception occurs.
+
+ .. c:function:: PyObject* PyUnicode_Split(PyObject *s, PyObject *sep, Py_ssize_t maxsplit)
+
+- Split a string giving a list of Unicode strings. If *sep* is *NULL*, splitting
++ Split a string giving a list of Unicode strings. If *sep* is ``NULL``, splitting
+ will be done at all whitespace substrings. Otherwise, splits occur at the given
+ separator. At most *maxsplit* splits will be done. If negative, no limit is
+ set. Separators are not included in the resulting list.
+@@ -1601,7 +1601,7 @@ They all return *NULL* or ``-1`` if an exception occurs.
+ and sequences work well. Unmapped character ordinals (ones which cause a
+ :exc:`LookupError`) are left untouched and are copied as-is.
+
+- *errors* has the usual meaning for codecs. It may be *NULL* which indicates to
++ *errors* has the usual meaning for codecs. It may be ``NULL`` which indicates to
+ use the default error handling.
+
+
+diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst
+index 67dc11dfa9..98cea52ab7 100644
+--- a/Doc/c-api/veryhigh.rst
++++ b/Doc/c-api/veryhigh.rst
+@@ -52,7 +52,7 @@ the same library that the Python runtime is using.
+ .. c:function:: int PyRun_AnyFile(FILE *fp, const char *filename)
+
+ This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, leaving
+- *closeit* set to ``0`` and *flags* set to *NULL*.
++ *closeit* set to ``0`` and *flags* set to ``NULL``.
+
+
+ .. c:function:: int PyRun_AnyFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
+@@ -64,7 +64,7 @@ the same library that the Python runtime is using.
+ .. c:function:: int PyRun_AnyFileEx(FILE *fp, const char *filename, int closeit)
+
+ This is a simplified interface to :c:func:`PyRun_AnyFileExFlags` below, leaving
+- the *flags* argument set to *NULL*.
++ the *flags* argument set to ``NULL``.
+
+
+ .. c:function:: int PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)
+@@ -73,14 +73,14 @@ the same library that the Python runtime is using.
+ terminal input or Unix pseudo-terminal), return the value of
+ :c:func:`PyRun_InteractiveLoop`, otherwise return the result of
+ :c:func:`PyRun_SimpleFile`. *filename* is decoded from the filesystem
+- encoding (:func:`sys.getfilesystemencoding`). If *filename* is *NULL*, this
++ encoding (:func:`sys.getfilesystemencoding`). If *filename* is ``NULL``, this
+ function uses ``"???"`` as the filename.
+
+
+ .. c:function:: int PyRun_SimpleString(const char *command)
+
+ This is a simplified interface to :c:func:`PyRun_SimpleStringFlags` below,
+- leaving the *PyCompilerFlags\** argument set to NULL.
++ leaving the :c:type:`PyCompilerFlags`\* argument set to ``NULL``.
+
+
+ .. c:function:: int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
+@@ -99,13 +99,13 @@ the same library that the Python runtime is using.
+ .. c:function:: int PyRun_SimpleFile(FILE *fp, const char *filename)
+
+ This is a simplified interface to :c:func:`PyRun_SimpleFileExFlags` below,
+- leaving *closeit* set to ``0`` and *flags* set to *NULL*.
++ leaving *closeit* set to ``0`` and *flags* set to ``NULL``.
+
+
+ .. c:function:: int PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit)
+
+ This is a simplified interface to :c:func:`PyRun_SimpleFileExFlags` below,
+- leaving *flags* set to *NULL*.
++ leaving *flags* set to ``NULL``.
+
+
+ .. c:function:: int PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)
+@@ -124,7 +124,7 @@ the same library that the Python runtime is using.
+ .. c:function:: int PyRun_InteractiveOne(FILE *fp, const char *filename)
+
+ This is a simplified interface to :c:func:`PyRun_InteractiveOneFlags` below,
+- leaving *flags* set to *NULL*.
++ leaving *flags* set to ``NULL``.
+
+
+ .. c:function:: int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
+@@ -144,7 +144,7 @@ the same library that the Python runtime is using.
+ .. c:function:: int PyRun_InteractiveLoop(FILE *fp, const char *filename)
+
+ This is a simplified interface to :c:func:`PyRun_InteractiveLoopFlags` below,
+- leaving *flags* set to *NULL*.
++ leaving *flags* set to ``NULL``.
+
+
+ .. c:function:: int PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
+@@ -173,13 +173,13 @@ the same library that the Python runtime is using.
+ ``char *func(FILE *stdin, FILE *stdout, char *prompt)``,
+ overriding the default function used to read a single line of input
+ at the interpreter's prompt. The function is expected to output
+- the string *prompt* if it's not *NULL*, and then read a line of
++ the string *prompt* if it's not ``NULL``, and then read a line of
+ input from the provided standard input file, returning the
+ resulting string. For example, The :mod:`readline` module sets
+ this hook to provide line-editing and tab-completion features.
+
+ The result must be a string allocated by :c:func:`PyMem_RawMalloc` or
+- :c:func:`PyMem_RawRealloc`, or *NULL* if an error occurred.
++ :c:func:`PyMem_RawRealloc`, or ``NULL`` if an error occurred.
+
+ .. versionchanged:: 3.4
+ The result must be allocated by :c:func:`PyMem_RawMalloc` or
+@@ -191,14 +191,14 @@ the same library that the Python runtime is using.
+
+ This is a simplified interface to
+ :c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set
+- to *NULL* and *flags* set to ``0``.
++ to ``NULL`` and *flags* set to ``0``.
+
+
+ .. c:function:: struct _node* PyParser_SimpleParseStringFlags( const char *str, int start, int flags)
+
+ This is a simplified interface to
+ :c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set
+- to *NULL*.
++ to ``NULL``.
+
+
+ .. c:function:: struct _node* PyParser_SimpleParseStringFlagsFilename( const char *str, const char *filename, int start, int flags)
+@@ -225,7 +225,7 @@ the same library that the Python runtime is using.
+ .. c:function:: PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals)
+
+ This is a simplified interface to :c:func:`PyRun_StringFlags` below, leaving
+- *flags* set to *NULL*.
++ *flags* set to ``NULL``.
+
+
+ .. c:function:: PyObject* PyRun_StringFlags(const char *str, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
+@@ -236,20 +236,20 @@ the same library that the Python runtime is using.
+ that implements the mapping protocol. The parameter *start* specifies
+ the start token that should be used to parse the source code.
+
+- Returns the result of executing the code as a Python object, or *NULL* if an
++ Returns the result of executing the code as a Python object, or ``NULL`` if an
+ exception was raised.
+
+
+ .. c:function:: PyObject* PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
+
+ This is a simplified interface to :c:func:`PyRun_FileExFlags` below, leaving
+- *closeit* set to ``0`` and *flags* set to *NULL*.
++ *closeit* set to ``0`` and *flags* set to ``NULL``.
+
+
+ .. c:function:: PyObject* PyRun_FileEx(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit)
+
+ This is a simplified interface to :c:func:`PyRun_FileExFlags` below, leaving
+- *flags* set to *NULL*.
++ *flags* set to ``NULL``.
+
+
+ .. c:function:: PyObject* PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
+@@ -270,7 +270,7 @@ the same library that the Python runtime is using.
+ .. c:function:: PyObject* Py_CompileString(const char *str, const char *filename, int start)
+
+ This is a simplified interface to :c:func:`Py_CompileStringFlags` below, leaving
+- *flags* set to *NULL*.
++ *flags* set to ``NULL``.
+
+
+ .. c:function:: PyObject* Py_CompileStringFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags)
+@@ -286,7 +286,7 @@ the same library that the Python runtime is using.
+ code which can be compiled and should be :const:`Py_eval_input`,
+ :const:`Py_file_input`, or :const:`Py_single_input`. The filename specified by
+ *filename* is used to construct the code object and may appear in tracebacks or
+- :exc:`SyntaxError` exception messages. This returns *NULL* if the code
++ :exc:`SyntaxError` exception messages. This returns ``NULL`` if the code
+ cannot be parsed or compiled.
+
+ The integer *optimize* specifies the optimization level of the compiler; a
+@@ -309,7 +309,7 @@ the same library that the Python runtime is using.
+
+ This is a simplified interface to :c:func:`PyEval_EvalCodeEx`, with just
+ the code object, and global and local variables. The other arguments are
+- set to *NULL*.
++ set to ``NULL``.
+
+
+ .. c:function:: PyObject* PyEval_EvalCodeEx(PyObject *co, PyObject *globals, PyObject *locals, PyObject *const *args, int argcount, PyObject *const *kws, int kwcount, PyObject *const *defs, int defcount, PyObject *kwdefs, PyObject *closure)
+@@ -386,7 +386,7 @@ the same library that the Python runtime is using.
+ executed, it is passed as ``PyCompilerFlags *flags``. In this case, ``from
+ __future__ import`` can modify *flags*.
+
+- Whenever ``PyCompilerFlags *flags`` is *NULL*, :attr:`cf_flags` is treated as
++ Whenever ``PyCompilerFlags *flags`` is ``NULL``, :attr:`cf_flags` is treated as
+ equal to ``0``, and any modification due to ``from __future__ import`` is
+ discarded.
+
+diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst
+index 7a4f8615b9..e3a9bda54d 100644
+--- a/Doc/c-api/weakref.rst
++++ b/Doc/c-api/weakref.rst
+@@ -33,9 +33,9 @@ as much as it can.
+ reference object may be returned. The second parameter, *callback*, can be a
+ callable object that receives notification when *ob* is garbage collected; it
+ should accept a single parameter, which will be the weak reference object
+- itself. *callback* may also be ``None`` or *NULL*. If *ob* is not a
++ itself. *callback* may also be ``None`` or ``NULL``. If *ob* is not a
+ weakly-referencable object, or if *callback* is not callable, ``None``, or
+- *NULL*, this will return *NULL* and raise :exc:`TypeError`.
++ ``NULL``, this will return ``NULL`` and raise :exc:`TypeError`.
+
+
+ .. c:function:: PyObject* PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
+@@ -45,9 +45,9 @@ as much as it can.
+ existing proxy object may be returned. The second parameter, *callback*, can
+ be a callable object that receives notification when *ob* is garbage
+ collected; it should accept a single parameter, which will be the weak
+- reference object itself. *callback* may also be ``None`` or *NULL*. If *ob*
++ reference object itself. *callback* may also be ``None`` or ``NULL``. If *ob*
+ is not a weakly-referencable object, or if *callback* is not callable,
+- ``None``, or *NULL*, this will return *NULL* and raise :exc:`TypeError`.
++ ``None``, or ``NULL``, this will return ``NULL`` and raise :exc:`TypeError`.
+
+
+ .. c:function:: PyObject* PyWeakref_GetObject(PyObject *ref)
+diff --git a/Doc/distributing/index.rst b/Doc/distributing/index.rst
+index 2e46c7ac86..5f7b3bbc4f 100644
+--- a/Doc/distributing/index.rst
++++ b/Doc/distributing/index.rst
+@@ -40,7 +40,7 @@ Key terms
+ evolution of the standard packaging tools and the associated metadata and
+ file format standards. They maintain a variety of tools, documentation
+ and issue trackers on both `GitHub <https://github.com/pypa>`__ and
+- `BitBucket <https://bitbucket.org/pypa/>`__.
++ `Bitbucket <https://bitbucket.org/pypa/>`__.
+ * :mod:`distutils` is the original build and distribution system first added
+ to the Python standard library in 1998. While direct use of :mod:`distutils`
+ is being phased out, it still laid the foundation for the current packaging
+@@ -148,7 +148,7 @@ These are quick answers or links for some common tasks.
+ This isn't an easy topic, but here are a few tips:
+
+ * check the Python Packaging Index to see if the name is already in use
+-* check popular hosting sites like GitHub, BitBucket, etc to see if there
++* check popular hosting sites like GitHub, Bitbucket, etc to see if there
+ is already a project with that name
+ * check what comes up in a web search for the name you're considering
+ * avoid particularly common words, especially ones with multiple meanings,
+diff --git a/Doc/extending/embedding.rst b/Doc/extending/embedding.rst
+index 483bc852f6..5f5abdf9c1 100644
+--- a/Doc/extending/embedding.rst
++++ b/Doc/extending/embedding.rst
+@@ -196,7 +196,7 @@ function is then made with::
+
+ pValue = PyObject_CallObject(pFunc, pArgs);
+
+-Upon return of the function, ``pValue`` is either *NULL* or it contains a
++Upon return of the function, ``pValue`` is either ``NULL`` or it contains a
+ reference to the return value of the function. Be sure to release the reference
+ after examining the value.
+
+diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst
+index 5b4ea8220e..5b32a2cdc5 100644
+--- a/Doc/extending/extending.rst
++++ b/Doc/extending/extending.rst
+@@ -117,7 +117,7 @@ store the converted values. More about this later.
+ type and its components have been stored in the variables whose addresses are
+ passed. It returns false (zero) if an invalid argument list was passed. In the
+ latter case it also raises an appropriate exception so the calling function can
+-return *NULL* immediately (as we saw in the example).
++return ``NULL`` immediately (as we saw in the example).
+
+
+ .. _extending-errors:
+@@ -127,8 +127,8 @@ Intermezzo: Errors and Exceptions
+
+ An important convention throughout the Python interpreter is the following: when
+ a function fails, it should set an exception condition and return an error value
+-(usually a *NULL* pointer). Exceptions are stored in a static global variable
+-inside the interpreter; if this variable is *NULL* no exception has occurred. A
++(usually a ``NULL`` pointer). Exceptions are stored in a static global variable
++inside the interpreter; if this variable is ``NULL`` no exception has occurred. A
+ second global variable stores the "associated value" of the exception (the
+ second argument to :keyword:`raise`). A third variable contains the stack
+ traceback in case the error originated in Python code. These three variables
+@@ -152,13 +152,13 @@ its associated value. You don't need to :c:func:`Py_INCREF` the objects passed
+ to any of these functions.
+
+ You can test non-destructively whether an exception has been set with
+-:c:func:`PyErr_Occurred`. This returns the current exception object, or *NULL*
++:c:func:`PyErr_Occurred`. This returns the current exception object, or ``NULL``
+ if no exception has occurred. You normally don't need to call
+ :c:func:`PyErr_Occurred` to see whether an error occurred in a function call,
+ since you should be able to tell from the return value.
+
+ When a function *f* that calls another function *g* detects that the latter
+-fails, *f* should itself return an error value (usually *NULL* or ``-1``). It
++fails, *f* should itself return an error value (usually ``NULL`` or ``-1``). It
+ should *not* call one of the :c:func:`PyErr_\*` functions --- one has already
+ been called by *g*. *f*'s caller is then supposed to also return an error
+ indication to *its* caller, again *without* calling :c:func:`PyErr_\*`, and so on
+@@ -234,7 +234,7 @@ with an exception object::
+
+ Note that the Python name for the exception object is :exc:`spam.error`. The
+ :c:func:`PyErr_NewException` function may create a class with the base class
+-being :exc:`Exception` (unless another class is passed in instead of *NULL*),
++being :exc:`Exception` (unless another class is passed in instead of ``NULL``),
+ described in :ref:`bltin-exceptions`.
+
+ Note also that the :c:data:`SpamError` variable retains a reference to the newly
+@@ -278,7 +278,7 @@ statement::
+ if (!PyArg_ParseTuple(args, "s", &command))
+ return NULL;
+
+-It returns *NULL* (the error indicator for functions returning object pointers)
++It returns ``NULL`` (the error indicator for functions returning object pointers)
+ if an error is detected in the argument list, relying on the exception set by
+ :c:func:`PyArg_ParseTuple`. Otherwise the string value of the argument has been
+ copied to the local variable :c:data:`command`. This is a pointer assignment and
+@@ -308,7 +308,7 @@ macro)::
+ return Py_None;
+
+ :c:data:`Py_None` is the C name for the special Python object ``None``. It is a
+-genuine Python object rather than a *NULL* pointer, which means "error" in most
++genuine Python object rather than a ``NULL`` pointer, which means "error" in most
+ contexts, as we have seen.
+
+
+@@ -376,7 +376,7 @@ inserts built-in function objects into the newly created module based upon the
+ table (an array of :c:type:`PyMethodDef` structures) found in the module definition.
+ :c:func:`PyModule_Create` returns a pointer to the module object
+ that it creates. It may abort with a fatal error for
+-certain errors, or return *NULL* if the module could not be initialized
++certain errors, or return ``NULL`` if the module could not be initialized
+ satisfactorily. The init function must return the module object to its caller,
+ so that it then gets inserted into ``sys.modules``.
+
+@@ -526,8 +526,8 @@ This function must be registered with the interpreter using the
+ :ref:`parsetuple`.
+
+ The macros :c:func:`Py_XINCREF` and :c:func:`Py_XDECREF` increment/decrement the
+-reference count of an object and are safe in the presence of *NULL* pointers
+-(but note that *temp* will not be *NULL* in this context). More info on them
++reference count of an object and are safe in the presence of ``NULL`` pointers
++(but note that *temp* will not be ``NULL`` in this context). More info on them
+ in section :ref:`refcounts`.
+
+ .. index:: single: PyObject_CallObject()
+@@ -536,7 +536,7 @@ Later, when it is time to call the function, you call the C function
+ :c:func:`PyObject_CallObject`. This function has two arguments, both pointers to
+ arbitrary Python objects: the Python function, and the argument list. The
+ argument list must always be a tuple object, whose length is the number of
+-arguments. To call the Python function with no arguments, pass in NULL, or
++arguments. To call the Python function with no arguments, pass in ``NULL``, or
+ an empty tuple; to call it with one argument, pass a singleton tuple.
+ :c:func:`Py_BuildValue` returns a tuple when its format string consists of zero
+ or more format codes between parentheses. For example::
+@@ -566,7 +566,7 @@ somehow :c:func:`Py_DECREF` the result, even (especially!) if you are not
+ interested in its value.
+
+ Before you do this, however, it is important to check that the return value
+-isn't *NULL*. If it is, the Python function terminated by raising an exception.
++isn't ``NULL``. If it is, the Python function terminated by raising an exception.
+ If the C code that called :c:func:`PyObject_CallObject` is called from Python, it
+ should now return an error indication to its Python caller, so the interpreter
+ can print a stack trace, or the calling Python code can handle the exception.
+@@ -723,7 +723,7 @@ The :c:func:`PyArg_ParseTupleAndKeywords` function is declared as follows::
+ The *arg* and *format* parameters are identical to those of the
+ :c:func:`PyArg_ParseTuple` function. The *kwdict* parameter is the dictionary of
+ keywords received as the third parameter from the Python runtime. The *kwlist*
+-parameter is a *NULL*-terminated list of strings which identify the parameters;
++parameter is a ``NULL``-terminated list of strings which identify the parameters;
+ the names are matched with the type information from *format* from left to
+ right. On success, :c:func:`PyArg_ParseTupleAndKeywords` returns true, otherwise
+ it returns false and raises an appropriate exception.
+@@ -1084,32 +1084,32 @@ NULL Pointers
+ -------------
+
+ In general, functions that take object references as arguments do not expect you
+-to pass them *NULL* pointers, and will dump core (or cause later core dumps) if
+-you do so. Functions that return object references generally return *NULL* only
+-to indicate that an exception occurred. The reason for not testing for *NULL*
++to pass them ``NULL`` pointers, and will dump core (or cause later core dumps) if
++you do so. Functions that return object references generally return ``NULL`` only
++to indicate that an exception occurred. The reason for not testing for ``NULL``
+ arguments is that functions often pass the objects they receive on to other
+-function --- if each function were to test for *NULL*, there would be a lot of
++function --- if each function were to test for ``NULL``, there would be a lot of
+ redundant tests and the code would run more slowly.
+
+-It is better to test for *NULL* only at the "source:" when a pointer that may be
+-*NULL* is received, for example, from :c:func:`malloc` or from a function that
++It is better to test for ``NULL`` only at the "source:" when a pointer that may be
++``NULL`` is received, for example, from :c:func:`malloc` or from a function that
+ may raise an exception.
+
+-The macros :c:func:`Py_INCREF` and :c:func:`Py_DECREF` do not check for *NULL*
++The macros :c:func:`Py_INCREF` and :c:func:`Py_DECREF` do not check for ``NULL``
+ pointers --- however, their variants :c:func:`Py_XINCREF` and :c:func:`Py_XDECREF`
+ do.
+
+ The macros for checking for a particular object type (``Pytype_Check()``) don't
+-check for *NULL* pointers --- again, there is much code that calls several of
++check for ``NULL`` pointers --- again, there is much code that calls several of
+ these in a row to test an object against various different expected types, and
+-this would generate redundant tests. There are no variants with *NULL*
++this would generate redundant tests. There are no variants with ``NULL``
+ checking.
+
+ The C function calling mechanism guarantees that the argument list passed to C
+-functions (``args`` in the examples) is never *NULL* --- in fact it guarantees
++functions (``args`` in the examples) is never ``NULL`` --- in fact it guarantees
+ that it is always a tuple [#]_.
+
+-It is a severe error to ever let a *NULL* pointer "escape" to the Python user.
++It is a severe error to ever let a ``NULL`` pointer "escape" to the Python user.
+
+ .. Frank Stajano:
+ A pedagogically buggy example, along the lines of the previous listing, would
+@@ -1184,7 +1184,7 @@ different ways between the module providing the code and the client modules.
+
+ Whichever method you choose, it's important to name your Capsules properly.
+ The function :c:func:`PyCapsule_New` takes a name parameter
+-(:c:type:`const char \*`); you're permitted to pass in a *NULL* name, but
++(:c:type:`const char \*`); you're permitted to pass in a ``NULL`` name, but
+ we strongly encourage you to specify a name. Properly named Capsules provide
+ a degree of runtime type-safety; there is no feasible way to tell one unnamed
+ Capsule from another.
+diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst
+index 308c06705e..19c5e51537 100644
+--- a/Doc/extending/newtypes.rst
++++ b/Doc/extending/newtypes.rst
+@@ -191,7 +191,7 @@ For every object which can support attributes, the corresponding type must
+ provide the functions that control how the attributes are resolved. There needs
+ to be a function which can retrieve attributes (if any are defined), and another
+ to set attributes (if setting attributes is allowed). Removing an attribute is
+-a special case, for which the new value passed to the handler is *NULL*.
++a special case, for which the new value passed to the handler is ``NULL``.
+
+ Python supports two pairs of attribute handlers; a type that supports attributes
+ only needs to implement the functions for one pair. The difference is that one
+@@ -233,9 +233,9 @@ attributes, when the values are computed, or how relevant data is stored.
+ When :c:func:`PyType_Ready` is called, it uses three tables referenced by the
+ type object to create :term:`descriptor`\s which are placed in the dictionary of the
+ type object. Each descriptor controls access to one attribute of the instance
+-object. Each of the tables is optional; if all three are *NULL*, instances of
++object. Each of the tables is optional; if all three are ``NULL``, instances of
+ the type will only have attributes that are inherited from their base type, and
+-should leave the :c:member:`~PyTypeObject.tp_getattro` and :c:member:`~PyTypeObject.tp_setattro` fields *NULL* as
++should leave the :c:member:`~PyTypeObject.tp_getattro` and :c:member:`~PyTypeObject.tp_setattro` fields ``NULL`` as
+ well, allowing the base type to handle attributes.
+
+ The tables are declared as three fields of the type object::
+@@ -244,7 +244,7 @@ The tables are declared as three fields of the type object::
+ struct PyMemberDef *tp_members;
+ struct PyGetSetDef *tp_getset;
+
+-If :c:member:`~PyTypeObject.tp_methods` is not *NULL*, it must refer to an array of
++If :c:member:`~PyTypeObject.tp_methods` is not ``NULL``, it must refer to an array of
+ :c:type:`PyMethodDef` structures. Each entry in the table is an instance of this
+ structure::
+
+@@ -258,7 +258,7 @@ structure::
+ One entry should be defined for each method provided by the type; no entries are
+ needed for methods inherited from a base type. One additional entry is needed
+ at the end; it is a sentinel that marks the end of the array. The
+-:attr:`ml_name` field of the sentinel must be *NULL*.
++:attr:`ml_name` field of the sentinel must be ``NULL``.
+
+ The second table is used to define attributes which map directly to data stored
+ in the instance. A variety of primitive C types are supported, and access may
+@@ -307,7 +307,7 @@ application can use the introspection API to retrieve the descriptor from the
+ class object, and get the doc string using its :attr:`__doc__` attribute.
+
+ As with the :c:member:`~PyTypeObject.tp_methods` table, a sentinel entry with a :attr:`name` value
+-of *NULL* is required.
++of ``NULL`` is required.
+
+ .. XXX Descriptors need to be explained in more detail somewhere, but not here.
+
+@@ -352,9 +352,9 @@ Here is an example::
+
+ The :c:member:`~PyTypeObject.tp_setattr` handler is called when the :meth:`__setattr__` or
+ :meth:`__delattr__` method of a class instance would be called. When an
+-attribute should be deleted, the third parameter will be *NULL*. Here is an
++attribute should be deleted, the third parameter will be ``NULL``. Here is an
+ example that simply raises an exception; if this were really all you wanted, the
+-:c:member:`~PyTypeObject.tp_setattr` handler should be set to *NULL*. ::
++:c:member:`~PyTypeObject.tp_setattr` handler should be set to ``NULL``. ::
+
+ static int
+ newdatatype_setattr(newdatatypeobject *obj, char *name, PyObject *v)
+@@ -380,7 +380,7 @@ where the operator is one of ``Py_EQ``, ``Py_NE``, ``Py_LE``, ``Py_GT``,
+ ``Py_LT`` or ``Py_GT``. It should compare the two objects with respect to the
+ specified operator and return ``Py_True`` or ``Py_False`` if the comparison is
+ successful, ``Py_NotImplemented`` to indicate that comparison is not
+-implemented and the other object's comparison method should be tried, or *NULL*
++implemented and the other object's comparison method should be tried, or ``NULL``
+ if an exception was set.
+
+ Here is a sample implementation, for a datatype that is considered equal if the
+@@ -427,7 +427,7 @@ from the type implementation, the older protocols have been defined as optional
+ blocks of handlers referenced by the type object. For newer protocols there are
+ additional slots in the main type object, with a flag bit being set to indicate
+ that the slots are present and should be checked by the interpreter. (The flag
+-bit does not indicate that the slot values are non-*NULL*. The flag may be set
++bit does not indicate that the slot values are non-``NULL``. The flag may be set
+ to indicate the presence of a slot, but a slot may still be unfilled.) ::
+
+ PyNumberMethods *tp_as_number;
+@@ -478,9 +478,9 @@ This function takes three arguments:
+ :c:func:`PyArg_ParseTuple` to extract the arguments.
+
+ #. *kwds* is a dictionary of keyword arguments that were passed. If this is
+- non-*NULL* and you support keyword arguments, use
++ non-``NULL`` and you support keyword arguments, use
+ :c:func:`PyArg_ParseTupleAndKeywords` to extract the arguments. If you
+- do not want to support keyword arguments and this is non-*NULL*, raise a
++ do not want to support keyword arguments and this is non-``NULL``, raise a
+ :exc:`TypeError` with a message saying that keyword arguments are not supported.
+
+ Here is a toy ``tp_call`` implementation::
+@@ -512,7 +512,7 @@ Here is a toy ``tp_call`` implementation::
+ These functions provide support for the iterator protocol. Both handlers
+ take exactly one parameter, the instance for which they are being called,
+ and return a new reference. In the case of an error, they should set an
+-exception and return *NULL*. :c:member:`~PyTypeObject.tp_iter` corresponds
++exception and return ``NULL``. :c:member:`~PyTypeObject.tp_iter` corresponds
+ to the Python :meth:`__iter__` method, while :c:member:`~PyTypeObject.tp_iternext`
+ corresponds to the Python :meth:`~iterator.__next__` method.
+
+@@ -534,11 +534,11 @@ and :c:member:`~PyTypeObject.tp_iternext`. An iterator's
+ to the iterator. Its :c:member:`~PyTypeObject.tp_iternext` handler should
+ return a new reference to the next object in the iteration, if there is one.
+ If the iteration has reached the end, :c:member:`~PyTypeObject.tp_iternext`
+-may return *NULL* without setting an exception, or it may set
+-:exc:`StopIteration` *in addition* to returning *NULL*; avoiding
++may return ``NULL`` without setting an exception, or it may set
++:exc:`StopIteration` *in addition* to returning ``NULL``; avoiding
+ the exception can yield slightly better performance. If an actual error
+ occurs, :c:member:`~PyTypeObject.tp_iternext` should always set an exception
+-and return *NULL*.
++and return ``NULL``.
+
+
+ .. _weakref-support:
+@@ -557,7 +557,7 @@ For an object to be weakly referencable, the extension type must do two things:
+
+ #. Include a :c:type:`PyObject\*` field in the C object structure dedicated to
+ the weak reference mechanism. The object's constructor should leave it
+- *NULL* (which is automatic when using the default
++ ``NULL`` (which is automatic when using the default
+ :c:member:`~PyTypeObject.tp_alloc`).
+
+ #. Set the :c:member:`~PyTypeObject.tp_weaklistoffset` type member
+@@ -582,7 +582,7 @@ And the corresponding member in the statically-declared type object::
+
+ The only further addition is that ``tp_dealloc`` needs to clear any weak
+ references (by calling :c:func:`PyObject_ClearWeakRefs`) if the field is
+-non-*NULL*::
++non-``NULL``::
+
+ static void
+ Trivial_dealloc(TrivialObject *self)
+diff --git a/Doc/extending/newtypes_tutorial.rst b/Doc/extending/newtypes_tutorial.rst
+index b2c819c858..0eb6ffd026 100644
+--- a/Doc/extending/newtypes_tutorial.rst
++++ b/Doc/extending/newtypes_tutorial.rst
+@@ -177,7 +177,7 @@ Everything else in the file should be familiar, except for some code in
+
+ This initializes the :class:`Custom` type, filling in a number of members
+ to the appropriate default values, including :attr:`ob_type` that we initially
+-set to *NULL*. ::
++set to ``NULL``. ::
+
+ Py_INCREF(&CustomType);
+ if (PyModule_AddObject(m, "Custom", (PyObject *) &CustomType) < 0) {
+@@ -275,7 +275,7 @@ which is assigned to the :c:member:`~PyTypeObject.tp_dealloc` member::
+
+ This method first clears the reference counts of the two Python attributes.
+ :c:func:`Py_XDECREF` correctly handles the case where its argument is
+-*NULL* (which might happen here if ``tp_new`` failed midway). It then
++``NULL`` (which might happen here if ``tp_new`` failed midway). It then
+ calls the :c:member:`~PyTypeObject.tp_free` member of the object's type
+ (computed by ``Py_TYPE(self)``) to free the object's memory. Note that
+ the object's type might not be :class:`CustomType`, because the object may
+@@ -321,7 +321,7 @@ objects of the type. It is exposed in Python as the :meth:`__new__` method.
+ It is not required to define a ``tp_new`` member, and indeed many extension
+ types will simply reuse :c:func:`PyType_GenericNew` as done in the first
+ version of the ``Custom`` type above. In this case, we use the ``tp_new``
+-handler to initialize the ``first`` and ``last`` attributes to non-*NULL*
++handler to initialize the ``first`` and ``last`` attributes to non-``NULL``
+ default values.
+
+ ``tp_new`` is passed the type being instantiated (not necessarily ``CustomType``,
+@@ -341,7 +341,7 @@ slot to allocate memory::
+ self = (CustomObject *) type->tp_alloc(type, 0);
+
+ Since memory allocation may fail, we must check the :c:member:`~PyTypeObject.tp_alloc`
+-result against *NULL* before proceeding.
++result against ``NULL`` before proceeding.
+
+ .. note::
+ We didn't fill the :c:member:`~PyTypeObject.tp_alloc` slot ourselves. Rather
+@@ -455,9 +455,9 @@ below for details.
+ A disadvantage of this approach is that it doesn't provide a way to restrict the
+ types of objects that can be assigned to the Python attributes. We expect the
+ first and last names to be strings, but any Python objects can be assigned.
+-Further, the attributes can be deleted, setting the C pointers to *NULL*. Even
+-though we can make sure the members are initialized to non-*NULL* values, the
+-members can be set to *NULL* if the attributes are deleted.
++Further, the attributes can be deleted, setting the C pointers to ``NULL``. Even
++though we can make sure the members are initialized to non-``NULL`` values, the
++members can be set to ``NULL`` if the attributes are deleted.
+
+ We define a single method, :meth:`Custom.name()`, that outputs the objects name as the
+ concatenation of the first and last names. ::
+@@ -489,8 +489,8 @@ equivalent to the Python method:
+ return "%s %s" % (self.first, self.last)
+
+ Note that we have to check for the possibility that our :attr:`first` and
+-:attr:`last` members are *NULL*. This is because they can be deleted, in which
+-case they are set to *NULL*. It would be better to prevent deletion of these
++:attr:`last` members are ``NULL``. This is because they can be deleted, in which
++case they are set to ``NULL``. It would be better to prevent deletion of these
+ attributes and to restrict the attribute values to be strings. We'll see how to
+ do that in the next section.
+
+@@ -584,7 +584,7 @@ could, for example, be used to allow a single set of getter and setter functions
+ that decide the attribute to get or set based on data in the closure.)
+
+ The setter function is passed the :class:`Custom` object, the new value, and the
+-closure. The new value may be *NULL*, in which case the attribute is being
++closure. The new value may be ``NULL``, in which case the attribute is being
+ deleted. In our setter, we raise an error if the attribute is deleted or if its
+ new value is not a string.
+
+@@ -603,7 +603,7 @@ and register it in the :c:member:`~PyTypeObject.tp_getset` slot::
+ .tp_getset = Custom_getsetters,
+
+ The last item in a :c:type:`PyGetSetDef` structure is the "closure" mentioned
+-above. In this case, we aren't using a closure, so we just pass *NULL*.
++above. In this case, we aren't using a closure, so we just pass ``NULL``.
+
+ We also remove the member definitions for these attributes::
+
+@@ -643,7 +643,7 @@ allow strings [#]_ to be passed::
+ }
+
+ With these changes, we can assure that the ``first`` and ``last`` members are
+-never *NULL* so we can remove checks for *NULL* values in almost all cases.
++never ``NULL`` so we can remove checks for ``NULL`` values in almost all cases.
+ This means that most of the :c:func:`Py_XDECREF` calls can be converted to
+ :c:func:`Py_DECREF` calls. The only place we can't change these calls is in
+ the ``tp_dealloc`` implementation, where there is the possibility that the
+@@ -749,7 +749,7 @@ participate in cycles::
+ Notice the use of the :c:func:`Py_CLEAR` macro. It is the recommended and safe
+ way to clear data attributes of arbitrary types while decrementing
+ their reference counts. If you were to call :c:func:`Py_XDECREF` instead
+-on the attribute before setting it to *NULL*, there is a possibility
++on the attribute before setting it to ``NULL``, there is a possibility
+ that the attribute's destructor would call back into code that reads the
+ attribute again (*especially* if there is a reference cycle).
+
+diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst
+index 2ad2765870..aecb56eaa4 100644
+--- a/Doc/faq/extending.rst
++++ b/Doc/faq/extending.rst
+@@ -89,7 +89,7 @@ For bytes, :c:func:`PyBytes_Size` returns its length and
+ length. Note that Python bytes objects may contain null bytes so C's
+ :c:func:`strlen` should not be used.
+
+-To test the type of an object, first make sure it isn't *NULL*, and then use
++To test the type of an object, first make sure it isn't ``NULL``, and then use
+ :c:func:`PyBytes_Check`, :c:func:`PyTuple_Check`, :c:func:`PyList_Check`, etc.
+
+ There is also a high-level API to Python objects which is provided by the
+diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst
+index cfd9f2e407..50041829b8 100644
+--- a/Doc/howto/clinic.rst
++++ b/Doc/howto/clinic.rst
+@@ -1070,7 +1070,7 @@ Currently Argument Clinic supports only a few return converters:
+ DecodeFSDefault
+
+ None of these take parameters. For the first three, return -1 to indicate
+-error. For ``DecodeFSDefault``, the return type is ``const char *``; return a NULL
++error. For ``DecodeFSDefault``, the return type is ``const char *``; return a ``NULL``
+ pointer to indicate an error.
+
+ (There's also an experimental ``NoneType`` converter, which lets you
+diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst
+index 9f52780af4..17f4ff6e47 100644
+--- a/Doc/howto/logging-cookbook.rst
++++ b/Doc/howto/logging-cookbook.rst
+@@ -2949,7 +2949,7 @@ refer to the comments in the code snippet for more detailed information.
+ # The functions below update the UI and run in the main thread because
+ # that's where the slots are set up
+
+- @Slot(str)
++ @Slot(str, logging.LogRecord)
+ def update_status(self, status, record):
+ color = self.COLORS.get(record.levelno, 'black')
+ s = '<pre><font color="%s">%s</font></pre>' % (color, status)
+diff --git a/Doc/includes/email-dir.py b/Doc/includes/email-dir.py
+index 0dcfbfb402..2fc1570e65 100644
+--- a/Doc/includes/email-dir.py
++++ b/Doc/includes/email-dir.py
+@@ -41,7 +41,7 @@ must be running an SMTP server.
+ directory = '.'
+ # Create the message
+ msg = EmailMessage()
+- msg['Subject'] = 'Contents of directory %s' % os.path.abspath(directory)
++ msg['Subject'] = f'Contents of directory {os.path.abspath(directory)}'
+ msg['To'] = ', '.join(args.recipients)
+ msg['From'] = args.sender
+ msg.preamble = 'You will not see this in a MIME-aware mail reader.\n'
+diff --git a/Doc/includes/email-simple.py b/Doc/includes/email-simple.py
+index f69ef40ff0..07dc30fd06 100644
+--- a/Doc/includes/email-simple.py
++++ b/Doc/includes/email-simple.py
+@@ -12,7 +12,7 @@ with open(textfile) as fp:
+
+ # me == the sender's email address
+ # you == the recipient's email address
+-msg['Subject'] = 'The contents of %s' % textfile
++msg['Subject'] = f'The contents of {textfile}'
+ msg['From'] = me
+ msg['To'] = you
+
+diff --git a/Doc/includes/email-unpack.py b/Doc/includes/email-unpack.py
+index e0a7f01f58..c8cb0be456 100644
+--- a/Doc/includes/email-unpack.py
++++ b/Doc/includes/email-unpack.py
+@@ -43,7 +43,7 @@ Unpack a MIME message into a directory of files.
+ if not ext:
+ # Use a generic bag-of-bits extension
+ ext = '.bin'
+- filename = 'part-%03d%s' % (counter, ext)
++ filename = f'part-{counter:03d}{ext}'
+ counter += 1
+ with open(os.path.join(args.directory, filename), 'wb') as fp:
+ fp.write(part.get_payload(decode=True))
+diff --git a/Doc/installing/index.rst b/Doc/installing/index.rst
+index dc44aa64b8..31e9b0bde0 100644
+--- a/Doc/installing/index.rst
++++ b/Doc/installing/index.rst
+@@ -53,7 +53,7 @@ Key terms
+ evolution of the standard packaging tools and the associated metadata and
+ file format standards. They maintain a variety of tools, documentation,
+ and issue trackers on both `GitHub <https://github.com/pypa>`__ and
+- `BitBucket <https://bitbucket.org/pypa/>`__.
++ `Bitbucket <https://bitbucket.org/pypa/>`__.
+ * ``distutils`` is the original build and distribution system first added to
+ the Python standard library in 1998. While direct use of ``distutils`` is
+ being phased out, it still laid the foundation for the current packaging
+diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst
+index ee00559485..e1b28e32ed 100644
+--- a/Doc/library/argparse.rst
++++ b/Doc/library/argparse.rst
+@@ -782,10 +782,12 @@ how the command-line arguments should be handled. The supplied actions are:
+ example, this is useful for increasing verbosity levels::
+
+ >>> parser = argparse.ArgumentParser()
+- >>> parser.add_argument('--verbose', '-v', action='count')
++ >>> parser.add_argument('--verbose', '-v', action='count', default=0)
+ >>> parser.parse_args(['-vvv'])
+ Namespace(verbose=3)
+
++ Note, the *default* will be ``None`` unless explicitly set to *0*.
++
+ * ``'help'`` - This prints a complete help message for all the options in the
+ current parser and then exits. By default a help action is automatically
+ added to the parser. See :class:`ArgumentParser` for details of how the
+@@ -810,6 +812,8 @@ how the command-line arguments should be handled. The supplied actions are:
+ >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"])
+ Namespace(foo=['f1', 'f2', 'f3', 'f4'])
+
++ .. versionadded:: 3.8
++
+ You may also specify an arbitrary action by passing an Action subclass or
+ other object that implements the same interface. The recommended way to do
+ this is to extend :class:`Action`, overriding the ``__call__`` method
+diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst
+index bb899714a0..b76ed379c7 100644
+--- a/Doc/library/asyncio-stream.rst
++++ b/Doc/library/asyncio-stream.rst
+@@ -263,8 +263,8 @@ StreamWriter
+
+ .. method:: can_write_eof()
+
+- Return *True* if the underlying transport supports
+- the :meth:`write_eof` method, *False* otherwise.
++ Return ``True`` if the underlying transport supports
++ the :meth:`write_eof` method, ``False`` otherwise.
+
+ .. method:: write_eof()
+
+diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst
+index 90a3f4bea9..a5e8d04099 100644
+--- a/Doc/library/collections.rst
++++ b/Doc/library/collections.rst
+@@ -162,7 +162,7 @@ environment variables which in turn take precedence over default values::
+ parser.add_argument('-u', '--user')
+ parser.add_argument('-c', '--color')
+ namespace = parser.parse_args()
+- command_line_args = {k:v for k, v in vars(namespace).items() if v}
++ command_line_args = {k: v for k, v in vars(namespace).items() if v is not None}
+
+ combined = ChainMap(command_line_args, os.environ, defaults)
+ print(combined['color'])
+diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
+index eb0bcf4ae2..e0bc28f5e5 100644
+--- a/Doc/library/ctypes.rst
++++ b/Doc/library/ctypes.rst
+@@ -152,8 +152,8 @@ the ``time()`` function, which returns system time in seconds since the Unix
+ epoch, and the ``GetModuleHandleA()`` function, which returns a win32 module
+ handle.
+
+-This example calls both functions with a NULL pointer (``None`` should be used
+-as the NULL pointer)::
++This example calls both functions with a ``NULL`` pointer (``None`` should be used
++as the ``NULL`` pointer)::
+
+ >>> print(libc.time(None)) # doctest: +SKIP
+ 1150640792
+@@ -1083,7 +1083,7 @@ An extended example which also demonstrates the use of pointers accesses the
+ Quoting the docs for that value:
+
+ This pointer is initialized to point to an array of :c:type:`struct _frozen`
+- records, terminated by one whose members are all *NULL* or zero. When a frozen
++ records, terminated by one whose members are all ``NULL`` or zero. When a frozen
+ module is imported, it is searched in this table. Third-party code could play
+ tricks with this to provide a dynamically created collection of frozen modules.
+
+@@ -1110,7 +1110,7 @@ Since ``table`` is a ``pointer`` to the array of ``struct_frozen`` records, we
+ can iterate over it, but we just have to make sure that our loop terminates,
+ because pointers have no size. Sooner or later it would probably crash with an
+ access violation or whatever, so it's better to break out of the loop when we
+-hit the NULL entry::
++hit the ``NULL`` entry::
+
+ >>> for item in table:
+ ... if item.name is None:
+@@ -1526,6 +1526,12 @@ object is available:
+ ``ctypes.dlsym`` with arguments ``library`` (the library object) and ``name``
+ (the symbol's name as a string or integer).
+
++.. audit-event:: ctypes.dlsym/handle handle,name ctypes.LibraryLoader
++
++ In cases when only the library handle is available rather than the object,
++ accessing a function raises an auditing event ``ctypes.dlsym/handle`` with
++ arguments ``handle`` (the raw library handle) and ``name``.
++
+ .. _ctypes-foreign-functions:
+
+ Foreign functions
+@@ -1611,6 +1617,19 @@ They are instances of a private class:
+ passed arguments.
+
+
++.. audit-event:: ctypes.seh_exception code foreign-functions
++
++ On Windows, when a foreign function call raises a system exception (for
++ example, due to an access violation), it will be captured and replaced with
++ a suitable Python exception. Further, an auditing event
++ ``ctypes.seh_exception`` with argument ``code`` will be raised, allowing an
++ audit hook to replace the exception with its own.
++
++.. audit-event:: ctypes.call_function func_pointer,arguments ctype-foreign-functions
++
++ Some ways to invoke foreign function calls may raise an auditing event
++ ``ctypes.call_function`` with arguments ``function pointer`` and ``arguments``.
++
+ .. _ctypes-function-prototypes:
+
+ Function prototypes
+@@ -1802,6 +1821,8 @@ Utility functions
+ Returns the address of the memory buffer as integer. *obj* must be an
+ instance of a ctypes type.
+
++ .. audit-event:: ctypes.addressof obj ctypes.addressof
++
+
+ .. function:: alignment(obj_or_type)
+
+@@ -1844,6 +1865,7 @@ Utility functions
+ termination character. An integer can be passed as second argument which allows
+ specifying the size of the array if the length of the bytes should not be used.
+
++ .. audit-event:: ctypes.create_string_buffer init,size ctypes.create_string_buffer
+
+
+ .. function:: create_unicode_buffer(init_or_size, size=None)
+@@ -1860,6 +1882,7 @@ Utility functions
+ allows specifying the size of the array if the length of the string should not
+ be used.
+
++ .. audit-event:: ctypes.create_unicode_buffer init,size ctypes.create_unicode_buffer
+
+
+ .. function:: DllCanUnloadNow()
+@@ -1917,11 +1940,15 @@ Utility functions
+ Returns the current value of the ctypes-private copy of the system
+ :data:`errno` variable in the calling thread.
+
++ .. audit-event:: ctypes.get_errno "" ctypes.get_errno
++
+ .. function:: get_last_error()
+
+ Windows only: returns the current value of the ctypes-private copy of the system
+ :data:`LastError` variable in the calling thread.
+
++ .. audit-event:: ctypes.get_last_error "" ctypes.get_last_error
++
+ .. function:: memmove(dst, src, count)
+
+ Same as the standard C memmove library function: copies *count* bytes from
+@@ -1965,6 +1992,7 @@ Utility functions
+ Set the current value of the ctypes-private copy of the system :data:`errno`
+ variable in the calling thread to *value* and return the previous value.
+
++ .. audit-event:: ctypes.set_errno errno ctypes.set_errno
+
+
+ .. function:: set_last_error(value)
+@@ -1973,6 +2001,7 @@ Utility functions
+ :data:`LastError` variable in the calling thread to *value* and return the
+ previous value.
+
++ .. audit-event:: ctypes.set_last_error error ctypes.set_last_error
+
+
+ .. function:: sizeof(obj_or_type)
+@@ -1987,6 +2016,8 @@ Utility functions
+ object. If size is specified, it is used as size, otherwise the string is assumed
+ to be zero-terminated.
+
++ .. audit-event:: ctypes.string_at address,size ctypes.string_at
++
+
+ .. function:: WinError(code=None, descr=None)
+
+@@ -2007,6 +2038,8 @@ Utility functions
+ characters of the string, otherwise the string is assumed to be
+ zero-terminated.
+
++ .. audit-event:: ctypes.wstring_at address,size ctypes.wstring_at
++
+
+ .. _ctypes-data-types:
+
+@@ -2034,6 +2067,7 @@ Data types
+ source buffer in bytes; the default is zero. If the source buffer is not
+ large enough a :exc:`ValueError` is raised.
+
++ .. audit-event:: ctypes.cdata/buffer pointer,size,offset ctypes._CData.from_buffer
+
+ .. method:: _CData.from_buffer_copy(source[, offset])
+
+@@ -2043,6 +2077,8 @@ Data types
+ is zero. If the source buffer is not large enough a :exc:`ValueError` is
+ raised.
+
++ .. audit-event:: ctypes.cdata/buffer pointer,size,offset ctypes._CData.from_buffer_copy
++
+ .. method:: from_address(address)
+
+ This method returns a ctypes type instance using the memory specified by
+diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst
+index db5c3e0c7e..9aa4a19d57 100644
+--- a/Doc/library/dataclasses.rst
++++ b/Doc/library/dataclasses.rst
+@@ -153,7 +153,7 @@ Module-level decorators, classes, and functions
+ method of the superclass will be used (if the superclass is
+ :class:`object`, this means it will fall back to id-based hashing).
+
+- - ``frozen``: If true (the default is False), assigning to fields will
++ - ``frozen``: If true (the default is ``False``), assigning to fields will
+ generate an exception. This emulates read-only frozen instances. If
+ :meth:`__setattr__` or :meth:`__delattr__` is defined in the class, then
+ :exc:`TypeError` is raised. See the discussion below.
+@@ -386,8 +386,8 @@ Module-level decorators, classes, and functions
+
+ .. function:: is_dataclass(class_or_instance)
+
+- Returns True if its parameter is a dataclass or an instance of one,
+- otherwise returns False.
++ Return ``True`` if its parameter is a dataclass or an instance of one,
++ otherwise return ``False``.
+
+ If you need to know if a class is an instance of a dataclass (and
+ not a dataclass itself), then add a further check for ``not
+diff --git a/Doc/library/difflib.rst b/Doc/library/difflib.rst
+index c2a19dc019..ada311bc3a 100644
+--- a/Doc/library/difflib.rst
++++ b/Doc/library/difflib.rst
+@@ -338,14 +338,14 @@ diffs. For comparing directories and files, see also, the :mod:`filecmp` module.
+
+ .. function:: IS_LINE_JUNK(line)
+
+- Return true for ignorable lines. The line *line* is ignorable if *line* is
++ Return ``True`` for ignorable lines. The line *line* is ignorable if *line* is
+ blank or contains a single ``'#'``, otherwise it is not ignorable. Used as a
+ default for parameter *linejunk* in :func:`ndiff` in older versions.
+
+
+ .. function:: IS_CHARACTER_JUNK(ch)
+
+- Return true for ignorable characters. The character *ch* is ignorable if *ch*
++ Return ``True`` for ignorable characters. The character *ch* is ignorable if *ch*
+ is a space or tab, otherwise it is not ignorable. Used as a default for
+ parameter *charjunk* in :func:`ndiff`.
+
+@@ -370,7 +370,7 @@ The :class:`SequenceMatcher` class has this constructor:
+ Optional argument *isjunk* must be ``None`` (the default) or a one-argument
+ function that takes a sequence element and returns true if and only if the
+ element is "junk" and should be ignored. Passing ``None`` for *isjunk* is
+- equivalent to passing ``lambda x: 0``; in other words, no elements are ignored.
++ equivalent to passing ``lambda x: False``; in other words, no elements are ignored.
+ For example, pass::
+
+ lambda x: x in " \t"
+diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst
+index 7fc471fe2a..a77322f83a 100644
+--- a/Doc/library/doctest.rst
++++ b/Doc/library/doctest.rst
+@@ -1529,7 +1529,7 @@ OutputChecker objects
+
+ A class used to check the whether the actual output from a doctest example
+ matches the expected output. :class:`OutputChecker` defines two methods:
+- :meth:`check_output`, which compares a given pair of outputs, and returns true
++ :meth:`check_output`, which compares a given pair of outputs, and returns ``True``
+ if they match; and :meth:`output_difference`, which returns a string describing
+ the differences between two outputs.
+
+diff --git a/Doc/library/email.compat32-message.rst b/Doc/library/email.compat32-message.rst
+index 09ea64a5a0..745b3a6a3a 100644
+--- a/Doc/library/email.compat32-message.rst
++++ b/Doc/library/email.compat32-message.rst
+@@ -308,7 +308,7 @@ Here are the methods of the :class:`Message` class:
+
+ .. method:: __contains__(name)
+
+- Return true if the message object has a field named *name*. Matching is
++ Return ``True`` if the message object has a field named *name*. Matching is
+ done case-insensitively and *name* should not include the trailing colon.
+ Used for the ``in`` operator, e.g.::
+
+diff --git a/Doc/library/email.errors.rst b/Doc/library/email.errors.rst
+index 511ad16358..f4b9f52509 100644
+--- a/Doc/library/email.errors.rst
++++ b/Doc/library/email.errors.rst
+@@ -99,7 +99,7 @@ All defect classes are subclassed from :class:`email.errors.MessageDefect`.
+ * :class:`MultipartInvariantViolationDefect` -- A message claimed to be a
+ :mimetype:`multipart`, but no subparts were found. Note that when a message
+ has this defect, its :meth:`~email.message.Message.is_multipart` method may
+- return false even though its content type claims to be :mimetype:`multipart`.
++ return ``False`` even though its content type claims to be :mimetype:`multipart`.
+
+ * :class:`InvalidBase64PaddingDefect` -- When decoding a block of base64
+ encoded bytes, the padding was not correct. Enough padding is added to
+diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst
+index f1806a0866..5e0509f418 100644
+--- a/Doc/library/email.message.rst
++++ b/Doc/library/email.message.rst
+@@ -178,7 +178,7 @@ message objects.
+
+ .. method:: __contains__(name)
+
+- Return true if the message object has a field named *name*. Matching is
++ Return ``True`` if the message object has a field named *name*. Matching is
+ done without regard to case and *name* does not include the trailing
+ colon. Used for the ``in`` operator. For example::
+
+diff --git a/Doc/library/email.utils.rst b/Doc/library/email.utils.rst
+index 63fae2ab84..4d0e920eb0 100644
+--- a/Doc/library/email.utils.rst
++++ b/Doc/library/email.utils.rst
+@@ -117,8 +117,8 @@ of the new API.
+ a 10-tuple; the first 9 elements make up a tuple that can be passed directly to
+ :func:`time.mktime`, and the tenth is the offset of the date's timezone from UTC
+ (which is the official term for Greenwich Mean Time) [#]_. If the input string
+- has no timezone, the last element of the tuple returned is ``None``. Note that
+- indexes 6, 7, and 8 of the result tuple are not usable.
++ has no timezone, the last element of the tuple returned is ``0``, which represents
++ UTC. Note that indexes 6, 7, and 8 of the result tuple are not usable.
+
+
+ .. function:: parsedate_to_datetime(date)
+diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst
+index f5e5280a13..cc4039a30e 100644
+--- a/Doc/library/fileinput.rst
++++ b/Doc/library/fileinput.rst
+@@ -109,14 +109,14 @@ if there is no active state, :exc:`RuntimeError` is raised.
+
+ .. function:: isfirstline()
+
+- Returns true if the line just read is the first line of its file, otherwise
+- returns false.
++ Return ``True`` if the line just read is the first line of its file, otherwise
++ return ``False``.
+
+
+ .. function:: isstdin()
+
+- Returns true if the last line was read from ``sys.stdin``, otherwise returns
+- false.
++ Return ``True`` if the last line was read from ``sys.stdin``, otherwise return
++ ``False``.
+
+
+ .. function:: nextfile()
+diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
+index 0236ff03da..7968eef4fb 100644
+--- a/Doc/library/functions.rst
++++ b/Doc/library/functions.rst
+@@ -181,8 +181,8 @@ are always available. They are listed here in alphabetical order.
+ .. function:: callable(object)
+
+ Return :const:`True` if the *object* argument appears callable,
+- :const:`False` if not. If this returns true, it is still possible that a
+- call fails, but if it is false, calling *object* will never succeed.
++ :const:`False` if not. If this returns ``True``, it is still possible that a
++ call fails, but if it is ``False``, calling *object* will never succeed.
+ Note that classes are callable (calling a class returns a new instance);
+ instances are callable if their class has a :meth:`__call__` method.
+
+@@ -471,7 +471,7 @@ are always available. They are listed here in alphabetical order.
+ dictionary is omitted it defaults to the *globals* dictionary. If both
+ dictionaries are omitted, the expression is executed with the *globals* and
+ *locals* in the environment where :func:`eval` is called. Note, *eval()*
+- does not have access to the :term:`nested scope`\s (non-locals) in the
++ does not have access to the :term:`nested scopes <nested scope>` (non-locals) in the
+ enclosing environment.
+
+ The return value is the result of
+@@ -838,19 +838,19 @@ are always available. They are listed here in alphabetical order.
+
+ .. function:: isinstance(object, classinfo)
+
+- Return true if the *object* argument is an instance of the *classinfo*
++ Return ``True`` if the *object* argument is an instance of the *classinfo*
+ argument, or of a (direct, indirect or :term:`virtual <abstract base
+ class>`) subclass thereof. If *object* is not
+- an object of the given type, the function always returns false.
++ an object of the given type, the function always returns ``False``.
+ If *classinfo* is a tuple of type objects (or recursively, other such
+- tuples), return true if *object* is an instance of any of the types.
++ tuples), return ``True`` if *object* is an instance of any of the types.
+ If *classinfo* is not a type or tuple of types and such tuples,
+ a :exc:`TypeError` exception is raised.
+
+
+ .. function:: issubclass(class, classinfo)
+
+- Return true if *class* is a subclass (direct, indirect or :term:`virtual
++ Return ``True`` if *class* is a subclass (direct, indirect or :term:`virtual
+ <abstract base class>`) of *classinfo*. A
+ class is considered a subclass of itself. *classinfo* may be a tuple of class
+ objects, in which case every entry in *classinfo* will be checked. In any other
+@@ -1245,7 +1245,7 @@ are always available. They are listed here in alphabetical order.
+
+ * The file is now non-inheritable.
+
+- .. deprecated-removed:: 3.4 4.0
++ .. deprecated-removed:: 3.4 3.9
+
+ The ``'U'`` mode.
+
+@@ -1636,7 +1636,7 @@ are always available. They are listed here in alphabetical order.
+ # super(C, self).method(arg)
+
+ In addition to method lookups, :func:`super` also works for attribute
+- lookups. One possible use case for this is calling :term:`descriptor`\s
++ lookups. One possible use case for this is calling :term:`descriptors <descriptor>`
+ in a parent or sibling class.
+
+ Note that :func:`super` is implemented as part of the binding process for
+diff --git a/Doc/library/gc.rst b/Doc/library/gc.rst
+index 084cd6ac25..13eda917b9 100644
+--- a/Doc/library/gc.rst
++++ b/Doc/library/gc.rst
+@@ -35,7 +35,7 @@ The :mod:`gc` module provides the following functions:
+
+ .. function:: isenabled()
+
+- Returns true if automatic collection is enabled.
++ Return ``True`` if automatic collection is enabled.
+
+
+ .. function:: collect(generation=2)
+@@ -212,7 +212,7 @@ values but should not rebind them):
+ A list of objects which the collector found to be unreachable but could
+ not be freed (uncollectable objects). Starting with Python 3.4, this
+ list should be empty most of the time, except when using instances of
+- C extension types with a non-NULL ``tp_del`` slot.
++ C extension types with a non-``NULL`` ``tp_del`` slot.
+
+ If :const:`DEBUG_SAVEALL` is set, then all unreachable objects will be
+ added to this list rather than freed.
+diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst
+index dc994b07c3..57ac8bb161 100644
+--- a/Doc/library/hmac.rst
++++ b/Doc/library/hmac.rst
+@@ -14,12 +14,13 @@
+ This module implements the HMAC algorithm as described by :rfc:`2104`.
+
+
+-.. function:: new(key, msg=None, digestmod=None)
++.. function:: new(key, msg=None, digestmod='')
+
+ Return a new hmac object. *key* is a bytes or bytearray object giving the
+ secret key. If *msg* is present, the method call ``update(msg)`` is made.
+ *digestmod* is the digest name, digest constructor or module for the HMAC
+- object to use. It supports any name suitable to :func:`hashlib.new`.
++ object to use. It may be any name suitable to :func:`hashlib.new`.
++ Despite its argument position, it is required.
+
+ .. versionchanged:: 3.4
+ Parameter *key* can be a bytes or bytearray object.
+@@ -28,6 +29,8 @@ This module implements the HMAC algorithm as described by :rfc:`2104`.
+
+ .. deprecated-removed:: 3.4 3.8
+ MD5 as implicit default digest for *digestmod* is deprecated.
++ The digestmod parameter is now required. Pass it as a keyword
++ argument to avoid awkwardness when you do not have an initial msg.
+
+
+ .. function:: digest(key, msg, digest)
+@@ -127,7 +130,6 @@ This module also provides the following helper function:
+ a timing attack could theoretically reveal information about the
+ types and lengths of *a* and *b*—but not their values.
+
+-
+ .. versionadded:: 3.3
+
+
+diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst
+index db26d56af3..9cdabc2a03 100644
+--- a/Doc/library/http.client.rst
++++ b/Doc/library/http.client.rst
+@@ -20,7 +20,7 @@ HTTPS protocols. It is normally not used directly --- the module
+
+ .. seealso::
+
+- The `Requests package <http://docs.python-requests.org/>`_
++ The `Requests package <https://requests.readthedocs.io/en/master/>`_
+ is recommended for a higher-level HTTP client interface.
+
+ .. note::
+diff --git a/Doc/library/http.cookiejar.rst b/Doc/library/http.cookiejar.rst
+index 1788bd8f83..9ac5d52a2a 100644
+--- a/Doc/library/http.cookiejar.rst
++++ b/Doc/library/http.cookiejar.rst
+@@ -378,7 +378,7 @@ methods:
+
+ .. method:: CookiePolicy.domain_return_ok(domain, request)
+
+- Return false if cookies should not be returned, given cookie domain.
++ Return ``False`` if cookies should not be returned, given cookie domain.
+
+ This method is an optimization. It removes the need for checking every cookie
+ with a particular domain (which might involve reading many files). Returning
+@@ -402,7 +402,7 @@ methods:
+
+ .. method:: CookiePolicy.path_return_ok(path, request)
+
+- Return false if cookies should not be returned, given cookie path.
++ Return ``False`` if cookies should not be returned, given cookie path.
+
+ See the documentation for :meth:`domain_return_ok`.
+
+@@ -711,7 +711,7 @@ accessed using the following methods:
+
+ .. method:: Cookie.has_nonstandard_attr(name)
+
+- Return true if cookie has the named cookie-attribute.
++ Return ``True`` if cookie has the named cookie-attribute.
+
+
+ .. method:: Cookie.get_nonstandard_attr(name, default=None)
+diff --git a/Doc/library/http.rst b/Doc/library/http.rst
+index 8df14578de..0e3441cbcb 100644
+--- a/Doc/library/http.rst
++++ b/Doc/library/http.rst
+@@ -38,7 +38,7 @@ associated messages through the :class:`http.HTTPStatus` enum:
+ <HTTPStatus.OK: 200>
+ >>> HTTPStatus.OK == 200
+ True
+- >>> http.HTTPStatus.OK.value
++ >>> HTTPStatus.OK.value
+ 200
+ >>> HTTPStatus.OK.phrase
+ 'OK'
+diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
+index 47e3dd03a6..aa22a5b168 100644
+--- a/Doc/library/importlib.rst
++++ b/Doc/library/importlib.rst
+@@ -1168,7 +1168,7 @@ find and load modules.
+
+ .. method:: is_package(fullname)
+
+- Return true if :attr:`path` appears to be for a package.
++ Return ``True`` if :attr:`path` appears to be for a package.
+
+ .. method:: path_stats(path)
+
+diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst
+index 2a71201a80..10f347dd42 100644
+--- a/Doc/library/inspect.rst
++++ b/Doc/library/inspect.rst
+@@ -277,55 +277,55 @@ attributes:
+
+ .. function:: ismodule(object)
+
+- Return true if the object is a module.
++ Return ``True`` if the object is a module.
+
+
+ .. function:: isclass(object)
+
+- Return true if the object is a class, whether built-in or created in Python
++ Return ``True`` if the object is a class, whether built-in or created in Python
+ code.
+
+
+ .. function:: ismethod(object)
+
+- Return true if the object is a bound method written in Python.
++ Return ``True`` if the object is a bound method written in Python.
+
+
+ .. function:: isfunction(object)
+
+- Return true if the object is a Python function, which includes functions
++ Return ``True`` if the object is a Python function, which includes functions
+ created by a :term:`lambda` expression.
+
+
+ .. function:: isgeneratorfunction(object)
+
+- Return true if the object is a Python generator function.
++ Return ``True`` if the object is a Python generator function.
+
+ .. versionchanged:: 3.8
+- Functions wrapped in :func:`functools.partial` now return true if the
++ Functions wrapped in :func:`functools.partial` now return ``True`` if the
+ wrapped function is a Python generator function.
+
+
+ .. function:: isgenerator(object)
+
+- Return true if the object is a generator.
++ Return ``True`` if the object is a generator.
+
+
+ .. function:: iscoroutinefunction(object)
+
+- Return true if the object is a :term:`coroutine function`
++ Return ``True`` if the object is a :term:`coroutine function`
+ (a function defined with an :keyword:`async def` syntax).
+
+ .. versionadded:: 3.5
+
+ .. versionchanged:: 3.8
+- Functions wrapped in :func:`functools.partial` now return true if the
++ Functions wrapped in :func:`functools.partial` now return ``True`` if the
+ wrapped function is a :term:`coroutine function`.
+
+
+ .. function:: iscoroutine(object)
+
+- Return true if the object is a :term:`coroutine` created by an
++ Return ``True`` if the object is a :term:`coroutine` created by an
+ :keyword:`async def` function.
+
+ .. versionadded:: 3.5
+@@ -333,7 +333,7 @@ attributes:
+
+ .. function:: isawaitable(object)
+
+- Return true if the object can be used in :keyword:`await` expression.
++ Return ``True`` if the object can be used in :keyword:`await` expression.
+
+ Can also be used to distinguish generator-based coroutines from regular
+ generators::
+@@ -352,7 +352,7 @@ attributes:
+
+ .. function:: isasyncgenfunction(object)
+
+- Return true if the object is an :term:`asynchronous generator` function,
++ Return ``True`` if the object is an :term:`asynchronous generator` function,
+ for example::
+
+ >>> async def agen():
+@@ -364,50 +364,50 @@ attributes:
+ .. versionadded:: 3.6
+
+ .. versionchanged:: 3.8
+- Functions wrapped in :func:`functools.partial` now return true if the
++ Functions wrapped in :func:`functools.partial` now return ``True`` if the
+ wrapped function is a :term:`asynchronous generator` function.
+
+
+ .. function:: isasyncgen(object)
+
+- Return true if the object is an :term:`asynchronous generator iterator`
++ Return ``True`` if the object is an :term:`asynchronous generator iterator`
+ created by an :term:`asynchronous generator` function.
+
+ .. versionadded:: 3.6
+
+ .. function:: istraceback(object)
+
+- Return true if the object is a traceback.
++ Return ``True`` if the object is a traceback.
+
+
+ .. function:: isframe(object)
+
+- Return true if the object is a frame.
++ Return ``True`` if the object is a frame.
+
+
+ .. function:: iscode(object)
+
+- Return true if the object is a code.
++ Return ``True`` if the object is a code.
+
+
+ .. function:: isbuiltin(object)
+
+- Return true if the object is a built-in function or a bound built-in method.
++ Return ``True`` if the object is a built-in function or a bound built-in method.
+
+
+ .. function:: isroutine(object)
+
+- Return true if the object is a user-defined or built-in function or method.
++ Return ``True`` if the object is a user-defined or built-in function or method.
+
+
+ .. function:: isabstract(object)
+
+- Return true if the object is an abstract base class.
++ Return ``True`` if the object is an abstract base class.
+
+
+ .. function:: ismethoddescriptor(object)
+
+- Return true if the object is a method descriptor, but not if
++ Return ``True`` if the object is a method descriptor, but not if
+ :func:`ismethod`, :func:`isclass`, :func:`isfunction` or :func:`isbuiltin`
+ are true.
+
+@@ -418,16 +418,16 @@ attributes:
+ sensible, and :attr:`__doc__` often is.
+
+ Methods implemented via descriptors that also pass one of the other tests
+- return false from the :func:`ismethoddescriptor` test, simply because the
++ return ``False`` from the :func:`ismethoddescriptor` test, simply because the
+ other tests promise more -- you can, e.g., count on having the
+ :attr:`__func__` attribute (etc) when an object passes :func:`ismethod`.
+
+
+ .. function:: isdatadescriptor(object)
+
+- Return true if the object is a data descriptor.
++ Return ``True`` if the object is a data descriptor.
+
+- Data descriptors have both a :attr:`~object.__get__` and a :attr:`~object.__set__` method.
++ Data descriptors have a :attr:`~object.__set__` or a :attr:`~object.__delete__` method.
+ Examples are properties (defined in Python), getsets, and members. The
+ latter two are defined in C and there are more specific tests available for
+ those types, which is robust across Python implementations. Typically, data
+@@ -438,7 +438,7 @@ attributes:
+
+ .. function:: isgetsetdescriptor(object)
+
+- Return true if the object is a getset descriptor.
++ Return ``True`` if the object is a getset descriptor.
+
+ .. impl-detail::
+
+@@ -449,7 +449,7 @@ attributes:
+
+ .. function:: ismemberdescriptor(object)
+
+- Return true if the object is a member descriptor.
++ Return ``True`` if the object is a member descriptor.
+
+ .. impl-detail::
+
+diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst
+index b7b502aff1..140401d2f3 100644
+--- a/Doc/library/ipaddress.rst
++++ b/Doc/library/ipaddress.rst
+@@ -557,7 +557,7 @@ dictionaries.
+
+ .. method:: subnet_of(other)
+
+- Returns *True* if this network is a subnet of *other*.
++ Return ``True`` if this network is a subnet of *other*.
+
+ >>> a = ip_network('192.168.1.0/24')
+ >>> b = ip_network('192.168.1.128/30')
+@@ -568,7 +568,7 @@ dictionaries.
+
+ .. method:: supernet_of(other)
+
+- Returns *True* if this network is a supernet of *other*.
++ Return ``True`` if this network is a supernet of *other*.
+
+ >>> a = ip_network('192.168.1.0/24')
+ >>> b = ip_network('192.168.1.128/30')
+diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst
+index 8d134d4380..3e5a673898 100644
+--- a/Doc/library/itertools.rst
++++ b/Doc/library/itertools.rst
+@@ -766,9 +766,9 @@ which incur interpreter overhead.
+ def dotproduct(vec1, vec2):
+ return sum(map(operator.mul, vec1, vec2))
+
+- def flatten(listOfLists):
++ def flatten(list_of_lists):
+ "Flatten one level of nesting"
+- return chain.from_iterable(listOfLists)
++ return chain.from_iterable(list_of_lists)
+
+ def repeatfunc(func, times=None, *args):
+ """Repeat calls to func with specified arguments.
+diff --git a/Doc/library/keyword.rst b/Doc/library/keyword.rst
+index 173db23544..3768df969c 100644
+--- a/Doc/library/keyword.rst
++++ b/Doc/library/keyword.rst
+@@ -13,7 +13,7 @@ This module allows a Python program to determine if a string is a keyword.
+
+ .. function:: iskeyword(s)
+
+- Return true if *s* is a Python keyword.
++ Return ``True`` if *s* is a Python keyword.
+
+
+ .. data:: kwlist
+diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst
+index 0e9870408f..fa0424dcd1 100644
+--- a/Doc/library/logging.handlers.rst
++++ b/Doc/library/logging.handlers.rst
+@@ -846,8 +846,8 @@ should, then :meth:`flush` is expected to do the flushing.
+
+ .. method:: emit(record)
+
+- Appends the record to the buffer. If :meth:`shouldFlush` returns true,
+- calls :meth:`flush` to process the buffer.
++ Append the record to the buffer. If :meth:`shouldFlush` returns true,
++ call :meth:`flush` to process the buffer.
+
+
+ .. method:: flush()
+@@ -858,7 +858,7 @@ should, then :meth:`flush` is expected to do the flushing.
+
+ .. method:: shouldFlush(record)
+
+- Returns true if the buffer is up to capacity. This method can be
++ Return ``True`` if the buffer is up to capacity. This method can be
+ overridden to implement custom flushing strategies.
+
+
+diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst
+index 0fe2158ef0..4da5778fa6 100644
+--- a/Doc/library/logging.rst
++++ b/Doc/library/logging.rst
+@@ -294,7 +294,7 @@ is the module's name in the Python package namespace.
+
+ .. method:: Logger.filter(record)
+
+- Applies this logger's filters to the record and returns a true value if the
++ Apply this logger's filters to the record and return ``True`` if the
+ record is to be processed. The filters are consulted in turn, until one of
+ them returns a false value. If none of them return a false value, the record
+ will be processed (passed to handlers). If one returns a false value, no
+@@ -447,7 +447,7 @@ subclasses. However, the :meth:`__init__` method in subclasses needs to call
+
+ .. method:: Handler.filter(record)
+
+- Applies this handler's filters to the record and returns a true value if the
++ Apply this handler's filters to the record and return ``True`` if the
+ record is to be processed. The filters are consulted in turn, until one of
+ them returns a false value. If none of them return a false value, the record
+ will be emitted. If one returns a false value, the handler will not emit the
+diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst
+index cce6c23e61..4bfff9c614 100644
+--- a/Doc/library/lzma.rst
++++ b/Doc/library/lzma.rst
+@@ -313,7 +313,7 @@ Miscellaneous
+
+ .. function:: is_check_supported(check)
+
+- Returns true if the given integrity check is supported on this system.
++ Return ``True`` if the given integrity check is supported on this system.
+
+ :const:`CHECK_NONE` and :const:`CHECK_CRC32` are always supported.
+ :const:`CHECK_CRC64` and :const:`CHECK_SHA256` may be unavailable if you are
+diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst
+index bd34ffb1b2..14ad2cd437 100644
+--- a/Doc/library/msvcrt.rst
++++ b/Doc/library/msvcrt.rst
+@@ -92,7 +92,7 @@ Console I/O
+
+ .. function:: kbhit()
+
+- Return true if a keypress is waiting to be read.
++ Return ``True`` if a keypress is waiting to be read.
+
+
+ .. function:: getch()
+diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst
+index 16f1cf008f..c1a18e0147 100644
+--- a/Doc/library/optparse.rst
++++ b/Doc/library/optparse.rst
+@@ -928,10 +928,10 @@ The canonical way to create an :class:`Option` instance is with the
+ store a constant value
+
+ ``"store_true"``
+- store a true value
++ store ``True``
+
+ ``"store_false"``
+- store a false value
++ store ``False``
+
+ ``"append"``
+ append this option's argument to a list
+@@ -1135,12 +1135,12 @@ must specify for any option using that action.
+
+ * ``"store_true"`` [relevant: :attr:`~Option.dest`]
+
+- A special case of ``"store_const"`` that stores a true value to
++ A special case of ``"store_const"`` that stores ``True`` to
+ :attr:`~Option.dest`.
+
+ * ``"store_false"`` [relevant: :attr:`~Option.dest`]
+
+- Like ``"store_true"``, but stores a false value.
++ Like ``"store_true"``, but stores ``False``.
+
+ Example::
+
+@@ -1396,7 +1396,7 @@ provides several methods to help you out:
+
+ .. method:: OptionParser.has_option(opt_str)
+
+- Return true if the OptionParser has an option with option string *opt_str*
++ Return ``True`` if the OptionParser has an option with option string *opt_str*
+ (e.g., ``-q`` or ``--verbose``).
+
+ .. method:: OptionParser.remove_option(opt_str)
+diff --git a/Doc/library/os.rst b/Doc/library/os.rst
+index 67fe36b54e..9d2e8b2eea 100644
+--- a/Doc/library/os.rst
++++ b/Doc/library/os.rst
+@@ -148,7 +148,7 @@ process and user.
+ versa).
+
+ :data:`environb` is only available if :data:`supports_bytes_environ` is
+- True.
++ ``True``.
+
+ .. versionadded:: 3.2
+
+@@ -236,7 +236,7 @@ process and user.
+ *default* if it doesn't. *key*, *default* and the result are bytes.
+
+ :func:`getenvb` is only available if :data:`supports_bytes_environ`
+- is True.
++ is ``True``.
+
+ .. availability:: most flavors of Unix.
+
+@@ -3475,7 +3475,11 @@ written in Python, such as a mail server's external command delivery program.
+ parent. If an error occurs :exc:`OSError` is raised.
+
+ Note that some platforms including FreeBSD <= 6.3 and Cygwin have
+- known issues when using fork() from a thread.
++ known issues when using ``fork()`` from a thread.
++
++ .. versionchanged:: 3.8
++ Calling ``fork()`` in a subinterpreter is no longer supported
++ (:exc:`RuntimeError` is raised).
+
+ .. warning::
+
+@@ -3492,6 +3496,10 @@ written in Python, such as a mail server's external command delivery program.
+ master end of the pseudo-terminal. For a more portable approach, use the
+ :mod:`pty` module. If an error occurs :exc:`OSError` is raised.
+
++ .. versionchanged:: 3.8
++ Calling ``forkpty()`` in a subinterpreter is no longer supported
++ (:exc:`RuntimeError` is raised).
++
+ .. availability:: some flavors of Unix.
+
+
+diff --git a/Doc/library/parser.rst b/Doc/library/parser.rst
+index 1d2da30070..7b380c3670 100644
+--- a/Doc/library/parser.rst
++++ b/Doc/library/parser.rst
+@@ -234,8 +234,8 @@ determine if an ST was created from source code via :func:`expr` or
+
+ .. index:: builtin: compile
+
+- When *st* represents an ``'eval'`` form, this function returns true, otherwise
+- it returns false. This is useful, since code objects normally cannot be queried
++ When *st* represents an ``'eval'`` form, this function returns ``True``, otherwise
++ it returns ``False``. This is useful, since code objects normally cannot be queried
+ for this information using existing built-in functions. Note that the code
+ objects created by :func:`compilest` cannot be queried like this either, and
+ are identical to those created by the built-in :func:`compile` function.
+diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst
+index f26b6a8b55..5ee7faaa5c 100644
+--- a/Doc/library/pdb.rst
++++ b/Doc/library/pdb.rst
+@@ -531,6 +531,14 @@ by the local file.
+
+ Quit from the debugger. The program being executed is aborted.
+
++.. pdbcommand:: debug code
++
++ Enter a recursive debugger that steps through the code
++ argument (which is an arbitrary expression or statement to be
++ executed in the current environment).
++
++.. pdbcommand:: retval
++ Print the return value for the last return of a function.
+
+ .. rubric:: Footnotes
+
+diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst
+index eb58178e0e..779b60ed4d 100644
+--- a/Doc/library/pickle.rst
++++ b/Doc/library/pickle.rst
+@@ -136,7 +136,7 @@ The module :mod:`pickletools` contains tools for analyzing data streams
+ generated by :mod:`pickle`. :mod:`pickletools` source code has extensive
+ comments about opcodes used by pickle protocols.
+
+-There are currently 5 different protocols which can be used for pickling.
++There are currently 6 different protocols which can be used for pickling.
+ The higher the protocol used, the more recent the version of Python needed
+ to read the pickle produced.
+
+@@ -160,6 +160,10 @@ to read the pickle produced.
+ Refer to :pep:`3154` for information about improvements brought by
+ protocol 4.
+
++* Protocol version 5 was added in Python 3.8. It adds support for out-of-band
++ data and speedup for in-band data. Refer to :pep:`574` for information about
++ improvements brought by protocol 5.
++
+ .. note::
+ Serialization is a more primitive notion than persistence; although
+ :mod:`pickle` reads and writes file objects, it does not handle the issue of
+diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst
+index e07f9d613a..1d33afc758 100644
+--- a/Doc/library/platform.rst
++++ b/Doc/library/platform.rst
+@@ -226,8 +226,8 @@ Windows Platform
+
+ .. function:: win32_is_iot()
+
+- Returns True if the windows edition returned by win32_edition is recognized
+- as an IoT edition.
++ Return ``True`` if the Windows edition returned by :func:`win32_edition`
++ is recognized as an IoT edition.
+
+ .. versionadded:: 3.8
+
+diff --git a/Doc/library/plistlib.rst b/Doc/library/plistlib.rst
+index d84fcac0ef..9dfe3c8a0d 100644
+--- a/Doc/library/plistlib.rst
++++ b/Doc/library/plistlib.rst
+@@ -188,8 +188,8 @@ The following classes are available:
+ Wraps an :class:`int`. This is used when reading or writing NSKeyedArchiver
+ encoded data, which contains UID (see PList manual).
+
+- It has one attribute, :attr:`data` which can be used to retrieve the int value
+- of the UID. :attr:`data` must be in the range `0 <= data <= 2**64`.
++ It has one attribute, :attr:`data`, which can be used to retrieve the int value
++ of the UID. :attr:`data` must be in the range `0 <= data < 2**64`.
+
+ .. versionadded:: 3.8
+
+diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst
+index fab16f52c4..a4ba2848f1 100644
+--- a/Doc/library/sched.rst
++++ b/Doc/library/sched.rst
+@@ -104,7 +104,7 @@ Scheduler Objects
+
+ .. method:: scheduler.empty()
+
+- Return true if the event queue is empty.
++ Return ``True`` if the event queue is empty.
+
+
+ .. method:: scheduler.run(blocking=True)
+diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst
+index 12416e0f4a..12b90914ba 100644
+--- a/Doc/library/socket.rst
++++ b/Doc/library/socket.rst
+@@ -1635,9 +1635,9 @@ to sockets.
+ ``None`` or a :term:`bytes-like object` representing a buffer. In the later
+ case it is up to the caller to ensure that the bytestring contains the
+ proper bits (see the optional built-in module :mod:`struct` for a way to
+- encode C structures as bytestrings). When value is set to ``None``,
+- optlen argument is required. It's equivalent to call setsockopt C
+- function with optval=NULL and optlen=optlen.
++ encode C structures as bytestrings). When *value* is set to ``None``,
++ *optlen* argument is required. It's equivalent to call :c:func:`setsockopt` C
++ function with ``optval=NULL`` and ``optlen=optlen``.
+
+
+ .. versionchanged:: 3.5
+diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst
+index 633e68ae27..f8fa25df6c 100644
+--- a/Doc/library/ssl.rst
++++ b/Doc/library/ssl.rst
+@@ -1658,7 +1658,7 @@ to speed up repeated connections from the same clients.
+ return the agreed-upon protocol.
+
+ This method will raise :exc:`NotImplementedError` if :data:`HAS_ALPN` is
+- False.
++ ``False``.
+
+ OpenSSL 1.1.0 to 1.1.0e will abort the handshake and raise :exc:`SSLError`
+ when both sides support ALPN but cannot agree on a protocol. 1.1.0f+
+@@ -1677,7 +1677,7 @@ to speed up repeated connections from the same clients.
+ return the agreed-upon protocol.
+
+ This method will raise :exc:`NotImplementedError` if :data:`HAS_NPN` is
+- False.
++ ``False``.
+
+ .. versionadded:: 3.3
+
+diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst
+index a702b2463c..a790ed81a5 100644
+--- a/Doc/library/statistics.rst
++++ b/Doc/library/statistics.rst
+@@ -77,7 +77,7 @@ However, for reading convenience, most of the examples show sorted sequences.
+
+ .. function:: mean(data)
+
+- Return the sample arithmetic mean of *data* which can be a sequence or iterator.
++ Return the sample arithmetic mean of *data* which can be a sequence or iterable.
+
+ The arithmetic mean is the sum of the data divided by the number of data
+ points. It is commonly called "the average", although it is only one of many
+@@ -122,7 +122,7 @@ However, for reading convenience, most of the examples show sorted sequences.
+ Convert *data* to floats and compute the arithmetic mean.
+
+ This runs faster than the :func:`mean` function and it always returns a
+- :class:`float`. The *data* may be a sequence or iterator. If the input
++ :class:`float`. The *data* may be a sequence or iterable. If the input
+ dataset is empty, raises a :exc:`StatisticsError`.
+
+ .. doctest::
+@@ -143,7 +143,7 @@ However, for reading convenience, most of the examples show sorted sequences.
+
+ Raises a :exc:`StatisticsError` if the input dataset is empty,
+ if it contains a zero, or if it contains a negative value.
+- The *data* may be a sequence or iterator.
++ The *data* may be a sequence or iterable.
+
+ No special efforts are made to achieve exact results.
+ (However, this may change in the future.)
+@@ -158,13 +158,14 @@ However, for reading convenience, most of the examples show sorted sequences.
+
+ .. function:: harmonic_mean(data)
+
+- Return the harmonic mean of *data*, a sequence or iterator of
++ Return the harmonic mean of *data*, a sequence or iterable of
+ real-valued numbers.
+
+ The harmonic mean, sometimes called the subcontrary mean, is the
+ reciprocal of the arithmetic :func:`mean` of the reciprocals of the
+ data. For example, the harmonic mean of three values *a*, *b* and *c*
+- will be equivalent to ``3/(1/a + 1/b + 1/c)``.
++ will be equivalent to ``3/(1/a + 1/b + 1/c)``. If one of the values
++ is zero, the result will be zero.
+
+ The harmonic mean is a type of average, a measure of the central
+ location of the data. It is often appropriate when averaging
+@@ -190,6 +191,10 @@ However, for reading convenience, most of the examples show sorted sequences.
+ :exc:`StatisticsError` is raised if *data* is empty, or any element
+ is less than zero.
+
++ The current algorithm has an early-out when it encounters a zero
++ in the input. This means that the subsequent inputs are not tested
++ for validity. (This behavior may change in the future.)
++
+ .. versionadded:: 3.6
+
+
+@@ -197,7 +202,7 @@ However, for reading convenience, most of the examples show sorted sequences.
+
+ Return the median (middle value) of numeric data, using the common "mean of
+ middle two" method. If *data* is empty, :exc:`StatisticsError` is raised.
+- *data* can be a sequence or iterator.
++ *data* can be a sequence or iterable.
+
+ The median is a robust measure of central location and is less affected by
+ the presence of outliers. When the number of data points is odd, the
+@@ -226,7 +231,7 @@ However, for reading convenience, most of the examples show sorted sequences.
+ .. function:: median_low(data)
+
+ Return the low median of numeric data. If *data* is empty,
+- :exc:`StatisticsError` is raised. *data* can be a sequence or iterator.
++ :exc:`StatisticsError` is raised. *data* can be a sequence or iterable.
+
+ The low median is always a member of the data set. When the number of data
+ points is odd, the middle value is returned. When it is even, the smaller of
+@@ -246,7 +251,7 @@ However, for reading convenience, most of the examples show sorted sequences.
+ .. function:: median_high(data)
+
+ Return the high median of data. If *data* is empty, :exc:`StatisticsError`
+- is raised. *data* can be a sequence or iterator.
++ is raised. *data* can be a sequence or iterable.
+
+ The high median is always a member of the data set. When the number of data
+ points is odd, the middle value is returned. When it is even, the larger of
+@@ -267,7 +272,7 @@ However, for reading convenience, most of the examples show sorted sequences.
+
+ Return the median of grouped continuous data, calculated as the 50th
+ percentile, using interpolation. If *data* is empty, :exc:`StatisticsError`
+- is raised. *data* can be a sequence or iterator.
++ is raised. *data* can be a sequence or iterable.
+
+ .. doctest::
+
+@@ -376,7 +381,7 @@ However, for reading convenience, most of the examples show sorted sequences.
+
+ .. function:: pvariance(data, mu=None)
+
+- Return the population variance of *data*, a non-empty sequence or iterator
++ Return the population variance of *data*, a non-empty sequence or iterable
+ of real-valued numbers. Variance, or second moment about the mean, is a
+ measure of the variability (spread or dispersion) of data. A large
+ variance indicates that the data is spread out; a small variance indicates
+diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
+index 9bc4cbe4f7..be72695462 100644
+--- a/Doc/library/stdtypes.rst
++++ b/Doc/library/stdtypes.rst
+@@ -1662,16 +1662,16 @@ expression support in the :mod:`re` module).
+
+ .. method:: str.isalnum()
+
+- Return true if all characters in the string are alphanumeric and there is at
+- least one character, false otherwise. A character ``c`` is alphanumeric if one
++ Return ``True`` if all characters in the string are alphanumeric and there is at
++ least one character, ``False`` otherwise. A character ``c`` is alphanumeric if one
+ of the following returns ``True``: ``c.isalpha()``, ``c.isdecimal()``,
+ ``c.isdigit()``, or ``c.isnumeric()``.
+
+
+ .. method:: str.isalpha()
+
+- Return true if all characters in the string are alphabetic and there is at least
+- one character, false otherwise. Alphabetic characters are those characters defined
++ Return ``True`` if all characters in the string are alphabetic and there is at least
++ one character, ``False`` otherwise. Alphabetic characters are those characters defined
+ in the Unicode character database as "Letter", i.e., those with general category
+ property being one of "Lm", "Lt", "Lu", "Ll", or "Lo". Note that this is different
+ from the "Alphabetic" property defined in the Unicode Standard.
+@@ -1679,8 +1679,8 @@ expression support in the :mod:`re` module).
+
+ .. method:: str.isascii()
+
+- Return true if the string is empty or all characters in the string are ASCII,
+- false otherwise.
++ Return ``True`` if the string is empty or all characters in the string are ASCII,
++ ``False`` otherwise.
+ ASCII characters have code points in the range U+0000-U+007F.
+
+ .. versionadded:: 3.7
+@@ -1688,8 +1688,8 @@ expression support in the :mod:`re` module).
+
+ .. method:: str.isdecimal()
+
+- Return true if all characters in the string are decimal
+- characters and there is at least one character, false
++ Return ``True`` if all characters in the string are decimal
++ characters and there is at least one character, ``False``
+ otherwise. Decimal characters are those that can be used to form
+ numbers in base 10, e.g. U+0660, ARABIC-INDIC DIGIT
+ ZERO. Formally a decimal character is a character in the Unicode
+@@ -1698,8 +1698,8 @@ expression support in the :mod:`re` module).
+
+ .. method:: str.isdigit()
+
+- Return true if all characters in the string are digits and there is at least one
+- character, false otherwise. Digits include decimal characters and digits that need
++ Return ``True`` if all characters in the string are digits and there is at least one
++ character, ``False`` otherwise. Digits include decimal characters and digits that need
+ special handling, such as the compatibility superscript digits.
+ This covers digits which cannot be used to form numbers in base 10,
+ like the Kharosthi numbers. Formally, a digit is a character that has the
+@@ -1708,7 +1708,7 @@ expression support in the :mod:`re` module).
+
+ .. method:: str.isidentifier()
+
+- Return true if the string is a valid identifier according to the language
++ Return ``True`` if the string is a valid identifier according to the language
+ definition, section :ref:`identifiers`.
+
+ Call :func:`keyword.iskeyword` to test whether string ``s`` is a reserved
+@@ -1727,14 +1727,14 @@ expression support in the :mod:`re` module).
+
+ .. method:: str.islower()
+
+- Return true if all cased characters [4]_ in the string are lowercase and
+- there is at least one cased character, false otherwise.
++ Return ``True`` if all cased characters [4]_ in the string are lowercase and
++ there is at least one cased character, ``False`` otherwise.
+
+
+ .. method:: str.isnumeric()
+
+- Return true if all characters in the string are numeric
+- characters, and there is at least one character, false
++ Return ``True`` if all characters in the string are numeric
++ characters, and there is at least one character, ``False``
+ otherwise. Numeric characters include digit characters, and all characters
+ that have the Unicode numeric value property, e.g. U+2155,
+ VULGAR FRACTION ONE FIFTH. Formally, numeric characters are those with the property
+@@ -1743,8 +1743,8 @@ expression support in the :mod:`re` module).
+
+ .. method:: str.isprintable()
+
+- Return true if all characters in the string are printable or the string is
+- empty, false otherwise. Nonprintable characters are those characters defined
++ Return ``True`` if all characters in the string are printable or the string is
++ empty, ``False`` otherwise. Nonprintable characters are those characters defined
+ in the Unicode character database as "Other" or "Separator", excepting the
+ ASCII space (0x20) which is considered printable. (Note that printable
+ characters in this context are those which should not be escaped when
+@@ -1754,8 +1754,8 @@ expression support in the :mod:`re` module).
+
+ .. method:: str.isspace()
+
+- Return true if there are only whitespace characters in the string and there is
+- at least one character, false otherwise.
++ Return ``True`` if there are only whitespace characters in the string and there is
++ at least one character, ``False`` otherwise.
+
+ A character is *whitespace* if in the Unicode character database
+ (see :mod:`unicodedata`), either its general category is ``Zs``
+@@ -1765,15 +1765,15 @@ expression support in the :mod:`re` module).
+
+ .. method:: str.istitle()
+
+- Return true if the string is a titlecased string and there is at least one
++ Return ``True`` if the string is a titlecased string and there is at least one
+ character, for example uppercase characters may only follow uncased characters
+- and lowercase characters only cased ones. Return false otherwise.
++ and lowercase characters only cased ones. Return ``False`` otherwise.
+
+
+ .. method:: str.isupper()
+
+- Return true if all cased characters [4]_ in the string are uppercase and
+- there is at least one cased character, false otherwise.
++ Return ``True`` if all cased characters [4]_ in the string are uppercase and
++ there is at least one cased character, ``False`` otherwise.
+
+
+ .. method:: str.join(iterable)
+@@ -2986,8 +2986,8 @@ place, and instead produce new objects.
+ .. method:: bytes.isalnum()
+ bytearray.isalnum()
+
+- Return true if all bytes in the sequence are alphabetical ASCII characters
+- or ASCII decimal digits and the sequence is not empty, false otherwise.
++ Return ``True`` if all bytes in the sequence are alphabetical ASCII characters
++ or ASCII decimal digits and the sequence is not empty, ``False`` otherwise.
+ Alphabetic ASCII characters are those byte values in the sequence
+ ``b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'``. ASCII decimal
+ digits are those byte values in the sequence ``b'0123456789'``.
+@@ -3003,8 +3003,8 @@ place, and instead produce new objects.
+ .. method:: bytes.isalpha()
+ bytearray.isalpha()
+
+- Return true if all bytes in the sequence are alphabetic ASCII characters
+- and the sequence is not empty, false otherwise. Alphabetic ASCII
++ Return ``True`` if all bytes in the sequence are alphabetic ASCII characters
++ and the sequence is not empty, ``False`` otherwise. Alphabetic ASCII
+ characters are those byte values in the sequence
+ ``b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'``.
+
+@@ -3019,8 +3019,8 @@ place, and instead produce new objects.
+ .. method:: bytes.isascii()
+ bytearray.isascii()
+
+- Return true if the sequence is empty or all bytes in the sequence are ASCII,
+- false otherwise.
++ Return ``True`` if the sequence is empty or all bytes in the sequence are ASCII,
++ ``False`` otherwise.
+ ASCII bytes are in the range 0-0x7F.
+
+ .. versionadded:: 3.7
+@@ -3029,8 +3029,8 @@ place, and instead produce new objects.
+ .. method:: bytes.isdigit()
+ bytearray.isdigit()
+
+- Return true if all bytes in the sequence are ASCII decimal digits
+- and the sequence is not empty, false otherwise. ASCII decimal digits are
++ Return ``True`` if all bytes in the sequence are ASCII decimal digits
++ and the sequence is not empty, ``False`` otherwise. ASCII decimal digits are
+ those byte values in the sequence ``b'0123456789'``.
+
+ For example::
+@@ -3044,8 +3044,8 @@ place, and instead produce new objects.
+ .. method:: bytes.islower()
+ bytearray.islower()
+
+- Return true if there is at least one lowercase ASCII character
+- in the sequence and no uppercase ASCII characters, false otherwise.
++ Return ``True`` if there is at least one lowercase ASCII character
++ in the sequence and no uppercase ASCII characters, ``False`` otherwise.
+
+ For example::
+
+@@ -3062,8 +3062,8 @@ place, and instead produce new objects.
+ .. method:: bytes.isspace()
+ bytearray.isspace()
+
+- Return true if all bytes in the sequence are ASCII whitespace and the
+- sequence is not empty, false otherwise. ASCII whitespace characters are
++ Return ``True`` if all bytes in the sequence are ASCII whitespace and the
++ sequence is not empty, ``False`` otherwise. ASCII whitespace characters are
+ those byte values in the sequence ``b' \t\n\r\x0b\f'`` (space, tab, newline,
+ carriage return, vertical tab, form feed).
+
+@@ -3071,8 +3071,8 @@ place, and instead produce new objects.
+ .. method:: bytes.istitle()
+ bytearray.istitle()
+
+- Return true if the sequence is ASCII titlecase and the sequence is not
+- empty, false otherwise. See :meth:`bytes.title` for more details on the
++ Return ``True`` if the sequence is ASCII titlecase and the sequence is not
++ empty, ``False`` otherwise. See :meth:`bytes.title` for more details on the
+ definition of "titlecase".
+
+ For example::
+@@ -3086,8 +3086,8 @@ place, and instead produce new objects.
+ .. method:: bytes.isupper()
+ bytearray.isupper()
+
+- Return true if there is at least one uppercase alphabetic ASCII character
+- in the sequence and no lowercase ASCII characters, false otherwise.
++ Return ``True`` if there is at least one uppercase alphabetic ASCII character
++ in the sequence and no lowercase ASCII characters, ``False`` otherwise.
+
+ For example::
+
+@@ -3643,7 +3643,7 @@ copying.
+ :mod:`struct` module syntax.
+
+ .. versionadded:: 3.8
+- *Order* can be {'C', 'F', 'A'}. When *order* is 'C' or 'F', the data
++ *order* can be {'C', 'F', 'A'}. When *order* is 'C' or 'F', the data
+ of the original array is converted to C or Fortran order. For contiguous
+ views, 'A' returns an exact copy of the physical memory. In particular,
+ in-memory Fortran order is preserved. For non-contiguous views, the
+diff --git a/Doc/library/stringprep.rst b/Doc/library/stringprep.rst
+index 330032ba1c..5cfb533d80 100644
+--- a/Doc/library/stringprep.rst
++++ b/Doc/library/stringprep.rst
+@@ -34,7 +34,7 @@ itself was generated using the ``mkstringprep.py`` utility.
+ As a result, these tables are exposed as functions, not as data structures.
+ There are two kinds of tables in the RFC: sets and mappings. For a set,
+ :mod:`stringprep` provides the "characteristic function", i.e. a function that
+-returns true if the parameter is part of the set. For mappings, it provides the
++returns ``True`` if the parameter is part of the set. For mappings, it provides the
+ mapping function: given the key, it returns the associated value. Below is a
+ list of all functions available in the module.
+
+diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
+index a698ecb64d..0e15467cb1 100644
+--- a/Doc/library/sys.rst
++++ b/Doc/library/sys.rst
+@@ -33,18 +33,21 @@ always available.
+ tuple of arguments. Native hooks added by :c:func:`PySys_AddAuditHook` are
+ called first, followed by hooks added in the current interpreter.
+
+- Calling this function will trigger an event for all existing hooks, and if
+- any raise an exception derived from :class:`Exception`, the add will be
+- silently ignored. As a result, callers cannot assume that their hook has been
+- added unless they control all existing hooks.
++ .. audit-event:: sys.addaudithook "" sys.addaudithook
++
++ Raises a auditing event ``sys.addaudithook`` with no arguments. If any
++ existing hooks raise an exception derived from :class:`Exception`, the
++ new hook will not be added and the exception suppressed. As a result,
++ callers cannot assume that their hook has been added unless they control
++ all existing hooks.
+
+ .. versionadded:: 3.8
+
+ .. impl-detail::
+
+- When tracing is enabled, Python hooks are only traced if the callable has
+- a ``__cantrace__`` member that is set to a true value. Otherwise, trace
+- functions will not see the hook.
++ When tracing is enabled (see :func:`settrace`), Python hooks are only
++ traced if the callable has a ``__cantrace__`` member that is set to a
++ true value. Otherwise, trace functions will skip the hook.
+
+
+ .. data:: argv
+@@ -87,7 +90,7 @@ always available.
+ native function is preferred when possible.
+
+ See the :ref:`audit events table <audit-events>` for all events raised by
+- ``CPython``.
++ CPython.
+
+ .. versionadded:: 3.8
+
+@@ -1434,7 +1437,7 @@ always available.
+ On Windows, UTF-8 is used for the console device. Non-character
+ devices such as disk files and pipes use the system locale
+ encoding (i.e. the ANSI codepage). Non-console character
+- devices such as NUL (i.e. where isatty() returns True) use the
++ devices such as NUL (i.e. where ``isatty()`` returns ``True``) use the
+ value of the console input and output codepages at startup,
+ respectively for stdin and stdout/stderr. This defaults to the
+ system locale encoding if the process is not initially attached
+diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst
+index eb9da2b911..fd815ef017 100644
+--- a/Doc/library/threading.rst
++++ b/Doc/library/threading.rst
+@@ -62,8 +62,8 @@ This module defines the following functions:
+ should be cleared explicitly to break the reference cycle when the
+ exception is no longer needed.
+
+- Storing *object* using a custom hook can resurrect it if it is set to an
+- object which is being finalized. Avoid storing *object* after the custom
++ Storing *thread* using a custom hook can resurrect it if it is set to an
++ object which is being finalized. Avoid storing *thread* after the custom
+ hook completes to avoid resurrecting objects.
+
+ .. seealso::
+@@ -535,15 +535,15 @@ Reentrant locks also support the :ref:`context management protocol <with-locks>`
+ There is no return value in this case.
+
+ When invoked with the *blocking* argument set to true, do the same thing as when
+- called without arguments, and return true.
++ called without arguments, and return ``True``.
+
+ When invoked with the *blocking* argument set to false, do not block. If a call
+- without an argument would block, return false immediately; otherwise, do the
+- same thing as when called without arguments, and return true.
++ without an argument would block, return ``False`` immediately; otherwise, do the
++ same thing as when called without arguments, and return ``True``.
+
+ When invoked with the floating-point *timeout* argument set to a positive
+ value, block for at most the number of seconds specified by *timeout*
+- and as long as the lock cannot be acquired. Return true if the lock has
++ and as long as the lock cannot be acquired. Return ``True`` if the lock has
+ been acquired, false if the timeout has elapsed.
+
+ .. versionchanged:: 3.2
+@@ -776,20 +776,20 @@ Semaphores also support the :ref:`context management protocol <with-locks>`.
+ When invoked without arguments:
+
+ * If the internal counter is larger than zero on entry, decrement it by
+- one and return true immediately.
++ one and return ``True`` immediately.
+ * If the internal counter is zero on entry, block until awoken by a call to
+ :meth:`~Semaphore.release`. Once awoken (and the counter is greater
+- than 0), decrement the counter by 1 and return true. Exactly one
++ than 0), decrement the counter by 1 and return ``True``. Exactly one
+ thread will be awoken by each call to :meth:`~Semaphore.release`. The
+ order in which threads are awoken should not be relied on.
+
+ When invoked with *blocking* set to false, do not block. If a call
+- without an argument would block, return false immediately; otherwise, do
+- the same thing as when called without arguments, and return true.
++ without an argument would block, return ``False`` immediately; otherwise, do
++ the same thing as when called without arguments, and return ``True``.
+
+ When invoked with a *timeout* other than ``None``, it will block for at
+ most *timeout* seconds. If acquire does not complete successfully in
+- that interval, return false. Return true otherwise.
++ that interval, return ``False``. Return ``True`` otherwise.
+
+ .. versionchanged:: 3.2
+ The *timeout* parameter is new.
+@@ -866,7 +866,7 @@ method. The :meth:`~Event.wait` method blocks until the flag is true.
+
+ .. method:: is_set()
+
+- Return true if and only if the internal flag is true.
++ Return ``True`` if and only if the internal flag is true.
+
+ .. method:: set()
+
+@@ -890,7 +890,7 @@ method. The :meth:`~Event.wait` method blocks until the flag is true.
+ floating point number specifying a timeout for the operation in seconds
+ (or fractions thereof).
+
+- This method returns true if and only if the internal flag has been set to
++ This method returns ``True`` if and only if the internal flag has been set to
+ true, either before the wait call or after the wait starts, so it will
+ always return ``True`` except if a timeout is given and the operation
+ times out.
+diff --git a/Doc/library/time.rst b/Doc/library/time.rst
+index 65ab679669..e628ac44e8 100644
+--- a/Doc/library/time.rst
++++ b/Doc/library/time.rst
+@@ -42,17 +42,12 @@ An explanation of some terminology and conventions is in order.
+ library; for 32-bit systems, it is typically in 2038.
+
+ .. index::
+- single: Year 2000
+- single: Y2K
++ single: 2-digit years
+
+-.. _time-y2kissues:
+-
+-* **Year 2000 (Y2K) issues**: Python depends on the platform's C library, which
+- generally doesn't have year 2000 issues, since all dates and times are
+- represented internally as seconds since the epoch. Function :func:`strptime`
+- can parse 2-digit years when given ``%y`` format code. When 2-digit years are
+- parsed, they are converted according to the POSIX and ISO C standards: values
+- 69--99 are mapped to 1969--1999, and values 0--68 are mapped to 2000--2068.
++* Function :func:`strptime` can parse 2-digit years when given ``%y`` format
++ code. When 2-digit years are parsed, they are converted according to the POSIX
++ and ISO C standards: values 69--99 are mapped to 1969--1999, and values 0--68
++ are mapped to 2000--2068.
+
+ .. index::
+ single: UTC
+diff --git a/Doc/library/tkinter.ttk.rst b/Doc/library/tkinter.ttk.rst
+index 5ba31feae1..6967d75096 100644
+--- a/Doc/library/tkinter.ttk.rst
++++ b/Doc/library/tkinter.ttk.rst
+@@ -871,8 +871,8 @@ widget commands.
+ | | remaining values are assumed empty. If there are more values |
+ | | than columns, the extra values are ignored. |
+ +--------+---------------------------------------------------------------+
+- | open | True/False value indicating whether the item's children should|
+- | | be displayed or hidden. |
++ | open | ``True``/``False`` value indicating whether the item's |
++ | | children should be displayed or hidden. |
+ +--------+---------------------------------------------------------------+
+ | tags | A list of tags associated with this item. |
+ +--------+---------------------------------------------------------------+
+@@ -997,7 +997,7 @@ ttk.Treeview
+ The minimum width of the column in pixels. The treeview widget will
+ not make the column any smaller than specified by this option when
+ the widget is resized or the user drags a column.
+- * stretch: True/False
++ * stretch: ``True``/``False``
+ Specifies whether the column's width should be adjusted when
+ the widget is resized.
+ * width: width
+diff --git a/Doc/library/token.rst b/Doc/library/token.rst
+index 5c641ef46d..1777929be7 100644
+--- a/Doc/library/token.rst
++++ b/Doc/library/token.rst
+@@ -29,17 +29,17 @@ functions. The functions mirror definitions in the Python C header files.
+
+ .. function:: ISTERMINAL(x)
+
+- Return true for terminal token values.
++ Return ``True`` for terminal token values.
+
+
+ .. function:: ISNONTERMINAL(x)
+
+- Return true for non-terminal token values.
++ Return ``True`` for non-terminal token values.
+
+
+ .. function:: ISEOF(x)
+
+- Return true if *x* is the marker indicating the end of input.
++ Return ``True`` if *x* is the marker indicating the end of input.
+
+
+ The token constants are:
+diff --git a/Doc/library/types.rst b/Doc/library/types.rst
+index a21fb44dda..9393f9e6db 100644
+--- a/Doc/library/types.rst
++++ b/Doc/library/types.rst
+@@ -138,6 +138,10 @@ Standard names are defined for the following types:
+
+ The type for code objects such as returned by :func:`compile`.
+
++ .. audit-event:: code.__new__ code,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags CodeType
++
++ Note that the audited arguments may not match the names or positions
++ required by the initializer.
+
+ .. data:: CellType
+
+diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst
+index 3fa3cfdaf2..ebfaf7d643 100644
+--- a/Doc/library/unittest.mock.rst
++++ b/Doc/library/unittest.mock.rst
+@@ -360,7 +360,7 @@ the *new_callable* argument to :func:`patch`.
+ assert the mock has been called with the specified calls.
+ The :attr:`mock_calls` list is checked for the calls.
+
+- If *any_order* is false (the default) then the calls must be
++ If *any_order* is false then the calls must be
+ sequential. There can be extra calls before or after the
+ specified calls.
+
+@@ -873,7 +873,7 @@ object::
+ exception,
+ - if ``side_effect`` is an iterable, the async function will return the
+ next value of the iterable, however, if the sequence of result is
+- exhausted, ``StopIteration`` is raised immediately,
++ exhausted, ``StopAsyncIteration`` is raised immediately,
+ - if ``side_effect`` is not defined, the async function will return the
+ value defined by ``return_value``, hence, by default, the async function
+ returns a new :class:`AsyncMock` object.
+@@ -1006,11 +1006,11 @@ object::
+ Assert the mock has been awaited with the specified calls.
+ The :attr:`await_args_list` list is checked for the awaits.
+
+- If *any_order* is False (the default) then the awaits must be
++ If *any_order* is false then the awaits must be
+ sequential. There can be extra calls before or after the
+ specified awaits.
+
+- If *any_order* is True then the awaits can be in any order, but
++ If *any_order* is true then the awaits can be in any order, but
+ they must all appear in :attr:`await_args_list`.
+
+ >>> mock = AsyncMock()
+@@ -2085,20 +2085,20 @@ to change the default.
+
+ Methods and their defaults:
+
+-* ``__lt__``: NotImplemented
+-* ``__gt__``: NotImplemented
+-* ``__le__``: NotImplemented
+-* ``__ge__``: NotImplemented
+-* ``__int__``: 1
+-* ``__contains__``: False
+-* ``__len__``: 0
+-* ``__iter__``: iter([])
+-* ``__exit__``: False
+-* ``__aexit__``: False
+-* ``__complex__``: 1j
+-* ``__float__``: 1.0
+-* ``__bool__``: True
+-* ``__index__``: 1
++* ``__lt__``: ``NotImplemented``
++* ``__gt__``: ``NotImplemented``
++* ``__le__``: ``NotImplemented``
++* ``__ge__``: ``NotImplemented``
++* ``__int__``: ``1``
++* ``__contains__``: ``False``
++* ``__len__``: ``0``
++* ``__iter__``: ``iter([])``
++* ``__exit__``: ``False``
++* ``__aexit__``: ``False``
++* ``__complex__``: ``1j``
++* ``__float__``: ``1.0``
++* ``__bool__``: ``True``
++* ``__index__``: ``1``
+ * ``__hash__``: default hash for the mock
+ * ``__str__``: default str for the mock
+ * ``__sizeof__``: default sizeof for the mock
+diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst
+index cbee94e52c..a559d0988b 100644
+--- a/Doc/library/unittest.rst
++++ b/Doc/library/unittest.rst
+@@ -56,8 +56,8 @@ test runner
+ Kent Beck's original paper on testing frameworks using the pattern shared
+ by :mod:`unittest`.
+
+- `Nose <https://nose.readthedocs.io/>`_ and `pytest <https://docs.pytest.org/>`_
+- Third-party unittest frameworks with a lighter-weight syntax for writing
++ `pytest <https://docs.pytest.org/>`_
++ Third-party unittest framework with a lighter-weight syntax for writing
+ tests. For example, ``assert func(10) == 42``.
+
+ `The Python Testing Tools Taxonomy <https://wiki.python.org/moin/PythonTestingToolsTaxonomy>`_
+@@ -1563,7 +1563,7 @@ Test cases
+ if __name__ == "__main__":
+ unittest.main()
+
+- After running the test ``events`` would contain ``["setUp", "asyncSetUp", "test_response", "asyncTearDown", "tearDown", "cleanup"]``
++ After running the test, ``events`` would contain ``["setUp", "asyncSetUp", "test_response", "asyncTearDown", "tearDown", "cleanup"]``.
+
+
+ .. class:: FunctionTestCase(testFunc, setUp=None, tearDown=None, description=None)
+diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst
+index 49276daa7f..52f98ef39f 100644
+--- a/Doc/library/urllib.parse.rst
++++ b/Doc/library/urllib.parse.rst
+@@ -529,7 +529,7 @@ task isn't already covered by the URL parsing functions above.
+
+ .. versionchanged:: 3.7
+ Moved from :rfc:`2396` to :rfc:`3986` for quoting URL strings. "~" is now
+- included in the set of reserved characters.
++ included in the set of unreserved characters.
+
+ The optional *encoding* and *errors* parameters specify how to deal with
+ non-ASCII characters, as accepted by the :meth:`str.encode` method.
+diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst
+index 448bc67854..adc0593e80 100644
+--- a/Doc/library/urllib.request.rst
++++ b/Doc/library/urllib.request.rst
+@@ -18,7 +18,7 @@ authentication, redirections, cookies and more.
+
+ .. seealso::
+
+- The `Requests package <http://docs.python-requests.org/>`_
++ The `Requests package <https://requests.readthedocs.io/en/master/>`_
+ is recommended for a higher-level HTTP client interface.
+
+
+diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst
+index a834ac75eb..3483ef36a2 100644
+--- a/Doc/library/venv.rst
++++ b/Doc/library/venv.rst
+@@ -276,9 +276,9 @@ subclass which installs setuptools and pip into a created virtual environment::
+ This builder installs setuptools and pip so that you can pip or
+ easy_install other packages into the created virtual environment.
+
+- :param nodist: If True, setuptools and pip are not installed into the
++ :param nodist: If true, setuptools and pip are not installed into the
+ created virtual environment.
+- :param nopip: If True, pip is not installed into the created
++ :param nopip: If true, pip is not installed into the created
+ virtual environment.
+ :param progress: If setuptools or pip are installed, the progress of the
+ installation can be monitored by passing a progress
+diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst
+index cb67f2f39d..5e810680b2 100644
+--- a/Doc/library/winreg.rst
++++ b/Doc/library/winreg.rst
+@@ -343,7 +343,7 @@ This module offers the following functions:
+ value set by the :func:`SetValue` method for the key identified by *key*.
+
+ Values in the registry have name, type, and data components. This method
+- retrieves the data for a key's first value that has a NULL name. But the
++ retrieves the data for a key's first value that has a ``NULL`` name. But the
+ underlying API call doesn't return the type, so always use
+ :func:`QueryValueEx` if possible.
+
+@@ -391,7 +391,7 @@ This module offers the following functions:
+ <https://msdn.microsoft.com/en-us/library/ms724878%28v=VS.85%29.aspx>`__
+ for more details.
+
+- This function passes NULL for *security_attributes* to the API.
++ This function passes ``NULL`` for *security_attributes* to the API.
+
+
+ .. function:: SetValue(key, sub_key, type, value)
+diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst
+index 6edd0714b9..1e30aa4a89 100644
+--- a/Doc/library/wsgiref.rst
++++ b/Doc/library/wsgiref.rst
+@@ -144,7 +144,7 @@ also provides these miscellaneous utilities:
+
+ .. function:: is_hop_by_hop(header_name)
+
+- Return true if 'header_name' is an HTTP/1.1 "Hop-by-Hop" header, as defined by
++ Return ``True`` if 'header_name' is an HTTP/1.1 "Hop-by-Hop" header, as defined by
+ :rfc:`2616`.
+
+
+diff --git a/Doc/library/xml.dom.rst b/Doc/library/xml.dom.rst
+index 18519a75a5..98454e18ff 100644
+--- a/Doc/library/xml.dom.rst
++++ b/Doc/library/xml.dom.rst
+@@ -210,7 +210,7 @@ DOM Level 2 added the ability to create new :class:`Document` and
+
+ .. method:: DOMImplementation.hasFeature(feature, version)
+
+- Return true if the feature identified by the pair of strings *feature* and
++ Return ``True`` if the feature identified by the pair of strings *feature* and
+ *version* is implemented.
+
+
+@@ -335,17 +335,17 @@ All of the components of an XML document are subclasses of :class:`Node`.
+
+ .. method:: Node.hasAttributes()
+
+- Returns true if the node has any attributes.
++ Return ``True`` if the node has any attributes.
+
+
+ .. method:: Node.hasChildNodes()
+
+- Returns true if the node has any child nodes.
++ Return ``True`` if the node has any child nodes.
+
+
+ .. method:: Node.isSameNode(other)
+
+- Returns true if *other* refers to the same node as this node. This is especially
++ Return ``True`` if *other* refers to the same node as this node. This is especially
+ useful for DOM implementations which use any sort of proxy architecture (because
+ more than one object can refer to the same node).
+
+@@ -604,12 +604,12 @@ of that class.
+
+ .. method:: Element.hasAttribute(name)
+
+- Returns true if the element has an attribute named by *name*.
++ Return ``True`` if the element has an attribute named by *name*.
+
+
+ .. method:: Element.hasAttributeNS(namespaceURI, localName)
+
+- Returns true if the element has an attribute named by *namespaceURI* and
++ Return ``True`` if the element has an attribute named by *namespaceURI* and
+ *localName*.
+
+
+diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst
+index 5e87d8f028..44ac52aa83 100644
+--- a/Doc/library/xml.etree.elementtree.rst
++++ b/Doc/library/xml.etree.elementtree.rst
+@@ -574,8 +574,8 @@ Functions
+
+ .. function:: iselement(element)
+
+- Checks if an object appears to be a valid element object. *element* is an
+- element instance. Returns a true value if this is an element object.
++ Check if an object appears to be a valid element object. *element* is an
++ element instance. Return ``True`` if this is an element object.
+
+
+ .. function:: iterparse(source, events=None, parser=None)
+diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst
+index 18d2e9a60a..e8a2530fb8 100644
+--- a/Doc/library/zipfile.rst
++++ b/Doc/library/zipfile.rst
+@@ -494,7 +494,7 @@ Path objects are traversable using the ``/`` operator.
+ Invoke :meth:`ZipFile.open` on the current path. Accepts
+ the same arguments as :meth:`ZipFile.open`.
+
+-.. method:: Path.listdir()
++.. method:: Path.iterdir()
+
+ Enumerate the children of the current directory.
+
+diff --git a/Doc/license.rst b/Doc/license.rst
+index d877f45677..810d2e63fd 100644
+--- a/Doc/license.rst
++++ b/Doc/license.rst
+@@ -22,7 +22,7 @@ Virginia where he released several versions of the software.
+ In May 2000, Guido and the Python core development team moved to BeOpen.com to
+ form the BeOpen PythonLabs team. In October of the same year, the PythonLabs
+ team moved to Digital Creations (now Zope Corporation; see
+-http://www.zope.com/). In 2001, the Python Software Foundation (PSF, see
++https://www.zope.org/). In 2001, the Python Software Foundation (PSF, see
+ https://www.python.org/psf/) was formed, a non-profit organization created
+ specifically to own Python-related Intellectual Property. Zope Corporation is a
+ sponsoring member of the PSF.
+diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst
+index c6c6e40750..1703be6e77 100644
+--- a/Doc/reference/datamodel.rst
++++ b/Doc/reference/datamodel.rst
+@@ -1566,7 +1566,7 @@ not found on a module object through the normal lookup, i.e.
+ the module ``__dict__`` before raising an :exc:`AttributeError`. If found,
+ it is called with the attribute name and the result is returned.
+
+-The ``__dir__`` function should accept no arguments, and return a list of
++The ``__dir__`` function should accept no arguments, and return a sequence of
+ strings that represents the names accessible on module. If present, this
+ function overrides the standard :func:`dir` search on a module.
+
+@@ -1797,6 +1797,10 @@ Notes on using *__slots__*
+ (the other bases must have empty slot layouts) - violations raise
+ :exc:`TypeError`.
+
++* If an iterator is used for *__slots__* then a descriptor is created for each
++ of the iterator's values. However, the *__slots__* attribute will be an empty
++ iterator.
++
+ .. _class-customization:
+
+ Customizing class creation
+@@ -2128,8 +2132,8 @@ operators. It is recommended that both mappings and sequences implement the
+ mappings, ``in`` should search the mapping's keys; for sequences, it should
+ search through the values. It is further recommended that both mappings and
+ sequences implement the :meth:`__iter__` method to allow efficient iteration
+-through the container; for mappings, :meth:`__iter__` should be the same as
+-:meth:`keys`; for sequences, it should iterate through the values.
++through the container; for mappings, :meth:`__iter__` should iterate
++through the object's keys; for sequences, it should iterate through the values.
+
+ .. method:: object.__len__(self)
+
+@@ -2243,9 +2247,9 @@ through the container; for mappings, :meth:`__iter__` should be the same as
+
+
+ The membership test operators (:keyword:`in` and :keyword:`not in`) are normally
+-implemented as an iteration through a sequence. However, container objects can
++implemented as an iteration through a container. However, container objects can
+ supply the following special method with a more efficient implementation, which
+-also does not require the object be a sequence.
++also does not require the object be iterable.
+
+ .. method:: object.__contains__(self, item)
+
+diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst
+index 0228bfb7e9..c6f6d030d2 100644
+--- a/Doc/reference/import.rst
++++ b/Doc/reference/import.rst
+@@ -682,7 +682,7 @@ Before Python loads cached bytecode from ``.pyc`` file, it checks whether the
+ cache is up-to-date with the source ``.py`` file. By default, Python does this
+ by storing the source's last-modified timestamp and size in the cache file when
+ writing it. At runtime, the import system then validates the cache file by
+-checking the stored metadata in the cache file against at source's
++checking the stored metadata in the cache file against the source's
+ metadata.
+
+ Python also supports "hash-based" cache files, which store a hash of the source
+@@ -849,7 +849,7 @@ In order to support imports of modules and initialized packages and also to
+ contribute portions to namespace packages, path entry finders must implement
+ the :meth:`~importlib.abc.PathEntryFinder.find_spec` method.
+
+-:meth:`~importlib.abc.PathEntryFinder.find_spec` takes two argument, the
++:meth:`~importlib.abc.PathEntryFinder.find_spec` takes two arguments: the
+ fully qualified name of the module being imported, and the (optional) target
+ module. ``find_spec()`` returns a fully populated spec for the module.
+ This spec will always have "loader" set (with one exception).
+@@ -913,7 +913,7 @@ the builtin :func:`__import__` function may be sufficient. This technique
+ may also be employed at the module level to only alter the behaviour of
+ import statements within that module.
+
+-To selectively prevent import of some modules from a hook early on the
++To selectively prevent the import of some modules from a hook early on the
+ meta path (rather than disabling the standard import system entirely),
+ it is sufficient to raise :exc:`ModuleNotFoundError` directly from
+ :meth:`~importlib.abc.MetaPathFinder.find_spec` instead of returning
+diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst
+index 0a043a9005..a8ec0fbe8b 100644
+--- a/Doc/reference/simple_stmts.rst
++++ b/Doc/reference/simple_stmts.rst
+@@ -839,6 +839,7 @@ the :ref:`relativeimports` section.
+ :func:`importlib.import_module` is provided to support applications that
+ determine dynamically the modules to be loaded.
+
++.. audit-event:: import module,filename,sys.path,sys.meta_path,sys.path_hooks import
+
+ .. _future:
+
+diff --git a/Doc/tools/static/switchers.js b/Doc/tools/static/switchers.js
+index fa298a76b0..e1ef91a8df 100644
+--- a/Doc/tools/static/switchers.js
++++ b/Doc/tools/static/switchers.js
+@@ -11,7 +11,7 @@
+
+ var all_versions = {
+ '3.9': 'dev (3.9)',
+- '3.8': 'pre (3.8)',
++ '3.8': '3.8',
+ '3.7': '3.7',
+ '3.6': '3.6',
+ '3.5': '3.5',
+@@ -23,6 +23,7 @@
+ 'fr': 'French',
+ 'ja': 'Japanese',
+ 'ko': 'Korean',
++ 'pt-br': 'Brazilian Portuguese',
+ 'zh-cn': 'Simplified Chinese',
+ };
+
+diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv
+index a0fc874829..586b5db6fc 100644
+--- a/Doc/tools/susp-ignored.csv
++++ b/Doc/tools/susp-ignored.csv
+@@ -2,6 +2,7 @@ c-api/arg,,:ref,"PyArg_ParseTuple(args, ""O|O:ref"", &object, &callback)"
+ c-api/list,,:high,list[low:high]
+ c-api/sequence,,:i2,del o[i1:i2]
+ c-api/sequence,,:i2,o[i1:i2]
++c-api/tuple,,:high,p[low:high]
+ c-api/unicode,,:end,str[start:end]
+ c-api/unicode,,:start,unicode[start:start+length]
+ distutils/examples,267,`,This is the description of the ``foobar`` package.
+@@ -237,9 +238,9 @@ library/urllib.request,,:password,"""joe:password@python.org"""
+ library/urllib.parse,,:scheme,<URL:scheme://host/path>
+ library/urllib.parse,,:scheme,URL:scheme://host/path
+ library/uuid,,:uuid,urn:uuid:12345678-1234-5678-1234-567812345678
+-library/venv,,:param,":param nodist: If True, setuptools and pip are not installed into the"
++library/venv,,:param,":param nodist: If true, setuptools and pip are not installed into the"
+ library/venv,,:param,":param progress: If setuptools or pip are installed, the progress of the"
+-library/venv,,:param,":param nopip: If True, pip is not installed into the created"
++library/venv,,:param,":param nopip: If true, pip is not installed into the created"
+ library/venv,,:param,:param context: The information for the virtual environment
+ library/xmlrpc.client,,:nil,ex:nil
+ library/xmlrpc.client,,:pass,http://user:pass@host:port/path
+diff --git a/Doc/tools/templates/indexsidebar.html b/Doc/tools/templates/indexsidebar.html
+index 4fd7423430..c51dcc7582 100644
+--- a/Doc/tools/templates/indexsidebar.html
++++ b/Doc/tools/templates/indexsidebar.html
+@@ -3,7 +3,7 @@
+ <h3>{% trans %}Docs by version{% endtrans %}</h3>
+ <ul>
+ <li><a href="https://docs.python.org/3.9/">{% trans %}Python 3.9 (in development){% endtrans %}</a></li>
+- <li><a href="https://docs.python.org/3.8/">{% trans %}Python 3.8 (pre-release){% endtrans %}</a></li>
++ <li><a href="https://docs.python.org/3.8/">{% trans %}Python 3.8 (stable){% endtrans %}</a></li>
+ <li><a href="https://docs.python.org/3.7/">{% trans %}Python 3.7 (stable){% endtrans %}</a></li>
+ <li><a href="https://docs.python.org/3.6/">{% trans %}Python 3.6 (security-fixes){% endtrans %}</a></li>
+ <li><a href="https://docs.python.org/3.5/">{% trans %}Python 3.5 (security-fixes){% endtrans %}</a></li>
+diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst
+index a0d56274fd..2f7afb088f 100644
+--- a/Doc/tutorial/datastructures.rst
++++ b/Doc/tutorial/datastructures.rst
+@@ -675,10 +675,10 @@ to a variable. For example, ::
+ >>> non_null
+ 'Trondheim'
+
+-Note that in Python, unlike C, assignment cannot occur inside expressions. C
+-programmers may grumble about this, but it avoids a common class of problems
+-encountered in C programs: typing ``=`` in an expression when ``==`` was
+-intended.
++Note that in Python, unlike C, assignment inside expressions must be done
++explicitly with the walrus operator ``:=``. This avoids a common class of
++problems encountered in C programs: typing ``=`` in an expression when ``==``
++was intended.
+
+
+ .. _tut-comparing:
+diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst
+index 320befdbb9..501fb6a785 100644
+--- a/Doc/tutorial/interpreter.rst
++++ b/Doc/tutorial/interpreter.rst
+@@ -23,7 +23,7 @@ is an installation option, other places are possible; check with your local
+ Python guru or system administrator. (E.g., :file:`/usr/local/python` is a
+ popular alternative location.)
+
+-On Windows machines where you have installed from the :ref:`Microsoft Store
++On Windows machines where you have installed Python from the :ref:`Microsoft Store
+ <windows-store>`, the :file:`python3.8` command will be available. If you have
+ the :ref:`py.exe launcher <launcher>` installed, you can use the :file:`py`
+ command. See :ref:`setting-envvars` for other ways to launch Python.
+diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst
+index 20ad3563ca..1b89056970 100644
+--- a/Doc/tutorial/stdlib.rst
++++ b/Doc/tutorial/stdlib.rst
+@@ -72,21 +72,23 @@ three`` at the command line::
+ >>> print(sys.argv)
+ ['demo.py', 'one', 'two', 'three']
+
+-The :mod:`argparse` module provides a mechanism to process command line arguments.
+-It should always be preferred over directly processing ``sys.argv`` manually.
+-
+-Take, for example, the below snippet of code::
+-
+- >>> import argparse
+- >>> from getpass import getuser
+- >>> parser = argparse.ArgumentParser(description='An argparse example.')
+- >>> parser.add_argument('name', nargs='?', default=getuser(), help='The name of someone to greet.')
+- >>> parser.add_argument('--verbose', '-v', action='count')
+- >>> args = parser.parse_args()
+- >>> greeting = ["Hi", "Hello", "Greetings! its very nice to meet you"][args.verbose % 3]
+- >>> print(f'{greeting}, {args.name}')
+- >>> if not args.verbose:
+- >>> print('Try running this again with multiple "-v" flags!')
++The :mod:`argparse` module provides a more sophisticated mechanism to process
++command line arguments. The following script extracts one or more filenames
++and an optional number of lines to be displayed::
++
++ import argparse
++
++ parser = argparse.ArgumentParser(prog = 'top',
++ description = 'Show top lines from each file')
++ parser.add_argument('filenames', nargs='+')
++ parser.add_argument('-l', '--lines', type=int, default=10)
++ args = parser.parse_args()
++ print(args)
++
++When run at the command line with ``python top.py --lines=5 alpha.txt
++beta.txt``, the script sets ``args.lines`` to ``5`` and ``args.filenames``
++to ``['alpha.txt', 'beta.txt']``.
++
+
+ .. _tut-stderr:
+
+diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
+index 69169d7b14..c30f6fc7cf 100644
+--- a/Doc/using/cmdline.rst
++++ b/Doc/using/cmdline.rst
+@@ -454,7 +454,7 @@ Miscellaneous options
+ on a crash.
+ * Enable :ref:`asyncio debug mode <asyncio-debug-mode>`.
+ * Set the :attr:`~sys.flags.dev_mode` attribute of :attr:`sys.flags` to
+- ``True``
++ ``True``.
+ * :class:`io.IOBase` destructor logs ``close()`` exceptions.
+
+ * ``-X utf8`` enables UTF-8 mode for operating system interfaces, overriding
+@@ -773,8 +773,8 @@ conflict.
+
+ * ``debug``: install debug hooks on top of the :ref:`default memory
+ allocators <default-memory-allocators>`.
+- * ``malloc_debug``: same as ``malloc`` but also install debug hooks
+- * ``pymalloc_debug``: same as ``pymalloc`` but also install debug hooks
++ * ``malloc_debug``: same as ``malloc`` but also install debug hooks.
++ * ``pymalloc_debug``: same as ``pymalloc`` but also install debug hooks.
+
+ See the :ref:`default memory allocators <default-memory-allocators>` and the
+ :c:func:`PyMem_SetupDebugHooks` function (install debug hooks on Python
+diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst
+index 50eb9d3145..9dc3e796cc 100644
+--- a/Doc/using/windows.rst
++++ b/Doc/using/windows.rst
+@@ -325,6 +325,9 @@ If you have installed another version of Python and added it to your
+ one from the Microsoft Store. To access the new installation, use
+ ``python3.exe`` or ``python3.x.exe``.
+
++The ``py.exe`` launcher will detect this Python installation, but will prefer
++installations from the traditional installer.
++
+ To remove Python, open Settings and use Apps and Features, or else find
+ Python in Start and right-click to select Uninstall. Uninstalling will
+ remove all packages you installed directly into this Python installation, but
+@@ -333,9 +336,6 @@ will not remove any virtual environments
+ Known Issues
+ ------------
+
+-Currently, the ``py.exe`` launcher cannot be used to start Python when it
+-has been installed from the Microsoft Store.
+-
+ Because of restrictions on Microsoft Store apps, Python scripts may not have
+ full write access to shared locations such as ``TEMP`` and the registry.
+ Instead, it will write to a private copy. If your scripts must modify the
+diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst
+index 9f8d9f202c..d19c8e01ad 100644
+--- a/Doc/whatsnew/2.7.rst
++++ b/Doc/whatsnew/2.7.rst
+@@ -1169,7 +1169,7 @@ changes, or look through the Subversion logs for all the details.
+ correctly copy bound instance methods. (Implemented by
+ Robert Collins; :issue:`1515`.)
+
+-* The :mod:`ctypes` module now always converts ``None`` to a C NULL
++* The :mod:`ctypes` module now always converts ``None`` to a C ``NULL``
+ pointer for arguments declared as pointers. (Changed by Thomas
+ Heller; :issue:`4606`.) The underlying `libffi library
+ <https://sourceware.org/libffi/>`__ has been updated to version
+diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst
+index 822ba81be8..99d040840d 100644
+--- a/Doc/whatsnew/3.4.rst
++++ b/Doc/whatsnew/3.4.rst
+@@ -2503,13 +2503,13 @@ Changes in the C API
+
+ * The result of the :c:data:`PyOS_ReadlineFunctionPointer` callback must
+ now be a string allocated by :c:func:`PyMem_RawMalloc` or
+- :c:func:`PyMem_RawRealloc`, or *NULL* if an error occurred, instead of a
++ :c:func:`PyMem_RawRealloc`, or ``NULL`` if an error occurred, instead of a
+ string allocated by :c:func:`PyMem_Malloc` or :c:func:`PyMem_Realloc`
+ (:issue:`16742`)
+
+ * :c:func:`PyThread_set_key_value` now always set the value. In Python
+ 3.3, the function did nothing if the key already exists (if the current
+- value is a non-NULL pointer).
++ value is a non-``NULL`` pointer).
+
+ * The ``f_tstate`` (thread state) field of the :c:type:`PyFrameObject`
+ structure has been removed to fix a bug: see :issue:`14432` for the
+diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst
+index 1ec8e0c04c..2197bd9739 100644
+--- a/Doc/whatsnew/3.7.rst
++++ b/Doc/whatsnew/3.7.rst
+@@ -1707,7 +1707,7 @@ The type of results of :c:func:`PyThread_start_new_thread` and
+ (Contributed by Serhiy Storchaka in :issue:`6532`.)
+
+ :c:func:`PyUnicode_AsWideCharString` now raises a :exc:`ValueError` if the
+-second argument is *NULL* and the :c:type:`wchar_t*` string contains null
++second argument is ``NULL`` and the :c:type:`wchar_t*` string contains null
+ characters. (Contributed by Serhiy Storchaka in :issue:`30708`.)
+
+ Changes to the startup sequence and the management of dynamic memory
+diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst
+index d80005fda3..d975fb7815 100644
+--- a/Doc/whatsnew/3.8.rst
++++ b/Doc/whatsnew/3.8.rst
+@@ -49,14 +49,6 @@ For full details, see the :ref:`changelog <changelog>`.
+
+ Python 3.8 was released on October 14th, 2019.
+
+-Prerelease users should be aware that this document is currently in
+-draft form. It will be updated as Python 3.8 moves towards release, so
+-it's worth checking back even after reading earlier versions. Some
+-notable items not yet covered are:
+-
+-* :pep:`578` - Runtime audit hooks for potentially sensitive operations
+-* ``python -m asyncio`` runs a natively async REPL
+-
+ .. testsetup::
+
+ from datetime import date
+@@ -289,6 +281,18 @@ calculations can be shown::
+ (Contributed by Eric V. Smith and Larry Hastings in :issue:`36817`.)
+
+
++PEP 578: Python Runtime Audit Hooks
++-----------------------------------
++
++The PEP adds an Audit Hook and Verified Open Hook. Both are available from
++Python and native code, allowing applications and frameworks written in pure
++Python code to take advantage of extra notifications, while also allowing
++embedders or system administrators to deploy builds of Python where auditing is
++always enabled.
++
++See :pep:`578` for full details.
++
++
+ PEP 587: Python Initialization Configuration
+ --------------------------------------------
+
+@@ -353,8 +357,8 @@ It is meant to formalize existing optimizations which were already done
+ for various classes.
+ Any extension type implementing a callable can use this protocol.
+
+-This is currently provisional,
+-the aim is to make it fully public in Python 3.9.
++This is currently provisional.
++The aim is to make it fully public in Python 3.9.
+
+ See :pep:`590` for a full description.
+
+@@ -443,7 +447,7 @@ Other Language Changes
+ an instance of the subclass, rather than the base class. This also affects
+ the return type of operations whose implementation (directly or indirectly)
+ uses :class:`datetime.timedelta` arithmetic, such as
+- :meth:`datetime.datetime.astimezone`.
++ :meth:`~datetime.datetime.astimezone`.
+ (Contributed by Paul Ganssle in :issue:`32417`.)
+
+ * When the Python interpreter is interrupted by Ctrl-C (SIGINT) and the
+@@ -527,6 +531,13 @@ Other Language Changes
+
+ (Contributed by Jörn Heissler in :issue:`35224`.)
+
++* The :meth:`object.__reduce__` method can now return a tuple from two to
++ six elements long. Formerly, five was the limit. The new, optional sixth
++ element is a callable with a ``(obj, state)`` signature. This allows the
++ direct control over the state-updating behavior of a specific object. If
++ not *None*, this callable will have priority over the object's
++ :meth:`~__setstate__` method.
++ (Contributed by Pierre Glaser and Olivier Grisel in :issue:`35900`.)
+
+ New Modules
+ ===========
+@@ -577,8 +588,8 @@ The :func:`ast.parse` function has some new flags:
+ comments" (returned for function definition AST nodes);
+
+ * ``feature_version=(3, N)`` allows specifying an earlier Python 3
+- version. (For example, ``feature_version=(3, 4)`` will treat
+- ``async`` and ``await`` as non-reserved words.)
++ version. For example, ``feature_version=(3, 4)`` will treat
++ :keyword:`async` and :keyword:`await` as non-reserved words.
+
+ (Contributed by Guido van Rossum in :issue:`35766`.)
+
+@@ -586,6 +597,61 @@ The :func:`ast.parse` function has some new flags:
+ asyncio
+ -------
+
++:func:`asyncio.run` has graduated from the provisional to stable API. This
++function can be used to execute a :term:`coroutine` and return the result while
++automatically managing the event loop. For example::
++
++ import asyncio
++
++ async def main():
++ await asyncio.sleep(0)
++ return 42
++
++ asyncio.run(main())
++
++This is *roughly* equivalent to::
++
++ import asyncio
++
++ async def main():
++ await asyncio.sleep(0)
++ return 42
++
++ loop = asyncio.new_event_loop()
++ asyncio.set_event_loop(loop)
++ try:
++ loop.run_until_complete(main())
++ finally:
++ asyncio.set_event_loop(None)
++ loop.close()
++
++
++The actual implementation is significantly more complex. Thus,
++:func:`asyncio.run` should be the preferred way of running asyncio programs.
++
++(Contributed by Yury Selivanov in :issue:`32314`.)
++
++Running ``python -m asyncio`` launches a natively async REPL. This allows rapid
++experimentation with code that has a top-level :keyword:`await`. There is no
++longer a need to directly call ``asyncio.run()`` which would spawn a new event
++loop on every invocation:
++
++.. code-block:: none
++
++ $ python -m asyncio
++ asyncio REPL 3.8.0
++ Use "await" directly instead of "asyncio.run()".
++ Type "help", "copyright", "credits" or "license" for more information.
++ >>> import asyncio
++ >>> await asyncio.sleep(10, result='hello')
++ hello
++
++(Contributed by Yury Selivanov in :issue:`37028`.)
++
++The exception :class:`asyncio.CancelledError` now inherits from
++:class:`BaseException` rather than :class:`Exception`.
++(Contributed by Yury Selivanov in :issue:`32528`.)
++
+ On Windows, the default event loop is now :class:`~asyncio.ProactorEventLoop`.
+ (Contributed by Victor Stinner in :issue:`34687`.)
+
+@@ -596,6 +662,26 @@ On Windows, the default event loop is now :class:`~asyncio.ProactorEventLoop`.
+ :exc:`KeyboardInterrupt` ("CTRL+C").
+ (Contributed by Vladimir Matveev in :issue:`23057`.)
+
++Added :meth:`asyncio.Task.get_coro` for getting the wrapped coroutine
++within an :class:`asyncio.Task`.
++(Contributed by Alex Grönholm in :issue:`36999`.)
++
++Asyncio tasks can now be named, either by passing the ``name`` keyword
++argument to :func:`asyncio.create_task` or
++the :meth:`~asyncio.loop.create_task` event loop method, or by
++calling the :meth:`~asyncio.Task.set_name` method on the task object. The
++task name is visible in the ``repr()`` output of :class:`asyncio.Task` and
++can also be retrieved using the :meth:`~asyncio.Task.get_name` method.
++(Contributed by Alex Grönholm in :issue:`34270`.)
++
++Added support for
++`Happy Eyeballs <https://en.wikipedia.org/wiki/Happy_Eyeballs>`_ to
++:func:`asyncio.loop.create_connection`. To specify the behavior, two new
++parameters have been added: *happy_eyeballs_delay* and *interleave*. The Happy
++Eyeballs algorithm improves responsiveness in applications that support IPv4
++and IPv6 by attempting to simultaneously connect using both.
++(Contributed by twisteroid ambassador in :issue:`33530`.)
++
+
+ builtins
+ --------
+@@ -611,14 +697,39 @@ marked with the ``CO_COROUTINE`` flag may then be returned.
+ collections
+ -----------
+
+-The :meth:`_asdict()` method for :func:`collections.namedtuple` now returns
+-a :class:`dict` instead of a :class:`collections.OrderedDict`. This works because
+-regular dicts have guaranteed ordering since Python 3.7. If the extra
+-features of :class:`OrderedDict` are required, the suggested remediation is
+-to cast the result to the desired type: ``OrderedDict(nt._asdict())``.
++The :meth:`~collections.somenamedtuple._asdict` method for
++:func:`collections.namedtuple` now returns a :class:`dict` instead of a
++:class:`collections.OrderedDict`. This works because regular dicts have
++guaranteed ordering since Python 3.7. If the extra features of
++:class:`OrderedDict` are required, the suggested remediation is to cast the
++result to the desired type: ``OrderedDict(nt._asdict())``.
+ (Contributed by Raymond Hettinger in :issue:`35864`.)
+
+
++cProfile
++--------
++
++The :class:`cProfile.Profile <profile.Profile>` class can now be used as a context manager.
++Profile a block of code by running::
++
++ import cProfile
++
++ with cProfile.Profile() as profiler:
++ # code to be profiled
++ ...
++
++(Contributed by Scott Sanderson in :issue:`29235`.)
++
++
++csv
++---
++
++The :class:`csv.DictReader` now returns instances of :class:`dict` instead of
++a :class:`collections.OrderedDict`. The tool is now faster and uses less
++memory while still preserving the field order.
++(Contributed by Michael Seek in :issue:`34003`.)
++
++
+ curses
+ -------
+
+@@ -664,6 +775,46 @@ than as a function returning a decorator. So both of these are now supported::
+
+ (Contributed by Raymond Hettinger in :issue:`36772`.)
+
++Added a new :func:`functools.cached_property` decorator, for computed properties
++cached for the life of the instance. ::
++
++ import functools
++ import statistics
++
++ class Dataset:
++ def __init__(self, sequence_of_numbers):
++ self.data = sequence_of_numbers
++
++ @functools.cached_property
++ def variance(self):
++ return statistics.variance(self.data)
++
++(Contributed by Carl Meyer in :issue:`21145`)
++
++
++Added a new :func:`functools.singledispatchmethod` decorator that converts
++methods into :term:`generic functions <generic function>` using
++:term:`single dispatch`::
++
++ from functools import singledispatchmethod
++ from contextlib import suppress
++
++ class TaskManager:
++
++ def __init__(self, tasks):
++ self.tasks = list(tasks)
++
++ @singledispatchmethod
++ def discard(self, value):
++ with suppress(ValueError):
++ self.tasks.remove(value)
++
++ @discard.register(list)
++ def _(self, tasks):
++ targets = set(tasks)
++ self.tasks = [x for x in self.tasks if x not in targets]
++
++(Contributed by Ethan Smith in :issue:`32380`)
+
+ gc
+ --
+@@ -692,7 +843,7 @@ for certain types of invalid or corrupt gzip files.
+ :issue:`6584`.)
+
+
+-idlelib and IDLE
++IDLE and idlelib
+ ----------------
+
+ Output over N lines (50 by default) is squeezed down to a button.
+@@ -708,12 +859,19 @@ They also re-appear in the box for the next customized run. One can also
+ suppress the normal Shell main module restart. (Contributed by Cheryl
+ Sabella, Terry Jan Reedy, and others in :issue:`5680` and :issue:`37627`.)
+
+-Add optional line numbers for IDLE editor windows. Windows
++Added optional line numbers for IDLE editor windows. Windows
+ open without line numbers unless set otherwise in the General
+ tab of the configuration dialog. Line numbers for an existing
+ window are shown and hidden in the Options menu.
+ (Contributed by Tal Einat and Saimadhav Heblikar in :issue:`17535`.)
+
++OS native encoding is now used for converting between Python strings and Tcl
++objects. This allows IDLE to work with emoji and other non-BMP characters.
++These characters can be displayed or copied and pasted to or from the
++clipboard. Converting strings from Tcl to Python and back now never fails.
++(Many people worked on this for eight years but the problem was finally
++solved by Serhiy Storchaka in :issue:`13153`.)
++
+ The changes above have been backported to 3.7 maintenance releases.
+
+
+@@ -744,13 +902,44 @@ fails. The exception is ignored silently by default in release build.
+ (Contributed by Victor Stinner in :issue:`18748`.)
+
+
++itertools
++---------
++
++The :func:`itertools.accumulate` function added an option *initial* keyword
++argument to specify an initial value::
++
++ >>> from itertools import accumulate
++ >>> list(accumulate([10, 5, 30, 15], initial=1000))
++ [1000, 1010, 1015, 1045, 1060]
++
++(Contributed by Lisa Roach in :issue:`34659`.)
++
++
+ json.tool
+ ---------
+
+-Add option ``--json-lines`` to parse every input line as separate JSON object.
++Add option ``--json-lines`` to parse every input line as a separate JSON object.
+ (Contributed by Weipeng Hong in :issue:`31553`.)
+
+
++logging
++-------
++
++Added a *force* keyword argument to :func:`logging.basicConfig()`
++When set to true, any existing handlers attached
++to the root logger are removed and closed before carrying out the
++configuration specified by the other arguments.
++
++This solves a long-standing problem. Once a logger or *basicConfig()* had
++been called, subsequent calls to *basicConfig()* were silently ignored.
++This made it difficult to update, experiment with, or teach the various
++logging configuration options using the interactive prompt or a Jupyter
++notebook.
++
++(Suggested by Raymond Hettinger, implemented by Dong-hee Na, and
++reviewed by Vinay Sajip in :issue:`33897`.)
++
++
+ math
+ ----
+
+@@ -770,9 +959,30 @@ numbers::
+ >>> math.prod(likelihoods, start=prior)
+ 0.126
+
+-(Contributed by Pablo Galindo in :issue:`35606`)
++(Contributed by Pablo Galindo in :issue:`35606`.)
++
++Added two new combinatoric functions :func:`math.perm` and :func:`math.comb`::
++
++ >>> math.perm(10, 3) # Permutations of 10 things taken 3 at a time
++ 720
++ >>> math.comb(10, 3) # Combinations of 10 things taken 3 at a time
++ 120
++
++(Contributed by Yash Aggarwal, Keller Fuchs, Serhiy Storchaka, and Raymond
++Hettinger in :issue:`37128`, :issue:`37178`, and :issue:`35431`.)
++
++Added a new function :func:`math.isqrt` for computing accurate integer square
++roots without conversion to floating point. The new function supports
++arbitrarily large integers. It is faster than ``floor(sqrt(n))`` but slower
++than :func:`math.sqrt`::
++
++ >>> r = 650320427
++ >>> s = r ** 2
++ >>> isqrt(s - 1) # correct
++ 650320426
++ >>> floor(sqrt(s - 1)) # incorrect
++ 650320427
+
+-Added new function :func:`math.isqrt` for computing integer square roots.
+ (Contributed by Mark Dickinson in :issue:`36887`.)
+
+ The function :func:`math.factorial` no longer accepts arguments that are not
+@@ -843,7 +1053,7 @@ environment variable and does not use :envvar:`HOME`, which is not normally set
+ for regular user accounts.
+ (Contributed by Anthony Sottile in :issue:`36264`.)
+
+-:func:`~os.path.isdir` on Windows no longer returns true for a link to a
++:func:`~os.path.isdir` on Windows no longer returns ``True`` for a link to a
+ non-existent directory.
+
+ :func:`~os.path.realpath` on Windows now resolves reparse points, including
+@@ -873,15 +1083,10 @@ to a path.
+ pickle
+ ------
+
+-Reduction methods can now include a 6th item in the tuple they return. This
+-item should specify a custom state-setting method that's called instead of the
+-regular ``__setstate__`` method.
+-(Contributed by Pierre Glaser and Olivier Grisel in :issue:`35900`)
+-
+ :mod:`pickle` extensions subclassing the C-optimized :class:`~pickle.Pickler`
+ can now override the pickling logic of functions and classes by defining the
+ special :meth:`~pickle.Pickler.reducer_override` method.
+-(Contributed by Pierre Glaser and Olivier Grisel in :issue:`35900`)
++(Contributed by Pierre Glaser and Olivier Grisel in :issue:`35900`.)
+
+
+ plistlib
+@@ -892,6 +1097,32 @@ NSKeyedArchiver-encoded binary plists.
+ (Contributed by Jon Janzen in :issue:`26707`.)
+
+
++pprint
++------
++
++The :mod:`pprint` module added a *sort_dicts* parameter to several functions.
++By default, those functions continue to sort dictionaries before rendering or
++printing. However, if *sort_dicts* is set to false, the dictionaries retain
++the order that keys were inserted. This can be useful for comparison to JSON
++inputs during debugging.
++
++In addition, there is a convenience new function, :func:`pprint.pp` that is
++like :func:`pprint.pprint` but with *sort_dicts* defaulting to ``False``::
++
++ >>> from pprint import pprint, pp
++ >>> d = dict(source='input.txt', operation='filter', destination='output.txt')
++ >>> pp(d, width=40) # Original order
++ {'source': 'input.txt',
++ 'operation': 'filter',
++ 'destination': 'output.txt'}
++ >>> pprint(d, width=40) # Keys sorted alphabetically
++ {'destination': 'output.txt',
++ 'operation': 'filter',
++ 'source': 'input.txt'}
++
++(Contributed by Rémi Lapeyre in :issue:`30670`.)
++
++
+ py_compile
+ ----------
+
+@@ -938,8 +1169,8 @@ The :func:`socket.if_nameindex()`, :func:`socket.if_nametoindex()`, and
+ ssl
+ ---
+
+-Added :attr:`ssl.SSLContext.post_handshake_auth` to enable and
+-:meth:`ssl.SSLSocket.verify_client_post_handshake` to initiate TLS 1.3
++Added :attr:`~ssl.SSLContext.post_handshake_auth` to enable and
++:meth:`~ssl.SSLSocket.verify_client_post_handshake` to initiate TLS 1.3
+ post-handshake authentication.
+ (Contributed by Christian Heimes in :issue:`34670`.)
+
+@@ -1117,8 +1348,9 @@ the string. (Contributed by Max Belanger, David Euresti, and Greg Price in
+ unittest
+ --------
+
+-Added :class:`AsyncMock` to support an asynchronous version of :class:`Mock`.
+-Appropriate new assert functions for testing have been added as well.
++Added :class:`~unittest.mock.AsyncMock` to support an asynchronous version of
++:class:`~unittest.mock.Mock`. Appropriate new assert functions for testing
++have been added as well.
+ (Contributed by Lisa Roach in :issue:`26467`).
+
+ Added :func:`~unittest.addModuleCleanup()` and
+@@ -1198,6 +1430,16 @@ them in the generated tree.
+ (Contributed by Stefan Behnel in :issue:`36676` and :issue:`36673`.)
+
+
++xmlrpc
++------
++
++:class:`xmlrpc.client.ServerProxy` now supports an optional *headers* keyword
++argument for a sequence of HTTP headers to be sent with each request. Among
++other things, this makes it possible to upgrade from default basic
++authentication to faster session authentication.
++(Contributed by Cédric Krier in :issue:`35153`.)
++
++
+ Optimizations
+ =============
+
+@@ -1241,7 +1483,7 @@ Optimizations
+
+ * Removed one ``Py_ssize_t`` member from ``PyGC_Head``. All GC tracked
+ objects (e.g. tuple, list, dict) size is reduced 4 or 8 bytes.
+- (Contributed by Inada Naoki in :issue:`33597`)
++ (Contributed by Inada Naoki in :issue:`33597`.)
+
+ * :class:`uuid.UUID` now uses ``__slots__`` to reduce its memory footprint.
+ (Contributed by Wouter Bolsterlee and Tal Einat in :issue:`30977`)
+@@ -1393,7 +1635,7 @@ Deprecated
+
+ * Passing an object that is not an instance of
+ :class:`concurrent.futures.ThreadPoolExecutor` to
+- :meth:`asyncio.loop.set_default_executor()` is
++ :meth:`loop.set_default_executor() <asyncio.loop.set_default_executor>` is
+ deprecated and will be prohibited in Python 3.9.
+ (Contributed by Elvis Pranskevichus in :issue:`34075`.)
+
+@@ -1421,6 +1663,25 @@ Deprecated
+ constant nodes.
+ (Contributed by Serhiy Storchaka in :issue:`36917`.)
+
++* The :func:`asyncio.coroutine` :term:`decorator` is deprecated and will be
++ removed in version 3.10. Instead of ``@asyncio.coroutine``, use
++ :keyword:`async def` instead.
++ (Contributed by Andrew Svetlov in :issue:`36921`.)
++
++* In :mod:`asyncio`, the explicit passing of a *loop* argument has been
++ deprecated and will be removed in version 3.10 for the following:
++ :func:`asyncio.sleep`, :func:`asyncio.gather`, :func:`asyncio.shield`,
++ :func:`asyncio.wait_for`, :func:`asyncio.wait`, :func:`asyncio.as_completed`,
++ :class:`asyncio.Task`, :class:`asyncio.Lock`, :class:`asyncio.Event`,
++ :class:`asyncio.Condition`, :class:`asyncio.Semaphore`,
++ :class:`asyncio.BoundedSemaphore`, :class:`asyncio.Queue`,
++ :func:`asyncio.create_subprocess_exec`, and
++ :func:`asyncio.create_subprocess_shell`.
++
++* The explicit passing of coroutine objects to :func:`asyncio.wait` has been
++ deprecated and will be removed in version 3.11.
++ (Contributed by Yury Selivanov in :issue:`34790`.)
++
+ * The following functions and methods are deprecated in the :mod:`gettext`
+ module: :func:`~gettext.lgettext`, :func:`~gettext.ldgettext`,
+ :func:`~gettext.lngettext` and :func:`~gettext.ldngettext`.
+@@ -1467,7 +1728,7 @@ Deprecated
+ :class:`multiprocessing.managers.SharedMemoryServer`.
+ - *obj* in :func:`weakref.finalize`.
+
+- In future releases of Python they will be :ref:`positional-only
++ In future releases of Python, they will be :ref:`positional-only
+ <positional-only_parameter>`.
+ (Contributed by Serhiy Storchaka in :issue:`36492`.)
+
+@@ -1477,6 +1738,11 @@ API and Feature Removals
+
+ The following features and APIs have been removed from Python 3.8:
+
++* Starting with Python 3.3, importing ABCs from :mod:`collections` was
++ deprecated, and importing should be done from :mod:`collections.abc`. Being
++ able to import from collections was marked for removal in 3.8, but has been
++ delayed to 3.9. (See :issue:`36952`.)
++
+ * The :mod:`macpath` module, deprecated in Python 3.7, has been removed.
+ (Contributed by Victor Stinner in :issue:`35471`.)
+
+@@ -1595,7 +1861,7 @@ Changes in the Python API
+ (Contributed by Eric Snow in :issue:`34651`, modified by Christian Heimes
+ in :issue:`37951`.)
+
+-* The :meth:`imap.IMAP4.logout` method no longer ignores silently arbitrary
++* The :meth:`imap.IMAP4.logout` method no longer silently ignores arbitrary
+ exceptions.
+ (Contributed by Victor Stinner in :issue:`36348`.)
+
+@@ -1650,7 +1916,7 @@ Changes in the Python API
+ * The ``PyGC_Head`` struct has changed completely. All code that touched the
+ struct member should be rewritten. (See :issue:`33597`.)
+
+-* The ``PyInterpreterState`` struct has been moved into the "internal"
++* The :c:type:`PyInterpreterState` struct has been moved into the "internal"
+ header files (specifically Include/internal/pycore_pystate.h). An
+ opaque ``PyInterpreterState`` is still available as part of the public
+ API (and stable ABI). The docs indicate that none of the struct's
+@@ -1660,13 +1926,6 @@ Changes in the Python API
+ you adjust (possibly including adding accessor functions to the
+ public API). (See :issue:`35886`.)
+
+-* Asyncio tasks can now be named, either by passing the ``name`` keyword
+- argument to :func:`asyncio.create_task` or
+- the :meth:`~asyncio.loop.create_task` event loop method, or by
+- calling the :meth:`~asyncio.Task.set_name` method on the task object. The
+- task name is visible in the ``repr()`` output of :class:`asyncio.Task` and
+- can also be retrieved using the :meth:`~asyncio.Task.get_name` method.
+-
+ * The :meth:`mmap.flush() <mmap.mmap.flush>` method now returns ``None`` on
+ success and raises an exception on error under all platforms. Previously,
+ its behavior was platform-dependent: a nonzero value was returned on success;
+@@ -1689,8 +1948,19 @@ Changes in the Python API
+ (Contributed by Anthony Sottile in :issue:`36264`.)
+
+ * The exception :class:`asyncio.CancelledError` now inherits from
+- :class:`BaseException` rather than a :class:`Exception`.
+- (Contributed by Yury Selivanov in :issue:`13528`.)
++ :class:`BaseException` rather than :class:`Exception`.
++ (Contributed by Yury Selivanov in :issue:`32528`.)
++
++* The function :func:`asyncio.wait_for` now correctly waits for cancellation
++ when using an instance of :class:`asyncio.Task`. Previously, upon reaching
++ *timeout*, it was cancelled and immediately returned.
++ (Contributed by Elvis Pranskevichus in :issue:`32751`.)
++
++* The function :func:`asyncio.BaseTransport.get_extra_info` now returns a safe
++ to use socket object when 'socket' is passed to the *name* parameter.
++ (Contributed by Yury Selivanov in :issue:`37027`.)
++
++* :class:`asyncio.BufferedProtocol` has graduated to the stable API.
+
+ .. _bpo-36085-whatsnew:
+
+@@ -1703,7 +1973,7 @@ Changes in the Python API
+ resolution. If your application relies on these mechanisms, you should check
+ for :func:`~os.add_dll_directory` and if it exists, use it to add your DLLs
+ directory while loading your library. Note that Windows 7 users will need to
+- ensure that Windows Update KB2533625 has been installed (this is also verified
++ ensure that Windows Update KB2533623 has been installed (this is also verified
+ by the installer).
+ (Contributed by Steve Dower in :issue:`36085`.)
+
+@@ -1884,6 +2154,55 @@ CPython bytecode changes
+ Demos and Tools
+ ---------------
+
+-* Added a benchmark script for timing various ways to access variables:
+- ``Tools/scripts/var_access_benchmark.py``.
+- (Contributed by Raymond Hettinger in :issue:`35884`.)
++Added a benchmark script for timing various ways to access variables:
++``Tools/scripts/var_access_benchmark.py``.
++(Contributed by Raymond Hettinger in :issue:`35884`.)
++
++Here's a summary of performance improvements since Python 3.3:
++
++.. code-block:: none
++
++ Python version 3.3 3.4 3.5 3.6 3.7 3.8
++ -------------- --- --- --- --- --- ---
++
++ Variable and attribute read access:
++ read_local 4.0 7.1 7.1 5.4 5.1 3.9
++ read_nonlocal 5.3 7.1 8.1 5.8 5.4 4.4
++ read_global 13.3 15.5 19.0 14.3 13.6 7.6
++ read_builtin 20.0 21.1 21.6 18.5 19.0 7.5
++ read_classvar_from_class 20.5 25.6 26.5 20.7 19.5 18.4
++ read_classvar_from_instance 18.5 22.8 23.5 18.8 17.1 16.4
++ read_instancevar 26.8 32.4 33.1 28.0 26.3 25.4
++ read_instancevar_slots 23.7 27.8 31.3 20.8 20.8 20.2
++ read_namedtuple 68.5 73.8 57.5 45.0 46.8 18.4
++ read_boundmethod 29.8 37.6 37.9 29.6 26.9 27.7
++
++ Variable and attribute write access:
++ write_local 4.6 8.7 9.3 5.5 5.3 4.3
++ write_nonlocal 7.3 10.5 11.1 5.6 5.5 4.7
++ write_global 15.9 19.7 21.2 18.0 18.0 15.8
++ write_classvar 81.9 92.9 96.0 104.6 102.1 39.2
++ write_instancevar 36.4 44.6 45.8 40.0 38.9 35.5
++ write_instancevar_slots 28.7 35.6 36.1 27.3 26.6 25.7
++
++ Data structure read access:
++ read_list 19.2 24.2 24.5 20.8 20.8 19.0
++ read_deque 19.9 24.7 25.5 20.2 20.6 19.8
++ read_dict 19.7 24.3 25.7 22.3 23.0 21.0
++ read_strdict 17.9 22.6 24.3 19.5 21.2 18.9
++
++ Data structure write access:
++ write_list 21.2 27.1 28.5 22.5 21.6 20.0
++ write_deque 23.8 28.7 30.1 22.7 21.8 23.5
++ write_dict 25.9 31.4 33.3 29.3 29.2 24.7
++ write_strdict 22.9 28.4 29.9 27.5 25.2 23.1
++
++ Stack (or queue) operations:
++ list_append_pop 144.2 93.4 112.7 75.4 74.2 50.8
++ deque_append_pop 30.4 43.5 57.0 49.4 49.2 42.5
++ deque_append_popleft 30.8 43.7 57.3 49.7 49.7 42.8
++
++ Timing loop:
++ loop_overhead 0.3 0.5 0.6 0.4 0.3 0.3
++
++ (Measured from the macOS 64-bit builds found at python.org)
+diff --git a/Include/abstract.h b/Include/abstract.h
+index c226aab9b7..777fd7077c 100644
+--- a/Include/abstract.h
++++ b/Include/abstract.h
+@@ -144,7 +144,7 @@ extern "C" {
+ /* Call a callable Python object 'callable' with arguments given by the
+ tuple 'args' and keywords arguments given by the dictionary 'kwargs'.
+
+- 'args' must not be *NULL*, use an empty tuple if no arguments are
++ 'args' must not be NULL, use an empty tuple if no arguments are
+ needed. If no named arguments are needed, 'kwargs' can be NULL.
+
+ This is the equivalent of the Python expression:
+@@ -154,9 +154,9 @@ PyAPI_FUNC(PyObject *) PyObject_Call(PyObject *callable,
+
+
+ /* Call a callable Python object 'callable', with arguments given by the
+- tuple 'args'. If no arguments are needed, then 'args' can be *NULL*.
++ tuple 'args'. If no arguments are needed, then 'args' can be NULL.
+
+- Returns the result of the call on success, or *NULL* on failure.
++ Returns the result of the call on success, or NULL on failure.
+
+ This is the equivalent of the Python expression:
+ callable(*args). */
+diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h
+index 22677d3738..47d092f3e5 100644
+--- a/Include/internal/pycore_pymem.h
++++ b/Include/internal/pycore_pymem.h
+@@ -155,9 +155,25 @@ PyAPI_FUNC(int) _PyMem_SetDefaultAllocator(
+ PyMemAllocatorDomain domain,
+ PyMemAllocatorEx *old_alloc);
+
++/* Special bytes broadcast into debug memory blocks at appropriate times.
++ Strings of these are unlikely to be valid addresses, floats, ints or
++ 7-bit ASCII.
++
++ - PYMEM_CLEANBYTE: clean (newly allocated) memory
++ - PYMEM_DEADBYTE dead (newly freed) memory
++ - PYMEM_FORBIDDENBYTE: untouchable bytes at each end of a block
++
++ Byte patterns 0xCB, 0xDB and 0xFB have been replaced with 0xCD, 0xDD and
++ 0xFD to use the same values than Windows CRT debug malloc() and free().
++ If modified, _PyMem_IsPtrFreed() should be updated as well. */
++#define PYMEM_CLEANBYTE 0xCD
++#define PYMEM_DEADBYTE 0xDD
++#define PYMEM_FORBIDDENBYTE 0xFD
++
+ /* Heuristic checking if a pointer value is newly allocated
+- (uninitialized) or newly freed. The pointer is not dereferenced, only the
+- pointer value is checked.
++ (uninitialized), newly freed or NULL (is equal to zero).
++
++ The pointer is not dereferenced, only the pointer value is checked.
+
+ The heuristic relies on the debug hooks on Python memory allocators which
+ fills newly allocated memory with CLEANBYTE (0xCD) and newly freed memory
+@@ -167,11 +183,13 @@ static inline int _PyMem_IsPtrFreed(void *ptr)
+ {
+ uintptr_t value = (uintptr_t)ptr;
+ #if SIZEOF_VOID_P == 8
+- return (value == (uintptr_t)0xCDCDCDCDCDCDCDCD
++ return (value == 0
++ || value == (uintptr_t)0xCDCDCDCDCDCDCDCD
+ || value == (uintptr_t)0xDDDDDDDDDDDDDDDD
+ || value == (uintptr_t)0xFDFDFDFDFDFDFDFD);
+ #elif SIZEOF_VOID_P == 4
+- return (value == (uintptr_t)0xCDCDCDCD
++ return (value == 0
++ || value == (uintptr_t)0xCDCDCDCD
+ || value == (uintptr_t)0xDDDDDDDD
+ || value == (uintptr_t)0xFDFDFDFD);
+ #else
+diff --git a/Include/patchlevel.h b/Include/patchlevel.h
+index d685a85709..df8bd3448b 100644
+--- a/Include/patchlevel.h
++++ b/Include/patchlevel.h
+@@ -23,7 +23,7 @@
+ #define PY_RELEASE_SERIAL 0
+
+ /* Version as a string */
+-#define PY_VERSION "3.8.0"
++#define PY_VERSION "3.8.0+"
+ /*--end constants--*/
+
+ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2.
+diff --git a/Lib/_pyio.py b/Lib/_pyio.py
+index eb4e6620fc..fd31b8ca9d 100644
+--- a/Lib/_pyio.py
++++ b/Lib/_pyio.py
+@@ -1587,7 +1587,11 @@ class FileIO(RawIOBase):
+ # For consistent behaviour, we explicitly seek to the
+ # end of file (otherwise, it might be done only on the
+ # first write()).
+- os.lseek(fd, 0, SEEK_END)
++ try:
++ os.lseek(fd, 0, SEEK_END)
++ except OSError as e:
++ if e.errno != errno.ESPIPE:
++ raise
+ except:
+ if owned_fd is not None:
+ os.close(owned_fd)
+diff --git a/Lib/argparse.py b/Lib/argparse.py
+index e590225c8e..fd61bc78c2 100644
+--- a/Lib/argparse.py
++++ b/Lib/argparse.py
+@@ -2093,10 +2093,11 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
+ OPTIONAL: _('expected at most one argument'),
+ ONE_OR_MORE: _('expected at least one argument'),
+ }
+- default = ngettext('expected %s argument',
++ msg = nargs_errors.get(action.nargs)
++ if msg is None:
++ msg = ngettext('expected %s argument',
+ 'expected %s arguments',
+ action.nargs) % action.nargs
+- msg = nargs_errors.get(action.nargs, default)
+ raise ArgumentError(action, msg)
+
+ # return the number of arguments matched
+diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py
+index 98a5308ed0..9afda220bd 100644
+--- a/Lib/asyncio/futures.py
++++ b/Lib/asyncio/futures.py
+@@ -115,7 +115,10 @@ class Future:
+
+ def get_loop(self):
+ """Return the event loop the Future is bound to."""
+- return self._loop
++ loop = self._loop
++ if loop is None:
++ raise RuntimeError("Future object is not initialized.")
++ return loop
+
+ def cancel(self):
+ """Cancel the future and schedule callbacks.
+diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
+index 229f56e6bb..830d8edc32 100644
+--- a/Lib/asyncio/proactor_events.py
++++ b/Lib/asyncio/proactor_events.py
+@@ -627,10 +627,9 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
+ self._accept_futures = {} # socket file descriptor => Future
+ proactor.set_loop(self)
+ self._make_self_pipe()
+- self_no = self._csock.fileno()
+ if threading.current_thread() is threading.main_thread():
+ # wakeup fd can only be installed to a file descriptor from the main thread
+- signal.set_wakeup_fd(self_no)
++ signal.set_wakeup_fd(self._csock.fileno())
+
+ def _make_socket_transport(self, sock, protocol, waiter=None,
+ extra=None, server=None):
+@@ -676,7 +675,8 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
+ if self.is_closed():
+ return
+
+- signal.set_wakeup_fd(-1)
++ if threading.current_thread() is threading.main_thread():
++ signal.set_wakeup_fd(-1)
+ # Call these methods before closing the event loop (before calling
+ # BaseEventLoop.close), because they can schedule callbacks with
+ # call_soon(), which is forbidden when the event loop is closed.
+diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py
+index 128155dbf4..8f0991147d 100644
+--- a/Lib/ctypes/__init__.py
++++ b/Lib/ctypes/__init__.py
+@@ -52,11 +52,13 @@ def create_string_buffer(init, size=None):
+ if isinstance(init, bytes):
+ if size is None:
+ size = len(init)+1
++ _sys.audit("ctypes.create_string_buffer", init, size)
+ buftype = c_char * size
+ buf = buftype()
+ buf.value = init
+ return buf
+ elif isinstance(init, int):
++ _sys.audit("ctypes.create_string_buffer", None, init)
+ buftype = c_char * init
+ buf = buftype()
+ return buf
+@@ -283,11 +285,13 @@ def create_unicode_buffer(init, size=None):
+ # 32-bit wchar_t (1 wchar_t per Unicode character). +1 for
+ # trailing NUL character.
+ size = len(init) + 1
++ _sys.audit("ctypes.create_unicode_buffer", init, size)
+ buftype = c_wchar * size
+ buf = buftype()
+ buf.value = init
+ return buf
+ elif isinstance(init, int):
++ _sys.audit("ctypes.create_unicode_buffer", None, init)
+ buftype = c_wchar * init
+ buf = buftype()
+ return buf
+diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py
+index 1efd36dd62..19c4430bea 100644
+--- a/Lib/ctypes/test/test_structures.py
++++ b/Lib/ctypes/test/test_structures.py
+@@ -571,6 +571,167 @@ class StructureTestCase(unittest.TestCase):
+ self.assertEqual(f2, [0x4567, 0x0123, 0xcdef, 0x89ab,
+ 0x3210, 0x7654, 0xba98, 0xfedc])
+
++ def test_union_by_value(self):
++ # See bpo-16575
++
++ # These should mirror the structures in Modules/_ctypes/_ctypes_test.c
++
++ class Nested1(Structure):
++ _fields_ = [
++ ('an_int', c_int),
++ ('another_int', c_int),
++ ]
++
++ class Test4(Union):
++ _fields_ = [
++ ('a_long', c_long),
++ ('a_struct', Nested1),
++ ]
++
++ class Nested2(Structure):
++ _fields_ = [
++ ('an_int', c_int),
++ ('a_union', Test4),
++ ]
++
++ class Test5(Structure):
++ _fields_ = [
++ ('an_int', c_int),
++ ('nested', Nested2),
++ ('another_int', c_int),
++ ]
++
++ test4 = Test4()
++ dll = CDLL(_ctypes_test.__file__)
++ with self.assertRaises(TypeError) as ctx:
++ func = dll._testfunc_union_by_value1
++ func.restype = c_long
++ func.argtypes = (Test4,)
++ result = func(test4)
++ self.assertEqual(ctx.exception.args[0], 'item 1 in _argtypes_ passes '
++ 'a union by value, which is unsupported.')
++ test5 = Test5()
++ with self.assertRaises(TypeError) as ctx:
++ func = dll._testfunc_union_by_value2
++ func.restype = c_long
++ func.argtypes = (Test5,)
++ result = func(test5)
++ self.assertEqual(ctx.exception.args[0], 'item 1 in _argtypes_ passes '
++ 'a union by value, which is unsupported.')
++
++ # passing by reference should be OK
++ test4.a_long = 12345;
++ func = dll._testfunc_union_by_reference1
++ func.restype = c_long
++ func.argtypes = (POINTER(Test4),)
++ result = func(byref(test4))
++ self.assertEqual(result, 12345)
++ self.assertEqual(test4.a_long, 0)
++ self.assertEqual(test4.a_struct.an_int, 0)
++ self.assertEqual(test4.a_struct.another_int, 0)
++ test4.a_struct.an_int = 0x12340000
++ test4.a_struct.another_int = 0x5678
++ func = dll._testfunc_union_by_reference2
++ func.restype = c_long
++ func.argtypes = (POINTER(Test4),)
++ result = func(byref(test4))
++ self.assertEqual(result, 0x12345678)
++ self.assertEqual(test4.a_long, 0)
++ self.assertEqual(test4.a_struct.an_int, 0)
++ self.assertEqual(test4.a_struct.another_int, 0)
++ test5.an_int = 0x12000000
++ test5.nested.an_int = 0x345600
++ test5.another_int = 0x78
++ func = dll._testfunc_union_by_reference3
++ func.restype = c_long
++ func.argtypes = (POINTER(Test5),)
++ result = func(byref(test5))
++ self.assertEqual(result, 0x12345678)
++ self.assertEqual(test5.an_int, 0)
++ self.assertEqual(test5.nested.an_int, 0)
++ self.assertEqual(test5.another_int, 0)
++
++ #@unittest.skipIf('s390' in MACHINE, 'Test causes segfault on S390')
++ def test_bitfield_by_value(self):
++ # See bpo-16576
++
++ # These should mirror the structures in Modules/_ctypes/_ctypes_test.c
++
++ class Test6(Structure):
++ _fields_ = [
++ ('A', c_int, 1),
++ ('B', c_int, 2),
++ ('C', c_int, 3),
++ ('D', c_int, 2),
++ ]
++
++ test6 = Test6()
++ # As these are signed int fields, all are logically -1 due to sign
++ # extension.
++ test6.A = 1
++ test6.B = 3
++ test6.C = 7
++ test6.D = 3
++ dll = CDLL(_ctypes_test.__file__)
++ with self.assertRaises(TypeError) as ctx:
++ func = dll._testfunc_bitfield_by_value1
++ func.restype = c_long
++ func.argtypes = (Test6,)
++ result = func(test6)
++ self.assertEqual(ctx.exception.args[0], 'item 1 in _argtypes_ passes '
++ 'a struct/union with a bitfield by value, which is '
++ 'unsupported.')
++ # passing by reference should be OK
++ func = dll._testfunc_bitfield_by_reference1
++ func.restype = c_long
++ func.argtypes = (POINTER(Test6),)
++ result = func(byref(test6))
++ self.assertEqual(result, -4)
++ self.assertEqual(test6.A, 0)
++ self.assertEqual(test6.B, 0)
++ self.assertEqual(test6.C, 0)
++ self.assertEqual(test6.D, 0)
++
++ class Test7(Structure):
++ _fields_ = [
++ ('A', c_uint, 1),
++ ('B', c_uint, 2),
++ ('C', c_uint, 3),
++ ('D', c_uint, 2),
++ ]
++ test7 = Test7()
++ test7.A = 1
++ test7.B = 3
++ test7.C = 7
++ test7.D = 3
++ func = dll._testfunc_bitfield_by_reference2
++ func.restype = c_long
++ func.argtypes = (POINTER(Test7),)
++ result = func(byref(test7))
++ self.assertEqual(result, 14)
++ self.assertEqual(test7.A, 0)
++ self.assertEqual(test7.B, 0)
++ self.assertEqual(test7.C, 0)
++ self.assertEqual(test7.D, 0)
++
++ # for a union with bitfields, the union check happens first
++ class Test8(Union):
++ _fields_ = [
++ ('A', c_int, 1),
++ ('B', c_int, 2),
++ ('C', c_int, 3),
++ ('D', c_int, 2),
++ ]
++
++ test8 = Test8()
++ with self.assertRaises(TypeError) as ctx:
++ func = dll._testfunc_bitfield_by_value2
++ func.restype = c_long
++ func.argtypes = (Test8,)
++ result = func(test8)
++ self.assertEqual(ctx.exception.args[0], 'item 1 in _argtypes_ passes '
++ 'a union by value, which is unsupported.')
++
+ class PointerMemberTestCase(unittest.TestCase):
+
+ def test(self):
+diff --git a/Lib/difflib.py b/Lib/difflib.py
+index 3de1b3d0fc..5d756436a6 100644
+--- a/Lib/difflib.py
++++ b/Lib/difflib.py
+@@ -1074,7 +1074,7 @@ import re
+
+ def IS_LINE_JUNK(line, pat=re.compile(r"\s*(?:#\s*)?$").match):
+ r"""
+- Return 1 for ignorable line: iff `line` is blank or contains a single '#'.
++ Return True for ignorable line: iff `line` is blank or contains a single '#'.
+
+ Examples:
+
+@@ -1090,7 +1090,7 @@ def IS_LINE_JUNK(line, pat=re.compile(r"\s*(?:#\s*)?$").match):
+
+ def IS_CHARACTER_JUNK(ch, ws=" \t"):
+ r"""
+- Return 1 for ignorable character: iff `ch` is a space or tab.
++ Return True for ignorable character: iff `ch` is a space or tab.
+
+ Examples:
+
+diff --git a/Lib/genericpath.py b/Lib/genericpath.py
+index db11f67d54..ce36451a3a 100644
+--- a/Lib/genericpath.py
++++ b/Lib/genericpath.py
+@@ -149,7 +149,7 @@ def _check_arg_types(funcname, *args):
+ elif isinstance(s, bytes):
+ hasbytes = True
+ else:
+- raise TypeError('%s() argument must be str or bytes, not %r' %
+- (funcname, s.__class__.__name__)) from None
++ raise TypeError(f'{funcname}() argument must be str, bytes, or '
++ f'os.PathLike object, not {s.__class__.__name__!r}') from None
+ if hasstr and hasbytes:
+ raise TypeError("Can't mix strings and bytes in path components") from None
+diff --git a/Lib/hmac.py b/Lib/hmac.py
+index 890eaba08e..b769876e6f 100644
+--- a/Lib/hmac.py
++++ b/Lib/hmac.py
+@@ -1,4 +1,4 @@
+-"""HMAC (Keyed-Hashing for Message Authentication) Python module.
++"""HMAC (Keyed-Hashing for Message Authentication) module.
+
+ Implements the HMAC algorithm as described by RFC 2104.
+ """
+@@ -30,23 +30,25 @@ class HMAC:
+ """
+ blocksize = 64 # 512-bit HMAC; can be changed in subclasses.
+
+- def __init__(self, key, msg = None, digestmod = None):
++ def __init__(self, key, msg=None, digestmod=''):
+ """Create a new HMAC object.
+
+- key: key for the keyed hash object.
+- msg: Initial input for the hash, if provided.
+- digestmod: Required. A module supporting PEP 247. *OR*
+- A hashlib constructor returning a new hash object. *OR*
+- A hash name suitable for hashlib.new().
++ key: bytes or buffer, key for the keyed hash object.
++ msg: bytes or buffer, Initial input for the hash or None.
++ digestmod: A hash name suitable for hashlib.new(). *OR*
++ A hashlib constructor returning a new hash object. *OR*
++ A module supporting PEP 247.
+
+- Note: key and msg must be a bytes or bytearray objects.
++ Required as of 3.8, despite its position after the optional
++ msg argument. Passing it as a keyword argument is
++ recommended, though not required for legacy API reasons.
+ """
+
+ if not isinstance(key, (bytes, bytearray)):
+ raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)
+
+- if digestmod is None:
+- raise ValueError('`digestmod` is required.')
++ if not digestmod:
++ raise TypeError("Missing required parameter 'digestmod'.")
+
+ if callable(digestmod):
+ self.digest_cons = digestmod
+@@ -90,8 +92,7 @@ class HMAC:
+ return "hmac-" + self.inner.name
+
+ def update(self, msg):
+- """Update this hashing object with the string msg.
+- """
++ """Feed data from msg into this hashing object."""
+ self.inner.update(msg)
+
+ def copy(self):
+@@ -119,7 +120,7 @@ class HMAC:
+ def digest(self):
+ """Return the hash value of this hashing object.
+
+- This returns a string containing 8-bit data. The object is
++ This returns the hmac value as bytes. The object is
+ not altered in any way by this function; you can continue
+ updating the object after calling this function.
+ """
+@@ -132,30 +133,34 @@ class HMAC:
+ h = self._current()
+ return h.hexdigest()
+
+-def new(key, msg = None, digestmod = None):
++def new(key, msg=None, digestmod=''):
+ """Create a new hashing object and return it.
+
+- key: The starting key for the hash.
+- msg: if available, will immediately be hashed into the object's starting
+- state.
++ key: bytes or buffer, The starting key for the hash.
++ msg: bytes or buffer, Initial input for the hash, or None.
++ digestmod: A hash name suitable for hashlib.new(). *OR*
++ A hashlib constructor returning a new hash object. *OR*
++ A module supporting PEP 247.
++
++ Required as of 3.8, despite its position after the optional
++ msg argument. Passing it as a keyword argument is
++ recommended, though not required for legacy API reasons.
+
+- You can now feed arbitrary strings into the object using its update()
++ You can now feed arbitrary bytes into the object using its update()
+ method, and can ask for the hash value at any time by calling its digest()
+- method.
++ or hexdigest() methods.
+ """
+ return HMAC(key, msg, digestmod)
+
+
+ def digest(key, msg, digest):
+- """Fast inline implementation of HMAC
++ """Fast inline implementation of HMAC.
+
+- key: key for the keyed hash object.
+- msg: input message
++ key: bytes or buffer, The key for the keyed hash object.
++ msg: bytes or buffer, Input message.
+ digest: A hash name suitable for hashlib.new() for best performance. *OR*
+ A hashlib constructor returning a new hash object. *OR*
+ A module supporting PEP 247.
+-
+- Note: key and msg must be a bytes or bytearray objects.
+ """
+ if (_hashopenssl is not None and
+ isinstance(digest, str) and digest in _openssl_md_meths):
+diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py
+index adc7ed6242..47ed5c3d64 100644
+--- a/Lib/http/cookiejar.py
++++ b/Lib/http/cookiejar.py
+@@ -214,10 +214,14 @@ LOOSE_HTTP_DATE_RE = re.compile(
+ (?::(\d\d))? # optional seconds
+ )? # optional clock
+ \s*
+- ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone
++ (?:
++ ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+) # timezone
++ \s*
++ )?
++ (?:
++ \(\w+\) # ASCII representation of timezone in parens.
+ \s*
+- (?:\(\w+\))? # ASCII representation of timezone in parens.
+- \s*$""", re.X | re.ASCII)
++ )?$""", re.X | re.ASCII)
+ def http2time(text):
+ """Returns time in seconds since epoch of time represented by a string.
+
+@@ -287,9 +291,11 @@ ISO_DATE_RE = re.compile(
+ (?::?(\d\d(?:\.\d*)?))? # optional seconds (and fractional)
+ )? # optional clock
+ \s*
+- ([-+]?\d\d?:?(:?\d\d)?
+- |Z|z)? # timezone (Z is "zero meridian", i.e. GMT)
+- \s*$""", re.X | re. ASCII)
++ (?:
++ ([-+]?\d\d?:?(:?\d\d)?
++ |Z|z) # timezone (Z is "zero meridian", i.e. GMT)
++ \s*
++ )?$""", re.X | re. ASCII)
+ def iso2time(text):
+ """
+ As for http2time, but parses the ISO 8601 formats:
+diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt
+index 9d26bda425..153c7630cf 100644
+--- a/Lib/idlelib/NEWS.txt
++++ b/Lib/idlelib/NEWS.txt
+@@ -1,7 +1,34 @@
++What's New in IDLE 3.8.1
++Released on 2019-12-16?
++======================================
++
++
++bpo-38636: Fix IDLE Format menu tab toggle and file indent width. These
++functions (default shortcuts Alt-T and Alt-U) were mistakenly disabled
++in 3.7.5 and 3.8.0.
++
++bpo-4360: Add an option to toggle IDLE's cursor blink for shell,
++editor, and output windows. See Settings, General, Window Preferences,
++Cursor Blink. Patch by Zachary Spytz.
++
++bpo-26353: Stop adding newline when saving an IDLE shell window.
++
++bpo-38598: Do not try to compile IDLE shell or output windows.
++
++
+ What's New in IDLE 3.8.0 (since 3.7.0)
+-Released on 2019-10-20?
++Released on 2019-10-14
+ ======================================
+
++bpo-36698: IDLE no longer fails when writing non-encodable characters
++to stderr. It now escapes them with a backslash, like the regular
++Python interpreter. Add an errors field to the standard streams.
++
++bpo-13153: Improve tkinter's handing of non-BMP (astral) unicode
++characters, such as 'rocket \U0001f680'. Whether a proper glyph or
++replacement char is displayed depends on the OS and font. For IDLE,
++astral chars in code interfere with editing.
++
+ bpo-35379: When exiting IDLE, catch any AttributeError. One happens
+ when EditorWindow.close is called twice. Printing a traceback, when
+ IDLE is run from a terminal, is useless and annoying.
+diff --git a/Lib/idlelib/config-main.def b/Lib/idlelib/config-main.def
+index b2be6250d0..28ae94161d 100644
+--- a/Lib/idlelib/config-main.def
++++ b/Lib/idlelib/config-main.def
+@@ -59,6 +59,7 @@ delete-exitfunc= 1
+ [EditorWindow]
+ width= 80
+ height= 40
++cursor-blink= 1
+ font= TkFixedFont
+ # For TkFixedFont, the actual size and boldness are obtained from tk
+ # and override 10 and 0. See idlelib.config.IdleConf.GetFont
+diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py
+index 12e6f9fae7..04444a3bf2 100644
+--- a/Lib/idlelib/config.py
++++ b/Lib/idlelib/config.py
+@@ -158,6 +158,8 @@ class IdleConf:
+ self.defaultCfg = {}
+ self.userCfg = {}
+ self.cfg = {} # TODO use to select userCfg vs defaultCfg
++ # self.blink_off_time = <first editor text>['insertofftime']
++ # See https:/bugs.python.org/issue4630, msg356516.
+
+ if not _utest:
+ self.CreateConfigHandlers()
+diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py
+index df216582fe..aaf319bbe1 100644
+--- a/Lib/idlelib/configdialog.py
++++ b/Lib/idlelib/configdialog.py
+@@ -236,6 +236,7 @@ class ConfigDialog(Toplevel):
+ instance.set_notabs_indentwidth()
+ instance.ApplyKeybindings()
+ instance.reset_help_menu_entries()
++ instance.update_cursor_blink()
+ for klass in reloadables:
+ klass.reload()
+
+@@ -1820,6 +1821,9 @@ class GenPage(Frame):
+ (*)win_width_int: Entry - win_width
+ win_height_title: Label
+ (*)win_height_int: Entry - win_height
++ frame_cursor_blink: Frame
++ cursor_blink_title: Label
++ (*)cursor_blink_bool: Checkbutton - cursor_blink
+ frame_autocomplete: Frame
+ auto_wait_title: Label
+ (*)auto_wait_int: Entry - autocomplete_wait
+@@ -1864,6 +1868,8 @@ class GenPage(Frame):
+ StringVar(self), ('main', 'EditorWindow', 'width'))
+ self.win_height = tracers.add(
+ StringVar(self), ('main', 'EditorWindow', 'height'))
++ self.cursor_blink = tracers.add(
++ BooleanVar(self), ('main', 'EditorWindow', 'cursor-blink'))
+ self.autocomplete_wait = tracers.add(
+ StringVar(self), ('extensions', 'AutoComplete', 'popupwait'))
+ self.paren_style = tracers.add(
+@@ -1920,6 +1926,11 @@ class GenPage(Frame):
+ validatecommand=self.digits_only, validate='key',
+ )
+
++ frame_cursor_blink = Frame(frame_window, borderwidth=0)
++ cursor_blink_title = Label(frame_cursor_blink, text='Cursor Blink')
++ self.cursor_blink_bool = Checkbutton(frame_cursor_blink,
++ variable=self.cursor_blink, width=1)
++
+ frame_autocomplete = Frame(frame_window, borderwidth=0,)
+ auto_wait_title = Label(frame_autocomplete,
+ text='Completions Popup Wait (milliseconds)')
+@@ -2024,6 +2035,10 @@ class GenPage(Frame):
+ win_height_title.pack(side=RIGHT, anchor=E, pady=5)
+ self.win_width_int.pack(side=RIGHT, anchor=E, padx=10, pady=5)
+ win_width_title.pack(side=RIGHT, anchor=E, pady=5)
++ # frame_cursor_blink.
++ frame_cursor_blink.pack(side=TOP, padx=5, pady=0, fill=X)
++ cursor_blink_title.pack(side=LEFT, anchor=W, padx=5, pady=5)
++ self.cursor_blink_bool.pack(side=LEFT, padx=5, pady=5)
+ # frame_autocomplete.
+ frame_autocomplete.pack(side=TOP, padx=5, pady=0, fill=X)
+ auto_wait_title.pack(side=LEFT, anchor=W, padx=5, pady=5)
+@@ -2078,6 +2093,8 @@ class GenPage(Frame):
+ 'main', 'EditorWindow', 'width', type='int'))
+ self.win_height.set(idleConf.GetOption(
+ 'main', 'EditorWindow', 'height', type='int'))
++ self.cursor_blink.set(idleConf.GetOption(
++ 'main', 'EditorWindow', 'cursor-blink', type='bool'))
+ self.autocomplete_wait.set(idleConf.GetOption(
+ 'extensions', 'AutoComplete', 'popupwait', type='int'))
+ self.paren_style.set(idleConf.GetOption(
+diff --git a/Lib/idlelib/editor.py b/Lib/idlelib/editor.py
+index adeed74059..92dcf57c4f 100644
+--- a/Lib/idlelib/editor.py
++++ b/Lib/idlelib/editor.py
+@@ -186,8 +186,9 @@ class EditorWindow(object):
+ text.bind("<<uncomment-region>>", fregion.uncomment_region_event)
+ text.bind("<<tabify-region>>", fregion.tabify_region_event)
+ text.bind("<<untabify-region>>", fregion.untabify_region_event)
+- text.bind("<<toggle-tabs>>", self.Indents.toggle_tabs_event)
+- text.bind("<<change-indentwidth>>", self.Indents.change_indentwidth_event)
++ indents = self.Indents(self)
++ text.bind("<<toggle-tabs>>", indents.toggle_tabs_event)
++ text.bind("<<change-indentwidth>>", indents.change_indentwidth_event)
+ text.bind("<Left>", self.move_at_edge_if_selection(0))
+ text.bind("<Right>", self.move_at_edge_if_selection(1))
+ text.bind("<<del-word-left>>", self.del_word_left)
+@@ -241,6 +242,12 @@ class EditorWindow(object):
+ self.indentwidth = self.tabwidth
+ self.set_notabs_indentwidth()
+
++ # Store the current value of the insertofftime now so we can restore
++ # it if needed.
++ if not hasattr(idleConf, 'blink_off_time'):
++ idleConf.blink_off_time = self.text['insertofftime']
++ self.update_cursor_blink()
++
+ # When searching backwards for a reliable place to begin parsing,
+ # first start num_context_lines[0] lines back, then
+ # num_context_lines[1] lines back if that didn't work, and so on.
+@@ -803,6 +810,16 @@ class EditorWindow(object):
+ text.mark_set("insert", pos + "+1c")
+ text.see(pos)
+
++ def update_cursor_blink(self):
++ "Update the cursor blink configuration."
++ cursorblink = idleConf.GetOption(
++ 'main', 'EditorWindow', 'cursor-blink', type='bool')
++ if not cursorblink:
++ self.text['insertofftime'] = 0
++ else:
++ # Restore the original value
++ self.text['insertofftime'] = idleConf.blink_off_time
++
+ def ResetFont(self):
+ "Update the text widgets' font if it is changed"
+ # Called from configdialog.py
+diff --git a/Lib/idlelib/format.py b/Lib/idlelib/format.py
+index bced4c1770..2b09805657 100644
+--- a/Lib/idlelib/format.py
++++ b/Lib/idlelib/format.py
+@@ -353,8 +353,7 @@ class FormatRegion:
+ maxvalue=16)
+
+
+-# With mixed indents not allowed, these are semi-useless and not unittested.
+-class Indents: # pragma: no cover
++class Indents:
+ "Change future indents."
+
+ def __init__(self, editwin):
+diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py
+index 37e83439c4..1f14ed1f26 100644
+--- a/Lib/idlelib/idle_test/test_configdialog.py
++++ b/Lib/idlelib/idle_test/test_configdialog.py
+@@ -1135,6 +1135,10 @@ class GenPageTest(unittest.TestCase):
+ d.win_width_int.insert(0, '11')
+ self.assertEqual(mainpage, {'EditorWindow': {'width': '11'}})
+
++ def test_cursor_blink(self):
++ self.page.cursor_blink_bool.invoke()
++ self.assertEqual(mainpage, {'EditorWindow': {'cursor-blink': 'False'}})
++
+ def test_autocomplete_wait(self):
+ self.page.auto_wait_int.delete(0, 'end')
+ self.page.auto_wait_int.insert(0, '11')
+diff --git a/Lib/idlelib/idle_test/test_format.py b/Lib/idlelib/idle_test/test_format.py
+index c7b123e9d5..20b5970f49 100644
+--- a/Lib/idlelib/idle_test/test_format.py
++++ b/Lib/idlelib/idle_test/test_format.py
+@@ -417,7 +417,7 @@ class FormatRegionTest(unittest.TestCase):
+ self.text.delete('1.0', 'end')
+
+ code_sample = """\
+-
++# WS line needed for test.
+ class C1():
+ # Class comment.
+ def __init__(self, a, b):
+@@ -574,7 +574,42 @@ class C1():
+ self.assertEqual(ask(), 10)
+
+
+-class rstripTest(unittest.TestCase):
++class IndentsTest(unittest.TestCase):
++
++ @mock.patch.object(ft, "askyesno")
++ def test_toggle_tabs(self, askyesno):
++ editor = DummyEditwin(None, None) # usetabs == False.
++ indents = ft.Indents(editor)
++ askyesno.return_value = True
++
++ indents.toggle_tabs_event(None)
++ self.assertEqual(editor.usetabs, True)
++ self.assertEqual(editor.indentwidth, 8)
++
++ indents.toggle_tabs_event(None)
++ self.assertEqual(editor.usetabs, False)
++ self.assertEqual(editor.indentwidth, 8)
++
++ @mock.patch.object(ft, "askinteger")
++ def test_change_indentwidth(self, askinteger):
++ editor = DummyEditwin(None, None) # indentwidth == 4.
++ indents = ft.Indents(editor)
++
++ askinteger.return_value = None
++ indents.change_indentwidth_event(None)
++ self.assertEqual(editor.indentwidth, 4)
++
++ askinteger.return_value = 3
++ indents.change_indentwidth_event(None)
++ self.assertEqual(editor.indentwidth, 3)
++
++ askinteger.return_value = 5
++ editor.usetabs = True
++ indents.change_indentwidth_event(None)
++ self.assertEqual(editor.indentwidth, 3)
++
++
++class RstripTest(unittest.TestCase):
+
+ def test_rstrip_line(self):
+ editor = MockEditor()
+diff --git a/Lib/idlelib/idle_test/test_iomenu.py b/Lib/idlelib/idle_test/test_iomenu.py
+index 743a05b3c3..99f4048796 100644
+--- a/Lib/idlelib/idle_test/test_iomenu.py
++++ b/Lib/idlelib/idle_test/test_iomenu.py
+@@ -1,14 +1,13 @@
+-"Test , coverage 16%."
++"Test , coverage 17%."
+
+ from idlelib import iomenu
+ import unittest
+ from test.support import requires
+ from tkinter import Tk
+-
+ from idlelib.editor import EditorWindow
+
+
+-class IOBindigTest(unittest.TestCase):
++class IOBindingTest(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+@@ -16,9 +15,11 @@ class IOBindigTest(unittest.TestCase):
+ cls.root = Tk()
+ cls.root.withdraw()
+ cls.editwin = EditorWindow(root=cls.root)
++ cls.io = iomenu.IOBinding(cls.editwin)
+
+ @classmethod
+ def tearDownClass(cls):
++ cls.io.close()
+ cls.editwin._close()
+ del cls.editwin
+ cls.root.update_idletasks()
+@@ -28,9 +29,20 @@ class IOBindigTest(unittest.TestCase):
+ del cls.root
+
+ def test_init(self):
+- io = iomenu.IOBinding(self.editwin)
+- self.assertIs(io.editwin, self.editwin)
+- io.close
++ self.assertIs(self.io.editwin, self.editwin)
++
++ def test_fixnewlines_end(self):
++ eq = self.assertEqual
++ io = self.io
++ fix = io.fixnewlines
++ text = io.editwin.text
++ self.editwin.interp = None
++ eq(fix(), '')
++ del self.editwin.interp
++ text.insert(1.0, 'a')
++ eq(fix(), 'a'+io.eol_convention)
++ eq(text.get('1.0', 'end-1c'), 'a\n')
++ eq(fix(), 'a'+io.eol_convention)
+
+
+ if __name__ == '__main__':
+diff --git a/Lib/idlelib/iomenu.py b/Lib/idlelib/iomenu.py
+index b5533be79f..4b2833b8ca 100644
+--- a/Lib/idlelib/iomenu.py
++++ b/Lib/idlelib/iomenu.py
+@@ -371,10 +371,7 @@ class IOBinding:
+ return "break"
+
+ def writefile(self, filename):
+- self.fixlastline()
+- text = self.text.get("1.0", "end-1c")
+- if self.eol_convention != "\n":
+- text = text.replace("\n", self.eol_convention)
++ text = self.fixnewlines()
+ chars = self.encode(text)
+ try:
+ with open(filename, "wb") as f:
+@@ -387,6 +384,16 @@ class IOBinding:
+ parent=self.text)
+ return False
+
++ def fixnewlines(self):
++ "Return text with final \n if needed and os eols."
++ if (self.text.get("end-2c") != '\n'
++ and not hasattr(self.editwin, "interp")): # Not shell.
++ self.text.insert("end-1c", "\n")
++ text = self.text.get("1.0", "end-1c")
++ if self.eol_convention != "\n":
++ text = text.replace("\n", self.eol_convention)
++ return text
++
+ def encode(self, chars):
+ if isinstance(chars, bytes):
+ # This is either plain ASCII, or Tk was returning mixed-encoding
+@@ -426,11 +433,6 @@ class IOBinding:
+ # declared encoding
+ return BOM_UTF8 + chars.encode("utf-8")
+
+- def fixlastline(self):
+- c = self.text.get("end-2c")
+- if c != '\n':
+- self.text.insert("end-1c", "\n")
+-
+ def print_window(self, event):
+ confirm = tkMessageBox.askokcancel(
+ title="Print",
+diff --git a/Lib/idlelib/runscript.py b/Lib/idlelib/runscript.py
+index e99d0d2e02..a54108794a 100644
+--- a/Lib/idlelib/runscript.py
++++ b/Lib/idlelib/runscript.py
+@@ -19,6 +19,7 @@ from idlelib.config import idleConf
+ from idlelib import macosx
+ from idlelib import pyshell
+ from idlelib.query import CustomRun
++from idlelib import outwin
+
+ indent_message = """Error: Inconsistent indentation detected!
+
+@@ -46,6 +47,9 @@ class ScriptBinding:
+ self.editwin.text_frame.bind('<<run-module-event-2>>', self._run_module_event)
+
+ def check_module_event(self, event):
++ if isinstance(self.editwin, outwin.OutputWindow):
++ self.editwin.text.bell()
++ return 'break'
+ filename = self.getfilename()
+ if not filename:
+ return 'break'
+@@ -129,6 +133,9 @@ class ScriptBinding:
+ module being executed and also add that directory to its
+ sys.path if not already included.
+ """
++ if isinstance(self.editwin, outwin.OutputWindow):
++ self.editwin.text.bell()
++ return 'break'
+ filename = self.getfilename()
+ if not filename:
+ return 'break'
+diff --git a/Lib/inspect.py b/Lib/inspect.py
+index c2a1ed4148..3ff395ca33 100644
+--- a/Lib/inspect.py
++++ b/Lib/inspect.py
+@@ -2960,7 +2960,7 @@ class Signature:
+ arguments[param.name] = tuple(values)
+ break
+
+- if param.name in kwargs:
++ if param.name in kwargs and param.kind != _POSITIONAL_ONLY:
+ raise TypeError(
+ 'multiple values for argument {arg!r}'.format(
+ arg=param.name)) from None
+diff --git a/Lib/lib2to3/Grammar.txt b/Lib/lib2to3/Grammar.txt
+index a7ddad3cf3..68b73868b5 100644
+--- a/Lib/lib2to3/Grammar.txt
++++ b/Lib/lib2to3/Grammar.txt
+@@ -138,8 +138,8 @@ arglist: argument (',' argument)* [',']
+ # that precede iterable unpackings are blocked; etc.
+ argument: ( test [comp_for] |
+ test '=' test |
+- '**' expr |
+- star_expr )
++ '**' test |
++ '*' test )
+
+ comp_iter: comp_for | comp_if
+ comp_for: [ASYNC] 'for' exprlist 'in' testlist_safe [comp_iter]
+diff --git a/Lib/lib2to3/fixes/fix_apply.py b/Lib/lib2to3/fixes/fix_apply.py
+index 826ec8c9b6..6408582c42 100644
+--- a/Lib/lib2to3/fixes/fix_apply.py
++++ b/Lib/lib2to3/fixes/fix_apply.py
+@@ -37,10 +37,8 @@ class FixApply(fixer_base.BaseFix):
+ # I feel like we should be able to express this logic in the
+ # PATTERN above but I don't know how to do it so...
+ if args:
+- if args.type == self.syms.star_expr:
+- return # Make no change.
+ if (args.type == self.syms.argument and
+- args.children[0].value == '**'):
++ args.children[0].value in {'**', '*'}):
+ return # Make no change.
+ if kwds and (kwds.type == self.syms.argument and
+ kwds.children[0].value == '**'):
+diff --git a/Lib/lib2to3/fixes/fix_intern.py b/Lib/lib2to3/fixes/fix_intern.py
+index a852330908..d752843092 100644
+--- a/Lib/lib2to3/fixes/fix_intern.py
++++ b/Lib/lib2to3/fixes/fix_intern.py
+@@ -30,10 +30,8 @@ class FixIntern(fixer_base.BaseFix):
+ # PATTERN above but I don't know how to do it so...
+ obj = results['obj']
+ if obj:
+- if obj.type == self.syms.star_expr:
+- return # Make no change.
+ if (obj.type == self.syms.argument and
+- obj.children[0].value == '**'):
++ obj.children[0].value in {'**', '*'}):
+ return # Make no change.
+ names = ('sys', 'intern')
+ new = ImportAndCall(node, results, names)
+diff --git a/Lib/lib2to3/fixes/fix_reload.py b/Lib/lib2to3/fixes/fix_reload.py
+index 6c7fbbd3be..b30841131c 100644
+--- a/Lib/lib2to3/fixes/fix_reload.py
++++ b/Lib/lib2to3/fixes/fix_reload.py
+@@ -27,10 +27,8 @@ class FixReload(fixer_base.BaseFix):
+ # PATTERN above but I don't know how to do it so...
+ obj = results['obj']
+ if obj:
+- if obj.type == self.syms.star_expr:
+- return # Make no change.
+ if (obj.type == self.syms.argument and
+- obj.children[0].value == '**'):
++ obj.children[0].value in {'**', '*'}):
+ return # Make no change.
+ names = ('importlib', 'reload')
+ new = ImportAndCall(node, results, names)
+diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py
+index 01b2b51e4a..868ada71cd 100644
+--- a/Lib/lib2to3/tests/test_parser.py
++++ b/Lib/lib2to3/tests/test_parser.py
+@@ -253,6 +253,13 @@ class TestUnpackingGeneralizations(GrammarTest):
+ def test_double_star_dict_literal_after_keywords(self):
+ self.validate("""func(spam='fried', **{'eggs':'scrambled'})""")
+
++ def test_double_star_expression(self):
++ self.validate("""func(**{'a':2} or {})""")
++ self.validate("""func(**() or {})""")
++
++ def test_star_expression(self):
++ self.validate("""func(*[] or [2])""")
++
+ def test_list_display(self):
+ self.validate("""[*{2}, 3, *[4]]""")
+
+diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py
+index c62c826cff..be13c079bb 100644
+--- a/Lib/multiprocessing/process.py
++++ b/Lib/multiprocessing/process.py
+@@ -301,6 +301,8 @@ class BaseProcess(object):
+ _current_process = self
+ _parent_process = _ParentProcess(
+ self._parent_name, self._parent_pid, parent_sentinel)
++ if threading._HAVE_THREAD_NATIVE_ID:
++ threading.main_thread()._set_native_id()
+ try:
+ util._finalizer_registry.clear()
+ util._run_after_forkers()
+diff --git a/Lib/ntpath.py b/Lib/ntpath.py
+index d4ecff97c9..6f771773a7 100644
+--- a/Lib/ntpath.py
++++ b/Lib/ntpath.py
+@@ -61,6 +61,14 @@ def normcase(s):
+ def isabs(s):
+ """Test whether a path is absolute"""
+ s = os.fspath(s)
++ # Paths beginning with \\?\ are always absolute, but do not
++ # necessarily contain a drive.
++ if isinstance(s, bytes):
++ if s.replace(b'/', b'\\').startswith(b'\\\\?\\'):
++ return True
++ else:
++ if s.replace('/', '\\').startswith('\\\\?\\'):
++ return True
+ s = splitdrive(s)[1]
+ return len(s) > 0 and s[0] in _get_bothseps(s)
+
+@@ -526,10 +534,7 @@ except ImportError:
+ # realpath is a no-op on systems without _getfinalpathname support.
+ realpath = abspath
+ else:
+- def _readlink_deep(path, seen=None):
+- if seen is None:
+- seen = set()
+-
++ def _readlink_deep(path):
+ # These error codes indicate that we should stop reading links and
+ # return the path we currently have.
+ # 1: ERROR_INVALID_FUNCTION
+@@ -546,10 +551,22 @@ else:
+ # 4393: ERROR_REPARSE_TAG_INVALID
+ allowed_winerror = 1, 2, 3, 5, 21, 32, 50, 67, 87, 4390, 4392, 4393
+
++ seen = set()
+ while normcase(path) not in seen:
+ seen.add(normcase(path))
+ try:
++ old_path = path
+ path = _nt_readlink(path)
++ # Links may be relative, so resolve them against their
++ # own location
++ if not isabs(path):
++ # If it's something other than a symlink, we don't know
++ # what it's actually going to be resolved against, so
++ # just return the old path.
++ if not islink(old_path):
++ path = old_path
++ break
++ path = normpath(join(dirname(old_path), path))
+ except OSError as ex:
+ if ex.winerror in allowed_winerror:
+ break
+@@ -579,23 +596,31 @@ else:
+ # Non-strict algorithm is to find as much of the target directory
+ # as we can and join the rest.
+ tail = ''
+- seen = set()
+ while path:
+ try:
+- path = _readlink_deep(path, seen)
+ path = _getfinalpathname(path)
+ return join(path, tail) if tail else path
+ except OSError as ex:
+ if ex.winerror not in allowed_winerror:
+ raise
++ try:
++ # The OS could not resolve this path fully, so we attempt
++ # to follow the link ourselves. If we succeed, join the tail
++ # and return.
++ new_path = _readlink_deep(path)
++ if new_path != path:
++ return join(new_path, tail) if tail else new_path
++ except OSError:
++ # If we fail to readlink(), let's keep traversing
++ pass
+ path, name = split(path)
+ # TODO (bpo-38186): Request the real file name from the directory
+ # entry using FindFirstFileW. For now, we will return the path
+ # as best we have it
+ if path and not name:
+- return abspath(path + tail)
++ return path + tail
+ tail = join(name, tail) if tail else name
+- return abspath(tail)
++ return tail
+
+ def realpath(path):
+ path = normpath(path)
+@@ -604,12 +629,20 @@ else:
+ unc_prefix = b'\\\\?\\UNC\\'
+ new_unc_prefix = b'\\\\'
+ cwd = os.getcwdb()
++ # bpo-38081: Special case for realpath(b'nul')
++ if normcase(path) == normcase(os.fsencode(devnull)):
++ return b'\\\\.\\NUL'
+ else:
+ prefix = '\\\\?\\'
+ unc_prefix = '\\\\?\\UNC\\'
+ new_unc_prefix = '\\\\'
+ cwd = os.getcwd()
++ # bpo-38081: Special case for realpath('nul')
++ if normcase(path) == normcase(devnull):
++ return '\\\\.\\NUL'
+ had_prefix = path.startswith(prefix)
++ if not had_prefix and not isabs(path):
++ path = join(cwd, path)
+ try:
+ path = _getfinalpathname(path)
+ initial_winerror = 0
+diff --git a/Lib/pathlib.py b/Lib/pathlib.py
+index 91ce4a1257..c42bde459b 100644
+--- a/Lib/pathlib.py
++++ b/Lib/pathlib.py
+@@ -187,6 +187,9 @@ class _WindowsFlavour(_Flavour):
+ def casefold_parts(self, parts):
+ return [p.lower() for p in parts]
+
++ def compile_pattern(self, pattern):
++ return re.compile(fnmatch.translate(pattern), re.IGNORECASE).fullmatch
++
+ def resolve(self, path, strict=False):
+ s = str(path)
+ if not s:
+@@ -309,6 +312,9 @@ class _PosixFlavour(_Flavour):
+ def casefold_parts(self, parts):
+ return parts
+
++ def compile_pattern(self, pattern):
++ return re.compile(fnmatch.translate(pattern)).fullmatch
++
+ def resolve(self, path, strict=False):
+ sep = self.sep
+ accessor = path._accessor
+@@ -446,7 +452,7 @@ _normal_accessor = _NormalAccessor()
+ # Globbing helpers
+ #
+
+-def _make_selector(pattern_parts):
++def _make_selector(pattern_parts, flavour):
+ pat = pattern_parts[0]
+ child_parts = pattern_parts[1:]
+ if pat == '**':
+@@ -457,7 +463,7 @@ def _make_selector(pattern_parts):
+ cls = _WildcardSelector
+ else:
+ cls = _PreciseSelector
+- return cls(pat, child_parts)
++ return cls(pat, child_parts, flavour)
+
+ if hasattr(functools, "lru_cache"):
+ _make_selector = functools.lru_cache()(_make_selector)
+@@ -467,10 +473,10 @@ class _Selector:
+ """A selector matches a specific glob pattern part against the children
+ of a given path."""
+
+- def __init__(self, child_parts):
++ def __init__(self, child_parts, flavour):
+ self.child_parts = child_parts
+ if child_parts:
+- self.successor = _make_selector(child_parts)
++ self.successor = _make_selector(child_parts, flavour)
+ self.dironly = True
+ else:
+ self.successor = _TerminatingSelector()
+@@ -496,9 +502,9 @@ class _TerminatingSelector:
+
+ class _PreciseSelector(_Selector):
+
+- def __init__(self, name, child_parts):
++ def __init__(self, name, child_parts, flavour):
+ self.name = name
+- _Selector.__init__(self, child_parts)
++ _Selector.__init__(self, child_parts, flavour)
+
+ def _select_from(self, parent_path, is_dir, exists, scandir):
+ try:
+@@ -512,13 +518,12 @@ class _PreciseSelector(_Selector):
+
+ class _WildcardSelector(_Selector):
+
+- def __init__(self, pat, child_parts):
+- self.pat = re.compile(fnmatch.translate(pat))
+- _Selector.__init__(self, child_parts)
++ def __init__(self, pat, child_parts, flavour):
++ self.match = flavour.compile_pattern(pat)
++ _Selector.__init__(self, child_parts, flavour)
+
+ def _select_from(self, parent_path, is_dir, exists, scandir):
+ try:
+- cf = parent_path._flavour.casefold
+ entries = list(scandir(parent_path))
+ for entry in entries:
+ entry_is_dir = False
+@@ -529,8 +534,7 @@ class _WildcardSelector(_Selector):
+ raise
+ if not self.dironly or entry_is_dir:
+ name = entry.name
+- casefolded = cf(name)
+- if self.pat.match(casefolded):
++ if self.match(name):
+ path = parent_path._make_child_relpath(name)
+ for p in self.successor._select_from(path, is_dir, exists, scandir):
+ yield p
+@@ -541,8 +545,8 @@ class _WildcardSelector(_Selector):
+
+ class _RecursiveWildcardSelector(_Selector):
+
+- def __init__(self, pat, child_parts):
+- _Selector.__init__(self, child_parts)
++ def __init__(self, pat, child_parts, flavour):
++ _Selector.__init__(self, child_parts, flavour)
+
+ def _iterate_directories(self, parent_path, is_dir, scandir):
+ yield parent_path
+@@ -795,7 +799,11 @@ class PurePath(object):
+
+ @property
+ def suffix(self):
+- """The final component's last suffix, if any."""
++ """
++ The final component's last suffix, if any.
++
++ This includes the leading period. For example: '.txt'
++ """
+ name = self.name
+ i = name.rfind('.')
+ if 0 < i < len(name) - 1:
+@@ -805,7 +813,11 @@ class PurePath(object):
+
+ @property
+ def suffixes(self):
+- """A list of the final component's suffixes, if any."""
++ """
++ A list of the final component's suffixes, if any.
++
++ These include the leading periods. For example: ['.tar', '.gz']
++ """
+ name = self.name
+ if name.endswith('.'):
+ return []
+@@ -1109,11 +1121,10 @@ class Path(PurePath):
+ """
+ if not pattern:
+ raise ValueError("Unacceptable pattern: {!r}".format(pattern))
+- pattern = self._flavour.casefold(pattern)
+ drv, root, pattern_parts = self._flavour.parse_parts((pattern,))
+ if drv or root:
+ raise NotImplementedError("Non-relative patterns are unsupported")
+- selector = _make_selector(tuple(pattern_parts))
++ selector = _make_selector(tuple(pattern_parts), self._flavour)
+ for p in selector.select_from(self):
+ yield p
+
+@@ -1122,11 +1133,10 @@ class Path(PurePath):
+ directories) matching the given relative pattern, anywhere in
+ this subtree.
+ """
+- pattern = self._flavour.casefold(pattern)
+ drv, root, pattern_parts = self._flavour.parse_parts((pattern,))
+ if drv or root:
+ raise NotImplementedError("Non-relative patterns are unsupported")
+- selector = _make_selector(("**",) + tuple(pattern_parts))
++ selector = _make_selector(("**",) + tuple(pattern_parts), self._flavour)
+ for p in selector.select_from(self):
+ yield p
+
+diff --git a/Lib/pdb.py b/Lib/pdb.py
+index 8639204891..bf503f1e73 100755
+--- a/Lib/pdb.py
++++ b/Lib/pdb.py
+@@ -68,6 +68,7 @@ Debugger commands
+ # commands and is appended to __doc__ after the class has been defined.
+
+ import os
++import io
+ import re
+ import sys
+ import cmd
+@@ -1565,7 +1566,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
+ self._wait_for_mainpyfile = True
+ self.mainpyfile = self.canonic(filename)
+ self._user_requested_quit = False
+- with open(filename, "rb") as fp:
++ with io.open_code(filename) as fp:
+ statement = "exec(compile(%r, %r, 'exec'))" % \
+ (fp.read(), self.mainpyfile)
+ self.run(statement)
+diff --git a/Lib/runpy.py b/Lib/runpy.py
+index d86f0e4a3c..8adc91e32f 100644
+--- a/Lib/runpy.py
++++ b/Lib/runpy.py
+@@ -13,6 +13,7 @@ importers when locating support scripts as well as when importing modules.
+ import sys
+ import importlib.machinery # importlib first so we can test #15386 via -m
+ import importlib.util
++import io
+ import types
+ from pkgutil import read_code, get_importer
+
+@@ -228,11 +229,11 @@ def _get_main_module_details(error=ImportError):
+
+ def _get_code_from_file(run_name, fname):
+ # Check for a compiled file first
+- with open(fname, "rb") as f:
++ with io.open_code(fname) as f:
+ code = read_code(f)
+ if code is None:
+ # That didn't work, so try it as normal source code
+- with open(fname, "rb") as f:
++ with io.open_code(fname) as f:
+ code = compile(f.read(), fname, 'exec')
+ return code, fname
+
+diff --git a/Lib/shlex.py b/Lib/shlex.py
+index ae0f5ddec1..c817274583 100644
+--- a/Lib/shlex.py
++++ b/Lib/shlex.py
+@@ -303,6 +303,7 @@ class shlex:
+ return token
+
+ def split(s, comments=False, posix=True):
++ """Split the string *s* using shell-like syntax."""
+ lex = shlex(s, posix=posix)
+ lex.whitespace_split = True
+ if not comments:
+diff --git a/Lib/socketserver.py b/Lib/socketserver.py
+index 905df9319e..1ad028fa4d 100644
+--- a/Lib/socketserver.py
++++ b/Lib/socketserver.py
+@@ -24,7 +24,7 @@ For request-based servers (including socket-based):
+
+ The classes in this module favor the server type that is simplest to
+ write: a synchronous TCP/IP server. This is bad class design, but
+-save some typing. (There's also the issue that a deep class hierarchy
++saves some typing. (There's also the issue that a deep class hierarchy
+ slows down method lookups.)
+
+ There are five classes in an inheritance diagram, four of which represent
+diff --git a/Lib/statistics.py b/Lib/statistics.py
+index 0d747b3d6c..1e95c0b663 100644
+--- a/Lib/statistics.py
++++ b/Lib/statistics.py
+@@ -744,7 +744,7 @@ def variance(data, xbar=None):
+ def pvariance(data, mu=None):
+ """Return the population variance of ``data``.
+
+- data should be a sequence or iterator of Real-valued numbers, with at least one
++ data should be a sequence or iterable of Real-valued numbers, with at least one
+ value. The optional argument mu, if given, should be the mean of
+ the data. If it is missing or None, the mean is automatically calculated.
+
+@@ -1092,7 +1092,7 @@ class NormalDist:
+ "Two NormalDist objects are equal if their mu and sigma are both equal."
+ if not isinstance(x2, NormalDist):
+ return NotImplemented
+- return (x1._mu, x2._sigma) == (x2._mu, x2._sigma)
++ return x1._mu == x2._mu and x1._sigma == x2._sigma
+
+ def __hash__(self):
+ "NormalDist objects hash equal if their mu and sigma are both equal."
+diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
+index 1474624ac5..b7f3d253c4 100644
+--- a/Lib/test/_test_multiprocessing.py
++++ b/Lib/test/_test_multiprocessing.py
+@@ -367,6 +367,28 @@ class _TestProcess(BaseTestCase):
+ self.assertNotIn(p, self.active_children())
+ close_queue(q)
+
++ @unittest.skipUnless(threading._HAVE_THREAD_NATIVE_ID, "needs native_id")
++ def test_process_mainthread_native_id(self):
++ if self.TYPE == 'threads':
++ self.skipTest('test not appropriate for {}'.format(self.TYPE))
++
++ current_mainthread_native_id = threading.main_thread().native_id
++
++ q = self.Queue(1)
++ p = self.Process(target=self._test_process_mainthread_native_id, args=(q,))
++ p.start()
++
++ child_mainthread_native_id = q.get()
++ p.join()
++ close_queue(q)
++
++ self.assertNotEqual(current_mainthread_native_id, child_mainthread_native_id)
++
++ @classmethod
++ def _test_process_mainthread_native_id(cls, q):
++ mainthread_native_id = threading.main_thread().native_id
++ q.put(mainthread_native_id)
++
+ @classmethod
+ def _sleep_some(cls):
+ time.sleep(100)
+diff --git a/Lib/test/ann_module.py b/Lib/test/ann_module.py
+index 9e6b87dac4..0567d6de1b 100644
+--- a/Lib/test/ann_module.py
++++ b/Lib/test/ann_module.py
+@@ -6,6 +6,7 @@ Empty lines above are for good reason (testing for correct line numbers)
+ """
+
+ from typing import Optional
++from functools import wraps
+
+ __annotations__[1] = 2
+
+@@ -51,3 +52,9 @@ def foo(x: int = 10):
+ def bar(y: List[str]):
+ x: str = 'yes'
+ bar()
++
++def dec(func):
++ @wraps(func)
++ def wrapper(*args, **kwargs):
++ return func(*args, **kwargs)
++ return wrapper
+diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
+index 2ff7640535..d6a7819cb0 100644
+--- a/Lib/test/support/__init__.py
++++ b/Lib/test/support/__init__.py
+@@ -1066,7 +1066,7 @@ def change_cwd(path, quiet=False):
+ """
+ saved_dir = os.getcwd()
+ try:
+- os.chdir(path)
++ os.chdir(os.path.realpath(path))
+ except OSError as exc:
+ if not quiet:
+ raise
+diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
+index 30460e7226..266075094b 100644
+--- a/Lib/test/test_ast.py
++++ b/Lib/test/test_ast.py
+@@ -129,11 +129,11 @@ exec_tests = [
+ # Asynchronous comprehensions
+ "async def f():\n [i async for b in c]",
+ # Decorated FunctionDef
+- "@deco1\n@deco2()\ndef f(): pass",
++ "@deco1\n@deco2()\n@deco3(1)\ndef f(): pass",
+ # Decorated AsyncFunctionDef
+- "@deco1\n@deco2()\nasync def f(): pass",
++ "@deco1\n@deco2()\n@deco3(1)\nasync def f(): pass",
+ # Decorated ClassDef
+- "@deco1\n@deco2()\nclass C: pass",
++ "@deco1\n@deco2()\n@deco3(1)\nclass C: pass",
+ # Decorator with generator argument
+ "@deco(a for a in b)\ndef f(): pass",
+ # Simple assignment expression
+@@ -1808,9 +1808,9 @@ exec_results = [
+ ('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2, None)], [('Dict', (1, 3), [('Constant', (1, 4), 1, None)], [('Constant', (1, 6), 2, None)]), ('Constant', (1, 12), 3, None)]))], []),
+ ('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1, None), ('Constant', (1, 6), 2, None)]), ('Load',)), ('Constant', (1, 10), 3, None)]))], []),
+ ('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 1), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None, None)], []),
+-('Module', [('FunctionDef', (3, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []),
+-('Module', [('AsyncFunctionDef', (3, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (3, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []),
+-('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])], []),
++('Module', [('FunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []),
++('Module', [('AsyncFunctionDef', (4, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (4, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])], None, None)], []),
++('Module', [('ClassDef', (4, 0), 'C', [], [], [('Pass', (4, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 1), ('Name', (2, 1), 'deco2', ('Load',)), [], []), ('Call', (3, 1), ('Name', (3, 1), 'deco3', ('Load',)), [('Constant', (3, 7), 1, None)], [])])], []),
+ ('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None, None)], []),
+ ('Module', [('Expr', (1, 0), ('NamedExpr', (1, 1), ('Name', (1, 1), 'a', ('Store',)), ('Constant', (1, 6), 1, None)))], []),
+ ('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], [], None, [], [], None, []), [('Pass', (1, 14))], [], None, None)], []),
+diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py
+index 23eb6a411c..58d8aee19a 100644
+--- a/Lib/test/test_asyncgen.py
++++ b/Lib/test/test_asyncgen.py
+@@ -735,6 +735,33 @@ class AsyncGenAsyncioTest(unittest.TestCase):
+ self.loop.run_until_complete(run())
+ self.assertEqual(DONE, 10)
+
++ def test_async_gen_asyncio_aclose_12(self):
++ DONE = 0
++
++ async def target():
++ await asyncio.sleep(0.01)
++ 1 / 0
++
++ async def foo():
++ nonlocal DONE
++ task = asyncio.create_task(target())
++ try:
++ yield 1
++ finally:
++ try:
++ await task
++ except ZeroDivisionError:
++ DONE = 1
++
++ async def run():
++ gen = foo()
++ it = gen.__aiter__()
++ await it.__anext__()
++ await gen.aclose()
++
++ self.loop.run_until_complete(run())
++ self.assertEqual(DONE, 1)
++
+ def test_async_gen_asyncio_asend_01(self):
+ DONE = 0
+
+diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
+index ccdd3bae73..92fdaf17e2 100644
+--- a/Lib/test/test_asyncio/test_base_events.py
++++ b/Lib/test/test_asyncio/test_base_events.py
+@@ -1694,7 +1694,7 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase):
+ self.loop.run_until_complete(protocol.done)
+ self.assertEqual('CLOSED', protocol.state)
+
+- @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets')
++ @support.skip_unless_bind_unix_socket
+ def test_create_datagram_endpoint_existing_sock_unix(self):
+ with test_utils.unix_socket_path() as path:
+ sock = socket.socket(socket.AF_UNIX, type=socket.SOCK_DGRAM)
+diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py
+index 2e4583d124..ee5edd5bd3 100644
+--- a/Lib/test/test_asyncio/test_futures.py
++++ b/Lib/test/test_asyncio/test_futures.py
+@@ -822,5 +822,44 @@ class PyFutureDoneCallbackTests(BaseFutureDoneCallbackTests,
+ return futures._PyFuture(loop=self.loop)
+
+
++class BaseFutureInheritanceTests:
++
++ def _get_future_cls(self):
++ raise NotImplementedError
++
++ def setUp(self):
++ super().setUp()
++ self.loop = self.new_test_loop()
++ self.addCleanup(self.loop.close)
++
++ def test_inherit_without_calling_super_init(self):
++ # See https://bugs.python.org/issue38785 for the context
++ cls = self._get_future_cls()
++
++ class MyFut(cls):
++ def __init__(self, *args, **kwargs):
++ # don't call super().__init__()
++ pass
++
++ fut = MyFut(loop=self.loop)
++ with self.assertRaisesRegex(
++ RuntimeError,
++ "Future object is not initialized."
++ ):
++ fut.get_loop()
++
++
++class PyFutureInheritanceTests(BaseFutureInheritanceTests,
++ test_utils.TestCase):
++ def _get_future_cls(self):
++ return futures._PyFuture
++
++
++class CFutureInheritanceTests(BaseFutureInheritanceTests,
++ test_utils.TestCase):
++ def _get_future_cls(self):
++ return futures._CFuture
++
++
+ if __name__ == '__main__':
+ unittest.main()
+diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py
+index c115e46e70..a7c089018a 100644
+--- a/Lib/test/test_asyncio/test_sslproto.py
++++ b/Lib/test/test_asyncio/test_sslproto.py
+@@ -497,14 +497,6 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin):
+
+ server_context = test_utils.simple_server_sslcontext()
+ client_context = test_utils.simple_client_sslcontext()
+- if (sys.platform.startswith('freebsd')
+- or sys.platform.startswith('win')
+- or sys.platform.startswith('darwin')):
+- # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test
+- # as the eof was not being received by the server if the payload
+- # size is not big enough. This behaviour only appears if the
+- # client is using TLS1.3. Also seen on macOS.
+- client_context.options |= ssl.OP_NO_TLSv1_3
+ answer = None
+
+ def client(sock, addr):
+@@ -521,9 +513,10 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin):
+ sock.close()
+
+ class ServerProto(asyncio.Protocol):
+- def __init__(self, on_con, on_con_lost):
++ def __init__(self, on_con, on_con_lost, on_got_hello):
+ self.on_con = on_con
+ self.on_con_lost = on_con_lost
++ self.on_got_hello = on_got_hello
+ self.data = b''
+ self.transport = None
+
+@@ -537,7 +530,7 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin):
+ def data_received(self, data):
+ self.data += data
+ if len(self.data) >= len(HELLO_MSG):
+- self.transport.write(ANSWER)
++ self.on_got_hello.set_result(None)
+
+ def connection_lost(self, exc):
+ self.transport = None
+@@ -546,7 +539,7 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin):
+ else:
+ self.on_con_lost.set_exception(exc)
+
+- async def main(proto, on_con, on_con_lost):
++ async def main(proto, on_con, on_con_lost, on_got_hello):
+ tr = await on_con
+ tr.write(HELLO_MSG)
+
+@@ -556,9 +549,11 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin):
+ tr, proto, server_context,
+ server_side=True,
+ ssl_handshake_timeout=self.TIMEOUT)
+-
+ proto.replace_transport(new_tr)
+
++ await on_got_hello
++ new_tr.write(ANSWER)
++
+ await on_con_lost
+ self.assertEqual(proto.data, HELLO_MSG)
+ new_tr.close()
+@@ -566,7 +561,8 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin):
+ async def run_main():
+ on_con = self.loop.create_future()
+ on_con_lost = self.loop.create_future()
+- proto = ServerProto(on_con, on_con_lost)
++ on_got_hello = self.loop.create_future()
++ proto = ServerProto(on_con, on_con_lost, on_got_hello)
+
+ server = await self.loop.create_server(
+ lambda: proto, '127.0.0.1', 0)
+@@ -575,7 +571,7 @@ class BaseStartTLS(func_tests.FunctionalTestCaseMixin):
+ with self.tcp_client(lambda sock: client(sock, addr),
+ timeout=self.TIMEOUT):
+ await asyncio.wait_for(
+- main(proto, on_con, on_con_lost),
++ main(proto, on_con, on_con_lost, on_got_hello),
+ timeout=self.TIMEOUT)
+
+ server.close()
+diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py
+index 9ed10fc20f..6b005702c9 100644
+--- a/Lib/test/test_asyncio/test_windows_events.py
++++ b/Lib/test/test_asyncio/test_windows_events.py
+@@ -69,6 +69,8 @@ class ProactorMultithreading(test_utils.TestCase):
+ nonlocal finished
+ loop = asyncio.new_event_loop()
+ loop.run_until_complete(coro())
++ # close() must not call signal.set_wakeup_fd()
++ loop.close()
+ finished = True
+
+ thread = threading.Thread(target=func)
+diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
+index ff7acac43b..2761ab3f20 100644
+--- a/Lib/test/test_capi.py
++++ b/Lib/test/test_capi.py
+@@ -350,9 +350,11 @@ class CAPITest(unittest.TestCase):
+ for i in range(1000):
+ L = MyList((L,))
+
++ @support.requires_resource('cpu')
+ def test_trashcan_python_class1(self):
+ self.do_test_trashcan_python_class(list)
+
++ @support.requires_resource('cpu')
+ def test_trashcan_python_class2(self):
+ from _testcapi import MyList
+ self.do_test_trashcan_python_class(MyList)
+@@ -692,6 +694,9 @@ class PyMemDebugTests(unittest.TestCase):
+ ''')
+ assert_python_ok('-c', code, PYTHONMALLOC=self.PYTHONMALLOC)
+
++ def test_pyobject_null_is_freed(self):
++ self.check_pyobject_is_freed('check_pyobject_null_is_freed')
++
+ def test_pyobject_uninitialized_is_freed(self):
+ self.check_pyobject_is_freed('check_pyobject_uninitialized_is_freed')
+
+diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
+index 9d77f7af05..566ca27fca 100644
+--- a/Lib/test/test_compile.py
++++ b/Lib/test/test_compile.py
+@@ -731,6 +731,24 @@ if 1:
+ self.assertEqual(None, opcodes[0].argval)
+ self.assertEqual('RETURN_VALUE', opcodes[1].opname)
+
++ def test_false_while_loop(self):
++ def break_in_while():
++ while False:
++ break
++
++ def continue_in_while():
++ while False:
++ continue
++
++ funcs = [break_in_while, continue_in_while]
++
++ # Check that we did not raise but we also don't generate bytecode
++ for func in funcs:
++ opcodes = list(dis.get_instructions(func))
++ self.assertEqual(2, len(opcodes))
++ self.assertEqual('LOAD_CONST', opcodes[0].opname)
++ self.assertEqual(None, opcodes[0].argval)
++ self.assertEqual('RETURN_VALUE', opcodes[1].opname)
+
+ class TestExpressionStackSize(unittest.TestCase):
+ # These tests check that the computed stack size for a code object
+diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py
+index 13be857f7a..5b513765f7 100644
+--- a/Lib/test/test_dict.py
++++ b/Lib/test/test_dict.py
+@@ -1312,6 +1312,31 @@ class DictTest(unittest.TestCase):
+ self.assertEqual(list(r), list('dcba'))
+ self.assertRaises(StopIteration, next, r)
+
++ def test_reverse_iterator_for_empty_dict(self):
++ # bpo-38525: revered iterator should work properly
++
++ # empty dict is directly used for reference count test
++ self.assertEqual(list(reversed({})), [])
++ self.assertEqual(list(reversed({}.items())), [])
++ self.assertEqual(list(reversed({}.values())), [])
++ self.assertEqual(list(reversed({}.keys())), [])
++
++ # dict() and {} don't trigger the same code path
++ self.assertEqual(list(reversed(dict())), [])
++ self.assertEqual(list(reversed(dict().items())), [])
++ self.assertEqual(list(reversed(dict().values())), [])
++ self.assertEqual(list(reversed(dict().keys())), [])
++
++ def test_reverse_iterator_for_shared_shared_dicts(self):
++ class A:
++ def __init__(self, x, y):
++ if x: self.x = x
++ if y: self.y = y
++
++ self.assertEqual(list(reversed(A(1, 2).__dict__)), ['y', 'x'])
++ self.assertEqual(list(reversed(A(1, 0).__dict__)), ['x'])
++ self.assertEqual(list(reversed(A(0, 1).__dict__)), ['y'])
++
+ def test_dict_copy_order(self):
+ # bpo-34320
+ od = collections.OrderedDict([('a', 1), ('b', 2)])
+diff --git a/Lib/test/test_fcntl.py b/Lib/test/test_fcntl.py
+index 5d4abe388f..c394f6945a 100644
+--- a/Lib/test/test_fcntl.py
++++ b/Lib/test/test_fcntl.py
+@@ -5,6 +5,7 @@ import os
+ import struct
+ import sys
+ import unittest
++from multiprocessing import Process
+ from test.support import (verbose, TESTFN, unlink, run_unittest, import_module,
+ cpython_only)
+
+@@ -12,7 +13,6 @@ from test.support import (verbose, TESTFN, unlink, run_unittest, import_module,
+ fcntl = import_module('fcntl')
+
+
+-# TODO - Write tests for flock() and lockf().
+
+ def get_lockdata():
+ try:
+@@ -51,6 +51,21 @@ class BadFile:
+ def fileno(self):
+ return self.fn
+
++def try_lockf_on_other_process_fail(fname, cmd):
++ f = open(fname, 'wb+')
++ try:
++ fcntl.lockf(f, cmd)
++ except BlockingIOError:
++ pass
++ finally:
++ f.close()
++
++def try_lockf_on_other_process(fname, cmd):
++ f = open(fname, 'wb+')
++ fcntl.lockf(f, cmd)
++ fcntl.lockf(f, fcntl.LOCK_UN)
++ f.close()
++
+ class TestFcntl(unittest.TestCase):
+
+ def setUp(self):
+@@ -138,6 +153,28 @@ class TestFcntl(unittest.TestCase):
+ self.assertRaises(ValueError, fcntl.flock, -1, fcntl.LOCK_SH)
+ self.assertRaises(TypeError, fcntl.flock, 'spam', fcntl.LOCK_SH)
+
++ @unittest.skipIf(platform.system() == "AIX", "AIX returns PermissionError")
++ def test_lockf_exclusive(self):
++ self.f = open(TESTFN, 'wb+')
++ cmd = fcntl.LOCK_EX | fcntl.LOCK_NB
++ fcntl.lockf(self.f, cmd)
++ p = Process(target=try_lockf_on_other_process_fail, args=(TESTFN, cmd))
++ p.start()
++ p.join()
++ fcntl.lockf(self.f, fcntl.LOCK_UN)
++ self.assertEqual(p.exitcode, 0)
++
++ @unittest.skipIf(platform.system() == "AIX", "AIX returns PermissionError")
++ def test_lockf_share(self):
++ self.f = open(TESTFN, 'wb+')
++ cmd = fcntl.LOCK_SH | fcntl.LOCK_NB
++ fcntl.lockf(self.f, cmd)
++ p = Process(target=try_lockf_on_other_process, args=(TESTFN, cmd))
++ p.start()
++ p.join()
++ fcntl.lockf(self.f, fcntl.LOCK_UN)
++ self.assertEqual(p.exitcode, 0)
++
+ @cpython_only
+ def test_flock_overflow(self):
+ import _testcapi
+diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
+index 6c29e96c30..f52db1eab1 100644
+--- a/Lib/test/test_gc.py
++++ b/Lib/test/test_gc.py
+@@ -1055,16 +1055,19 @@ class GCCallbackTests(unittest.TestCase):
+ br'gcmodule\.c:[0-9]+: gc_decref: Assertion "gc_get_refs\(g\) > 0" failed.')
+ self.assertRegex(stderr,
+ br'refcount is too small')
++ # "address : 0x7fb5062efc18"
++ # "address : 7FB5062EFC18"
++ address_regex = br'[0-9a-fA-Fx]+'
+ self.assertRegex(stderr,
+- br'object : \[1, 2, 3\]')
++ br'object address : ' + address_regex)
+ self.assertRegex(stderr,
+- br'type : list')
++ br'object refcount : 1')
+ self.assertRegex(stderr,
+- br'refcount: 1')
+- # "address : 0x7fb5062efc18"
+- # "address : 7FB5062EFC18"
++ br'object type : ' + address_regex)
++ self.assertRegex(stderr,
++ br'object type name: list')
+ self.assertRegex(stderr,
+- br'address : [0-9a-fA-Fx]+')
++ br'object repr : \[1, 2, 3\]')
+
+
+ class GCTogglingTests(unittest.TestCase):
+diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py
+index 1bbf201727..ea00367c80 100644
+--- a/Lib/test/test_hmac.py
++++ b/Lib/test/test_hmac.py
+@@ -312,10 +312,15 @@ class TestVectorsTestCase(unittest.TestCase):
+ self.fail('Expected warning about small block_size')
+
+ def test_with_digestmod_no_default(self):
+- with self.assertRaises(ValueError):
++ """The digestmod parameter is required as of Python 3.8."""
++ with self.assertRaisesRegex(TypeError, r'required.*digestmod'):
+ key = b"\x0b" * 16
+ data = b"Hi There"
+ hmac.HMAC(key, data, digestmod=None)
++ with self.assertRaisesRegex(TypeError, r'required.*digestmod'):
++ hmac.new(key, data)
++ with self.assertRaisesRegex(TypeError, r'required.*digestmod'):
++ hmac.HMAC(key, msg=data, digestmod='')
+
+
+ class ConstructorTestCase(unittest.TestCase):
+diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py
+index 853a400449..2d7077af6d 100644
+--- a/Lib/test/test_http_cookiejar.py
++++ b/Lib/test/test_http_cookiejar.py
+@@ -123,6 +123,13 @@ class DateTimeTests(unittest.TestCase):
+ "http2time(%s) is not None\n"
+ "http2time(test) %s" % (test, http2time(test)))
+
++ def test_http2time_redos_regression_actually_completes(self):
++ # LOOSE_HTTP_DATE_RE was vulnerable to malicious input which caused catastrophic backtracking (REDoS).
++ # If we regress to cubic complexity, this test will take a very long time to succeed.
++ # If fixed, it should complete within a fraction of a second.
++ http2time("01 Jan 1970{}00:00:00 GMT!".format(" " * 10 ** 5))
++ http2time("01 Jan 1970 00:00:00{}GMT!".format(" " * 10 ** 5))
++
+ def test_iso2time(self):
+ def parse_date(text):
+ return time.gmtime(iso2time(text))[:6]
+@@ -180,6 +187,12 @@ class DateTimeTests(unittest.TestCase):
+ self.assertIsNone(iso2time(test),
+ "iso2time(%r)" % test)
+
++ def test_iso2time_performance_regression(self):
++ # If ISO_DATE_RE regresses to quadratic complexity, this test will take a very long time to succeed.
++ # If fixed, it should complete within a fraction of a second.
++ iso2time('1994-02-03{}14:15:29 -0100!'.format(' '*10**6))
++ iso2time('1994-02-03 14:15:29{}-0100!'.format(' '*10**6))
++
+
+ class HeaderTests(unittest.TestCase):
+
+diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
+index 1c516546f7..ad93f30482 100644
+--- a/Lib/test/test_inspect.py
++++ b/Lib/test/test_inspect.py
+@@ -3577,6 +3577,16 @@ class TestSignatureBind(unittest.TestCase):
+ iterator = iter(range(5))
+ self.assertEqual(self.call(setcomp_func, iterator), {0, 1, 4, 9, 16})
+
++ def test_signature_bind_posonly_kwargs(self):
++ def foo(bar, /, **kwargs):
++ return bar, kwargs.get(bar)
++
++ sig = inspect.signature(foo)
++ result = sig.bind("pos-only", bar="keyword")
++
++ self.assertEqual(result.kwargs, {"bar": "keyword"})
++ self.assertIn(("bar", "pos-only"), result.arguments.items())
++
+
+ class TestBoundArguments(unittest.TestCase):
+ def test_signature_bound_arguments_unhashable(self):
+diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
+index fc474c9905..50459e0792 100644
+--- a/Lib/test/test_io.py
++++ b/Lib/test/test_io.py
+@@ -3907,6 +3907,17 @@ class MiscIOTest(unittest.TestCase):
+ f.close()
+ g.close()
+
++ def test_open_pipe_with_append(self):
++ # bpo-27805: Ignore ESPIPE from lseek() in open().
++ r, w = os.pipe()
++ self.addCleanup(os.close, r)
++ f = self.open(w, 'a')
++ self.addCleanup(f.close)
++ # Check that the file is marked non-seekable. On Windows, however, lseek
++ # somehow succeeds on pipes.
++ if sys.platform != 'win32':
++ self.assertFalse(f.seekable())
++
+ def test_io_after_close(self):
+ for kwargs in [
+ {"mode": "w"},
+diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
+index e0ec441985..4a02db2817 100644
+--- a/Lib/test/test_ntpath.py
++++ b/Lib/test/test_ntpath.py
+@@ -22,6 +22,23 @@ except AttributeError:
+ else:
+ HAVE_GETFINALPATHNAME = True
+
++try:
++ import ctypes
++except ImportError:
++ HAVE_GETSHORTPATHNAME = False
++else:
++ HAVE_GETSHORTPATHNAME = True
++ def _getshortpathname(path):
++ GSPN = ctypes.WinDLL("kernel32", use_last_error=True).GetShortPathNameW
++ GSPN.argtypes = [ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32]
++ GSPN.restype = ctypes.c_uint32
++ result_len = GSPN(path, None, 0)
++ if not result_len:
++ raise OSError("failed to get short path name 0x{:08X}"
++ .format(ctypes.get_last_error()))
++ result = ctypes.create_unicode_buffer(result_len)
++ result_len = GSPN(path, result, result_len)
++ return result[:result_len]
+
+ def _norm(path):
+ if isinstance(path, (bytes, str, os.PathLike)):
+@@ -286,14 +303,16 @@ class TestNtpath(NtpathTestCase):
+ ABSTFN + r"\missing")
+ self.assertPathEqual(ntpath.realpath(r"broken\foo"),
+ ABSTFN + r"\missing\foo")
++ # bpo-38453: We no longer recursively resolve segments of relative
++ # symlinks that the OS cannot resolve.
+ self.assertPathEqual(ntpath.realpath(r"broken1"),
+- ABSTFN + r"\missing\bar")
++ ABSTFN + r"\broken\bar")
+ self.assertPathEqual(ntpath.realpath(r"broken1\baz"),
+- ABSTFN + r"\missing\bar\baz")
++ ABSTFN + r"\broken\bar\baz")
+ self.assertPathEqual(ntpath.realpath("broken2"),
+- ABSTFN + r"\missing")
++ ABSTFN + r"\self\self\missing")
+ self.assertPathEqual(ntpath.realpath("broken3"),
+- ABSTFN + r"\missing")
++ ABSTFN + r"\subdir\parent\subdir\parent\missing")
+ self.assertPathEqual(ntpath.realpath("broken4"),
+ ABSTFN + r"\missing")
+ self.assertPathEqual(ntpath.realpath("broken5"),
+@@ -304,13 +323,13 @@ class TestNtpath(NtpathTestCase):
+ self.assertPathEqual(ntpath.realpath(rb"broken\foo"),
+ os.fsencode(ABSTFN + r"\missing\foo"))
+ self.assertPathEqual(ntpath.realpath(rb"broken1"),
+- os.fsencode(ABSTFN + r"\missing\bar"))
++ os.fsencode(ABSTFN + r"\broken\bar"))
+ self.assertPathEqual(ntpath.realpath(rb"broken1\baz"),
+- os.fsencode(ABSTFN + r"\missing\bar\baz"))
++ os.fsencode(ABSTFN + r"\broken\bar\baz"))
+ self.assertPathEqual(ntpath.realpath(b"broken2"),
+- os.fsencode(ABSTFN + r"\missing"))
++ os.fsencode(ABSTFN + r"\self\self\missing"))
+ self.assertPathEqual(ntpath.realpath(rb"broken3"),
+- os.fsencode(ABSTFN + r"\missing"))
++ os.fsencode(ABSTFN + r"\subdir\parent\subdir\parent\missing"))
+ self.assertPathEqual(ntpath.realpath(b"broken4"),
+ os.fsencode(ABSTFN + r"\missing"))
+ self.assertPathEqual(ntpath.realpath(b"broken5"),
+@@ -319,8 +338,8 @@ class TestNtpath(NtpathTestCase):
+ @support.skip_unless_symlink
+ @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
+ def test_realpath_symlink_loops(self):
+- # Bug #930024, return the path unchanged if we get into an infinite
+- # symlink loop.
++ # Symlink loops are non-deterministic as to which path is returned, but
++ # it will always be the fully resolved path of one member of the cycle
+ ABSTFN = ntpath.abspath(support.TESTFN)
+ self.addCleanup(support.unlink, ABSTFN)
+ self.addCleanup(support.unlink, ABSTFN + "1")
+@@ -332,8 +351,6 @@ class TestNtpath(NtpathTestCase):
+ os.symlink(ABSTFN, ABSTFN)
+ self.assertPathEqual(ntpath.realpath(ABSTFN), ABSTFN)
+
+- # cycles are non-deterministic as to which path is returned, but
+- # it will always be the fully resolved path of one member of the cycle
+ os.symlink(ABSTFN + "1", ABSTFN + "2")
+ os.symlink(ABSTFN + "2", ABSTFN + "1")
+ expected = (ABSTFN + "1", ABSTFN + "2")
+@@ -402,6 +419,35 @@ class TestNtpath(NtpathTestCase):
+ def test_realpath_nul(self):
+ tester("ntpath.realpath('NUL')", r'\\.\NUL')
+
++ @unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
++ @unittest.skipUnless(HAVE_GETSHORTPATHNAME, 'need _getshortpathname')
++ def test_realpath_cwd(self):
++ ABSTFN = ntpath.abspath(support.TESTFN)
++
++ support.unlink(ABSTFN)
++ support.rmtree(ABSTFN)
++ os.mkdir(ABSTFN)
++ self.addCleanup(support.rmtree, ABSTFN)
++
++ test_dir_long = ntpath.join(ABSTFN, "MyVeryLongDirectoryName")
++ os.mkdir(test_dir_long)
++
++ test_dir_short = _getshortpathname(test_dir_long)
++ test_file_long = ntpath.join(test_dir_long, "file.txt")
++ test_file_short = ntpath.join(test_dir_short, "file.txt")
++
++ with open(test_file_long, "wb") as f:
++ f.write(b"content")
++
++ self.assertPathEqual(test_file_long, ntpath.realpath(test_file_short))
++
++ with support.change_cwd(test_dir_long):
++ self.assertPathEqual(test_file_long, ntpath.realpath("file.txt"))
++ with support.change_cwd(test_dir_long.lower()):
++ self.assertPathEqual(test_file_long, ntpath.realpath("file.txt"))
++ with support.change_cwd(test_dir_short):
++ self.assertPathEqual(test_file_long, ntpath.realpath("file.txt"))
++
+ def test_expandvars(self):
+ with support.EnvironmentVarGuard() as env:
+ env.clear()
+diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
+index 95d0b09882..4543e3773d 100644
+--- a/Lib/test/test_pathlib.py
++++ b/Lib/test/test_pathlib.py
+@@ -2291,11 +2291,15 @@ class WindowsPathTest(_BasePathTest, unittest.TestCase):
+ P = self.cls
+ p = P(BASE)
+ self.assertEqual(set(p.glob("FILEa")), { P(BASE, "fileA") })
++ self.assertEqual(set(p.glob("F*a")), { P(BASE, "fileA") })
++ self.assertEqual(set(map(str, p.glob("FILEa"))), {f"{p}\\FILEa"})
++ self.assertEqual(set(map(str, p.glob("F*a"))), {f"{p}\\fileA"})
+
+ def test_rglob(self):
+ P = self.cls
+ p = P(BASE, "dirC")
+ self.assertEqual(set(p.rglob("FILEd")), { P(BASE, "dirC/dirD/fileD") })
++ self.assertEqual(set(map(str, p.rglob("FILEd"))), {f"{p}\\dirD\\FILEd"})
+
+ def test_expanduser(self):
+ P = self.cls
+diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py
+index 5c2d026507..0d887e210d 100644
+--- a/Lib/test/test_plistlib.py
++++ b/Lib/test/test_plistlib.py
+@@ -505,6 +505,26 @@ class TestPlistlib(unittest.TestCase):
+ pl2 = plistlib.loads(data)
+ self.assertEqual(dict(pl), dict(pl2))
+
++ def test_dump_invalid_format(self):
++ with self.assertRaises(ValueError):
++ plistlib.dumps({}, fmt="blah")
++
++ def test_load_invalid_file(self):
++ with self.assertRaises(plistlib.InvalidFileException):
++ plistlib.loads(b"these are not plist file contents")
++
++ def test_modified_uid_negative(self):
++ neg_uid = UID(1)
++ neg_uid.data = -1 # dodge the negative check in the constructor
++ with self.assertRaises(ValueError):
++ plistlib.dumps(neg_uid, fmt=plistlib.FMT_BINARY)
++
++ def test_modified_uid_huge(self):
++ huge_uid = UID(1)
++ huge_uid.data = 2 ** 64 # dodge the size check in the constructor
++ with self.assertRaises(OverflowError):
++ plistlib.dumps(huge_uid, fmt=plistlib.FMT_BINARY)
++
+
+ class TestBinaryPlistlib(unittest.TestCase):
+
+@@ -748,9 +768,5 @@ class MiscTestCase(unittest.TestCase):
+ support.check__all__(self, plistlib, blacklist=blacklist)
+
+
+-def test_main():
+- support.run_unittest(TestPlistlib, TestPlistlibDeprecated, TestKeyedArchive, MiscTestCase)
+-
+-
+ if __name__ == '__main__':
+- test_main()
++ unittest.main()
+diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
+index 636e3bd979..b98e7dc798 100644
+--- a/Lib/test/test_shutil.py
++++ b/Lib/test/test_shutil.py
+@@ -177,7 +177,10 @@ class TestShutil(unittest.TestCase):
+
+ Returns the path of the directory.
+ """
+- d = tempfile.mkdtemp()
++ basedir = None
++ if sys.platform == "win32":
++ basedir = os.path.realpath(os.getcwd())
++ d = tempfile.mkdtemp(dir=basedir)
+ self.tempdirs.append(d)
+ return d
+
+@@ -1788,8 +1791,11 @@ class TestMove(unittest.TestCase):
+
+ def setUp(self):
+ filename = "foo"
+- self.src_dir = tempfile.mkdtemp()
+- self.dst_dir = tempfile.mkdtemp()
++ basedir = None
++ if sys.platform == "win32":
++ basedir = os.path.realpath(os.getcwd())
++ self.src_dir = tempfile.mkdtemp(dir=basedir)
++ self.dst_dir = tempfile.mkdtemp(dir=basedir)
+ self.src_file = os.path.join(self.src_dir, filename)
+ self.dst_file = os.path.join(self.dst_dir, filename)
+ with open(self.src_file, "wb") as f:
+diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py
+index af26473e8f..bebd9b5d6f 100644
+--- a/Lib/test/test_statistics.py
++++ b/Lib/test/test_statistics.py
+@@ -2651,9 +2651,13 @@ class TestNormalDist:
+ nd2 = NormalDist(2, 4)
+ nd3 = NormalDist()
+ nd4 = NormalDist(2, 4)
++ nd5 = NormalDist(2, 8)
++ nd6 = NormalDist(8, 4)
+ self.assertNotEqual(nd1, nd2)
+ self.assertEqual(nd1, nd3)
+ self.assertEqual(nd2, nd4)
++ self.assertNotEqual(nd2, nd5)
++ self.assertNotEqual(nd2, nd6)
+
+ # Test NotImplemented when types are different
+ class A:
+diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
+index 69ac584667..b2afd127df 100644
+--- a/Lib/test/test_subprocess.py
++++ b/Lib/test/test_subprocess.py
+@@ -45,6 +45,18 @@ NONEXISTING_CMD = ('nonexisting_i_hope',)
+ # Ignore errors that indicate the command was not found
+ NONEXISTING_ERRORS = (FileNotFoundError, NotADirectoryError, PermissionError)
+
++ZERO_RETURN_CMD = (sys.executable, '-c', 'pass')
++
++
++def setUpModule():
++ shell_true = shutil.which('true')
++ if shell_true is None:
++ return
++ if (os.access(shell_true, os.X_OK) and
++ subprocess.run([shell_true]).returncode == 0):
++ global ZERO_RETURN_CMD
++ ZERO_RETURN_CMD = (shell_true,) # Faster than Python startup.
++
+
+ class BaseTestCase(unittest.TestCase):
+ def setUp(self):
+@@ -89,7 +101,7 @@ class PopenExecuteChildRaises(subprocess.Popen):
+ class ProcessTestCase(BaseTestCase):
+
+ def test_io_buffered_by_default(self):
+- p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
++ p = subprocess.Popen(ZERO_RETURN_CMD,
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ try:
+@@ -103,7 +115,7 @@ class ProcessTestCase(BaseTestCase):
+ p.wait()
+
+ def test_io_unbuffered_works(self):
+- p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
++ p = subprocess.Popen(ZERO_RETURN_CMD,
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE, bufsize=0)
+ try:
+@@ -133,8 +145,7 @@ class ProcessTestCase(BaseTestCase):
+
+ def test_check_call_zero(self):
+ # check_call() function with zero return code
+- rc = subprocess.check_call([sys.executable, "-c",
+- "import sys; sys.exit(0)"])
++ rc = subprocess.check_call(ZERO_RETURN_CMD)
+ self.assertEqual(rc, 0)
+
+ def test_check_call_nonzero(self):
+@@ -700,19 +711,19 @@ class ProcessTestCase(BaseTestCase):
+ newenv = os.environ.copy()
+ newenv["FRUIT\0VEGETABLE"] = "cabbage"
+ with self.assertRaises(ValueError):
+- subprocess.Popen([sys.executable, "-c", "pass"], env=newenv)
++ subprocess.Popen(ZERO_RETURN_CMD, env=newenv)
+
+ # null character in the environment variable value
+ newenv = os.environ.copy()
+ newenv["FRUIT"] = "orange\0VEGETABLE=cabbage"
+ with self.assertRaises(ValueError):
+- subprocess.Popen([sys.executable, "-c", "pass"], env=newenv)
++ subprocess.Popen(ZERO_RETURN_CMD, env=newenv)
+
+ # equal character in the environment variable name
+ newenv = os.environ.copy()
+ newenv["FRUIT=ORANGE"] = "lemon"
+ with self.assertRaises(ValueError):
+- subprocess.Popen([sys.executable, "-c", "pass"], env=newenv)
++ subprocess.Popen(ZERO_RETURN_CMD, env=newenv)
+
+ # equal character in the environment variable value
+ newenv = os.environ.copy()
+@@ -813,7 +824,7 @@ class ProcessTestCase(BaseTestCase):
+ options['stderr'] = subprocess.PIPE
+ if not options:
+ continue
+- p = subprocess.Popen((sys.executable, "-c", "pass"), **options)
++ p = subprocess.Popen(ZERO_RETURN_CMD, **options)
+ p.communicate()
+ if p.stdin is not None:
+ self.assertTrue(p.stdin.closed)
+@@ -952,7 +963,7 @@ class ProcessTestCase(BaseTestCase):
+ #
+ # We set stdout to PIPE because, as of this writing, a different
+ # code path is tested when the number of pipes is zero or one.
+- p = subprocess.Popen([sys.executable, "-c", "pass"],
++ p = subprocess.Popen(ZERO_RETURN_CMD,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ universal_newlines=True)
+@@ -1100,7 +1111,7 @@ class ProcessTestCase(BaseTestCase):
+ self.assertEqual(p.poll(), 0)
+
+ def test_wait(self):
+- p = subprocess.Popen([sys.executable, "-c", "pass"])
++ p = subprocess.Popen(ZERO_RETURN_CMD)
+ self.assertEqual(p.wait(), 0)
+ # Subsequent invocations should just return the returncode
+ self.assertEqual(p.wait(), 0)
+@@ -1119,14 +1130,14 @@ class ProcessTestCase(BaseTestCase):
+ # an invalid type of the bufsize argument should raise
+ # TypeError.
+ with self.assertRaises(TypeError):
+- subprocess.Popen([sys.executable, "-c", "pass"], "orange")
++ subprocess.Popen(ZERO_RETURN_CMD, "orange")
+
+ def test_bufsize_is_none(self):
+ # bufsize=None should be the same as bufsize=0.
+- p = subprocess.Popen([sys.executable, "-c", "pass"], None)
++ p = subprocess.Popen(ZERO_RETURN_CMD, None)
+ self.assertEqual(p.wait(), 0)
+ # Again with keyword arg
+- p = subprocess.Popen([sys.executable, "-c", "pass"], bufsize=None)
++ p = subprocess.Popen(ZERO_RETURN_CMD, bufsize=None)
+ self.assertEqual(p.wait(), 0)
+
+ def _test_bufsize_equal_one(self, line, expected, universal_newlines):
+@@ -1331,7 +1342,7 @@ class ProcessTestCase(BaseTestCase):
+
+ def test_communicate_epipe(self):
+ # Issue 10963: communicate() should hide EPIPE
+- p = subprocess.Popen([sys.executable, "-c", 'pass'],
++ p = subprocess.Popen(ZERO_RETURN_CMD,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+@@ -1342,7 +1353,7 @@ class ProcessTestCase(BaseTestCase):
+
+ def test_communicate_epipe_only_stdin(self):
+ # Issue 10963: communicate() should hide EPIPE
+- p = subprocess.Popen([sys.executable, "-c", 'pass'],
++ p = subprocess.Popen(ZERO_RETURN_CMD,
+ stdin=subprocess.PIPE)
+ self.addCleanup(p.stdin.close)
+ p.wait()
+@@ -1381,7 +1392,7 @@ class ProcessTestCase(BaseTestCase):
+ fds_before_popen = os.listdir(fd_directory)
+ with self.assertRaises(PopenTestException):
+ PopenExecuteChildRaises(
+- [sys.executable, '-c', 'pass'], stdin=subprocess.PIPE,
++ ZERO_RETURN_CMD, stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ # NOTE: This test doesn't verify that the real _execute_child
+@@ -1424,7 +1435,7 @@ class RunFuncTestCase(BaseTestCase):
+
+ def test_check_zero(self):
+ # check_returncode shouldn't raise when returncode is zero
+- cp = self.run_python("import sys; sys.exit(0)", check=True)
++ cp = subprocess.run(ZERO_RETURN_CMD, check=True)
+ self.assertEqual(cp.returncode, 0)
+
+ def test_timeout(self):
+@@ -1824,7 +1835,7 @@ class POSIXProcessTestCase(BaseTestCase):
+
+ with self.assertRaises(subprocess.SubprocessError):
+ self._TestExecuteChildPopen(
+- self, [sys.executable, "-c", "pass"],
++ self, ZERO_RETURN_CMD,
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE, preexec_fn=raise_it)
+
+@@ -2281,7 +2292,7 @@ class POSIXProcessTestCase(BaseTestCase):
+
+ try:
+ subprocess.call(
+- [sys.executable, "-c", "pass"],
++ ZERO_RETURN_CMD,
+ preexec_fn=prepare)
+ except ValueError as err:
+ # Pure Python implementations keeps the message
+@@ -2324,29 +2335,30 @@ class POSIXProcessTestCase(BaseTestCase):
+ self.assertEqual(stdout.decode('ascii'), ascii(encoded_value))
+
+ def test_bytes_program(self):
+- abs_program = os.fsencode(sys.executable)
+- path, program = os.path.split(sys.executable)
++ abs_program = os.fsencode(ZERO_RETURN_CMD[0])
++ args = list(ZERO_RETURN_CMD[1:])
++ path, program = os.path.split(ZERO_RETURN_CMD[0])
+ program = os.fsencode(program)
+
+ # absolute bytes path
+- exitcode = subprocess.call([abs_program, "-c", "pass"])
++ exitcode = subprocess.call([abs_program]+args)
+ self.assertEqual(exitcode, 0)
+
+ # absolute bytes path as a string
+- cmd = b"'" + abs_program + b"' -c pass"
++ cmd = b"'%s' %s" % (abs_program, " ".join(args).encode("utf-8"))
+ exitcode = subprocess.call(cmd, shell=True)
+ self.assertEqual(exitcode, 0)
+
+ # bytes program, unicode PATH
+ env = os.environ.copy()
+ env["PATH"] = path
+- exitcode = subprocess.call([program, "-c", "pass"], env=env)
++ exitcode = subprocess.call([program]+args, env=env)
+ self.assertEqual(exitcode, 0)
+
+ # bytes program, bytes PATH
+ envb = os.environb.copy()
+ envb[b"PATH"] = os.fsencode(path)
+- exitcode = subprocess.call([program, "-c", "pass"], env=envb)
++ exitcode = subprocess.call([program]+args, env=envb)
+ self.assertEqual(exitcode, 0)
+
+ def test_pipe_cloexec(self):
+@@ -2574,7 +2586,7 @@ class POSIXProcessTestCase(BaseTestCase):
+ # pass_fds overrides close_fds with a warning.
+ with self.assertWarns(RuntimeWarning) as context:
+ self.assertFalse(subprocess.call(
+- [sys.executable, "-c", "import sys; sys.exit(0)"],
++ ZERO_RETURN_CMD,
+ close_fds=False, pass_fds=(fd, )))
+ self.assertIn('overriding close_fds', str(context.warning))
+
+@@ -2636,19 +2648,19 @@ class POSIXProcessTestCase(BaseTestCase):
+
+ def test_stdout_stdin_are_single_inout_fd(self):
+ with io.open(os.devnull, "r+") as inout:
+- p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
++ p = subprocess.Popen(ZERO_RETURN_CMD,
+ stdout=inout, stdin=inout)
+ p.wait()
+
+ def test_stdout_stderr_are_single_inout_fd(self):
+ with io.open(os.devnull, "r+") as inout:
+- p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
++ p = subprocess.Popen(ZERO_RETURN_CMD,
+ stdout=inout, stderr=inout)
+ p.wait()
+
+ def test_stderr_stdin_are_single_inout_fd(self):
+ with io.open(os.devnull, "r+") as inout:
+- p = subprocess.Popen([sys.executable, "-c", "import sys; sys.exit(0)"],
++ p = subprocess.Popen(ZERO_RETURN_CMD,
+ stderr=inout, stdin=inout)
+ p.wait()
+
+@@ -2836,7 +2848,7 @@ class POSIXProcessTestCase(BaseTestCase):
+ def test_communicate_BrokenPipeError_stdin_close(self):
+ # By not setting stdout or stderr or a timeout we force the fast path
+ # that just calls _stdin_write() internally due to our mock.
+- proc = subprocess.Popen([sys.executable, '-c', 'pass'])
++ proc = subprocess.Popen(ZERO_RETURN_CMD)
+ with proc, mock.patch.object(proc, 'stdin') as mock_proc_stdin:
+ mock_proc_stdin.close.side_effect = BrokenPipeError
+ proc.communicate() # Should swallow BrokenPipeError from close.
+@@ -2845,7 +2857,7 @@ class POSIXProcessTestCase(BaseTestCase):
+ def test_communicate_BrokenPipeError_stdin_write(self):
+ # By not setting stdout or stderr or a timeout we force the fast path
+ # that just calls _stdin_write() internally due to our mock.
+- proc = subprocess.Popen([sys.executable, '-c', 'pass'])
++ proc = subprocess.Popen(ZERO_RETURN_CMD)
+ with proc, mock.patch.object(proc, 'stdin') as mock_proc_stdin:
+ mock_proc_stdin.write.side_effect = BrokenPipeError
+ proc.communicate(b'stuff') # Should swallow the BrokenPipeError.
+@@ -2884,7 +2896,7 @@ class POSIXProcessTestCase(BaseTestCase):
+ 'need _testcapi.W_STOPCODE')
+ def test_stopped(self):
+ """Test wait() behavior when waitpid returns WIFSTOPPED; issue29335."""
+- args = [sys.executable, '-c', 'pass']
++ args = ZERO_RETURN_CMD
+ proc = subprocess.Popen(args)
+
+ # Wait until the real process completes to avoid zombie process
+@@ -2914,7 +2926,7 @@ class Win32ProcessTestCase(BaseTestCase):
+ # Since Python is a console process, it won't be affected
+ # by wShowWindow, but the argument should be silently
+ # ignored
+- subprocess.call([sys.executable, "-c", "import sys; sys.exit(0)"],
++ subprocess.call(ZERO_RETURN_CMD,
+ startupinfo=startupinfo)
+
+ def test_startupinfo_keywords(self):
+@@ -2930,7 +2942,7 @@ class Win32ProcessTestCase(BaseTestCase):
+ # Since Python is a console process, it won't be affected
+ # by wShowWindow, but the argument should be silently
+ # ignored
+- subprocess.call([sys.executable, "-c", "import sys; sys.exit(0)"],
++ subprocess.call(ZERO_RETURN_CMD,
+ startupinfo=startupinfo)
+
+ def test_startupinfo_copy(self):
+@@ -2942,7 +2954,7 @@ class Win32ProcessTestCase(BaseTestCase):
+ # Call Popen() twice with the same startupinfo object to make sure
+ # that it's not modified
+ for _ in range(2):
+- cmd = [sys.executable, "-c", "pass"]
++ cmd = ZERO_RETURN_CMD
+ with open(os.devnull, 'w') as null:
+ proc = subprocess.Popen(cmd,
+ stdout=null,
+@@ -2982,7 +2994,7 @@ class Win32ProcessTestCase(BaseTestCase):
+ class BadEnv(dict):
+ keys = None
+ with self.assertRaises(TypeError):
+- subprocess.Popen([sys.executable, "-c", "pass"], env=BadEnv())
++ subprocess.Popen(ZERO_RETURN_CMD, env=BadEnv())
+
+ def test_close_fds(self):
+ # close file descriptors
+@@ -3043,13 +3055,13 @@ class Win32ProcessTestCase(BaseTestCase):
+ def test_empty_attribute_list(self):
+ startupinfo = subprocess.STARTUPINFO()
+ startupinfo.lpAttributeList = {}
+- subprocess.call([sys.executable, "-c", "import sys; sys.exit(0)"],
++ subprocess.call(ZERO_RETURN_CMD,
+ startupinfo=startupinfo)
+
+ def test_empty_handle_list(self):
+ startupinfo = subprocess.STARTUPINFO()
+ startupinfo.lpAttributeList = {"handle_list": []}
+- subprocess.call([sys.executable, "-c", "import sys; sys.exit(0)"],
++ subprocess.call(ZERO_RETURN_CMD,
+ startupinfo=startupinfo)
+
+ def test_shell_sequence(self):
+@@ -3348,7 +3360,7 @@ class ContextManagerTests(BaseTestCase):
+
+ def test_broken_pipe_cleanup(self):
+ """Broken pipe error should not prevent wait() (Issue 21619)"""
+- proc = subprocess.Popen([sys.executable, '-c', 'pass'],
++ proc = subprocess.Popen(ZERO_RETURN_CMD,
+ stdin=subprocess.PIPE,
+ bufsize=support.PIPE_MAX_SIZE*2)
+ proc = proc.__enter__()
+diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
+index 104b7c035c..ded5a8b39d 100644
+--- a/Lib/test/test_typing.py
++++ b/Lib/test/test_typing.py
+@@ -2778,6 +2778,16 @@ except StopIteration as e:
+
+ gth = get_type_hints
+
++class ForRefExample:
++ @ann_module.dec
++ def func(self: 'ForRefExample'):
++ pass
++
++ @ann_module.dec
++ @ann_module.dec
++ def nested(self: 'ForRefExample'):
++ pass
++
+
+ class GetTypeHintTests(BaseTestCase):
+ def test_get_type_hints_from_various_objects(self):
+@@ -2876,6 +2886,11 @@ class GetTypeHintTests(BaseTestCase):
+ 'x': ClassVar[Optional[B]]})
+ self.assertEqual(gth(G), {'lst': ClassVar[List[T]]})
+
++ def test_get_type_hints_wrapped_decoratored_func(self):
++ expects = {'self': ForRefExample}
++ self.assertEqual(gth(ForRefExample.func), expects)
++ self.assertEqual(gth(ForRefExample.nested), expects)
++
+
+ class GetUtilitiesTestCase(TestCase):
+ def test_get_origin(self):
+diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py
+index 4ae6ed3385..762500789f 100644
+--- a/Lib/test/test_urlparse.py
++++ b/Lib/test/test_urlparse.py
+@@ -709,15 +709,17 @@ class UrlParseTestCase(unittest.TestCase):
+
+ def test_portseparator(self):
+ # Issue 754016 makes changes for port separator ':' from scheme separator
+- self.assertEqual(urllib.parse.urlparse("path:80"),
+- ('','','path:80','','',''))
++ self.assertEqual(urllib.parse.urlparse("http:80"), ('http','','80','','',''))
++ self.assertEqual(urllib.parse.urlparse("https:80"), ('https','','80','','',''))
++ self.assertEqual(urllib.parse.urlparse("path:80"), ('path','','80','','',''))
+ self.assertEqual(urllib.parse.urlparse("http:"),('http','','','','',''))
+ self.assertEqual(urllib.parse.urlparse("https:"),('https','','','','',''))
+ self.assertEqual(urllib.parse.urlparse("http://www.python.org:80"),
+ ('http','www.python.org:80','','','',''))
+ # As usual, need to check bytes input as well
+- self.assertEqual(urllib.parse.urlparse(b"path:80"),
+- (b'',b'',b'path:80',b'',b'',b''))
++ self.assertEqual(urllib.parse.urlparse(b"http:80"), (b'http',b'',b'80',b'',b'',b''))
++ self.assertEqual(urllib.parse.urlparse(b"https:80"), (b'https',b'',b'80',b'',b'',b''))
++ self.assertEqual(urllib.parse.urlparse(b"path:80"), (b'path',b'',b'80',b'',b'',b''))
+ self.assertEqual(urllib.parse.urlparse(b"http:"),(b'http',b'',b'',b'',b'',b''))
+ self.assertEqual(urllib.parse.urlparse(b"https:"),(b'https',b'',b'',b'',b'',b''))
+ self.assertEqual(urllib.parse.urlparse(b"http://www.python.org:80"),
+diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
+index 76e2f647c6..f03c044eae 100644
+--- a/Lib/test/test_zipfile.py
++++ b/Lib/test/test_zipfile.py
+@@ -1,6 +1,7 @@
+ import contextlib
+ import importlib.util
+ import io
++import itertools
+ import os
+ import pathlib
+ import posixpath
+@@ -824,6 +825,227 @@ class StoredTestZip64InSmallFiles(AbstractTestZip64InSmallFiles,
+ zinfo = zipfp.getinfo("strfile")
+ self.assertEqual(zinfo.extra, extra)
+
++ def make_zip64_file(
++ self, file_size_64_set=False, file_size_extra=False,
++ compress_size_64_set=False, compress_size_extra=False,
++ header_offset_64_set=False, header_offset_extra=False,
++ ):
++ """Generate bytes sequence for a zip with (incomplete) zip64 data.
++
++ The actual values (not the zip 64 0xffffffff values) stored in the file
++ are:
++ file_size: 8
++ compress_size: 8
++ header_offset: 0
++ """
++ actual_size = 8
++ actual_header_offset = 0
++ local_zip64_fields = []
++ central_zip64_fields = []
++
++ file_size = actual_size
++ if file_size_64_set:
++ file_size = 0xffffffff
++ if file_size_extra:
++ local_zip64_fields.append(actual_size)
++ central_zip64_fields.append(actual_size)
++ file_size = struct.pack("<L", file_size)
++
++ compress_size = actual_size
++ if compress_size_64_set:
++ compress_size = 0xffffffff
++ if compress_size_extra:
++ local_zip64_fields.append(actual_size)
++ central_zip64_fields.append(actual_size)
++ compress_size = struct.pack("<L", compress_size)
++
++ header_offset = actual_header_offset
++ if header_offset_64_set:
++ header_offset = 0xffffffff
++ if header_offset_extra:
++ central_zip64_fields.append(actual_header_offset)
++ header_offset = struct.pack("<L", header_offset)
++
++ local_extra = struct.pack(
++ '<HH' + 'Q'*len(local_zip64_fields),
++ 0x0001,
++ 8*len(local_zip64_fields),
++ *local_zip64_fields
++ )
++
++ central_extra = struct.pack(
++ '<HH' + 'Q'*len(central_zip64_fields),
++ 0x0001,
++ 8*len(central_zip64_fields),
++ *central_zip64_fields
++ )
++
++ central_dir_size = struct.pack('<Q', 58 + 8 * len(central_zip64_fields))
++ offset_to_central_dir = struct.pack('<Q', 50 + 8 * len(local_zip64_fields))
++
++ local_extra_length = struct.pack("<H", 4 + 8 * len(local_zip64_fields))
++ central_extra_length = struct.pack("<H", 4 + 8 * len(central_zip64_fields))
++
++ filename = b"test.txt"
++ content = b"test1234"
++ filename_length = struct.pack("<H", len(filename))
++ zip64_contents = (
++ # Local file header
++ b"PK\x03\x04\x14\x00\x00\x00\x00\x00\x00\x00!\x00\x9e%\xf5\xaf"
++ + compress_size
++ + file_size
++ + filename_length
++ + local_extra_length
++ + filename
++ + local_extra
++ + content
++ # Central directory:
++ + b"PK\x01\x02-\x03-\x00\x00\x00\x00\x00\x00\x00!\x00\x9e%\xf5\xaf"
++ + compress_size
++ + file_size
++ + filename_length
++ + central_extra_length
++ + b"\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01"
++ + header_offset
++ + filename
++ + central_extra
++ # Zip64 end of central directory
++ + b"PK\x06\x06,\x00\x00\x00\x00\x00\x00\x00-\x00-"
++ + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00"
++ + b"\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"
++ + central_dir_size
++ + offset_to_central_dir
++ # Zip64 end of central directory locator
++ + b"PK\x06\x07\x00\x00\x00\x00l\x00\x00\x00\x00\x00\x00\x00\x01"
++ + b"\x00\x00\x00"
++ # end of central directory
++ + b"PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00:\x00\x00\x002\x00"
++ + b"\x00\x00\x00\x00"
++ )
++ return zip64_contents
++
++ def test_bad_zip64_extra(self):
++ """Missing zip64 extra records raises an exception.
++
++ There are 4 fields that the zip64 format handles (the disk number is
++ not used in this module and so is ignored here). According to the zip
++ spec:
++ The order of the fields in the zip64 extended
++ information record is fixed, but the fields MUST
++ only appear if the corresponding Local or Central
++ directory record field is set to 0xFFFF or 0xFFFFFFFF.
++
++ If the zip64 extra content doesn't contain enough entries for the
++ number of fields marked with 0xFFFF or 0xFFFFFFFF, we raise an error.
++ This test mismatches the length of the zip64 extra field and the number
++ of fields set to indicate the presence of zip64 data.
++ """
++ # zip64 file size present, no fields in extra, expecting one, equals
++ # missing file size.
++ missing_file_size_extra = self.make_zip64_file(
++ file_size_64_set=True,
++ )
++ with self.assertRaises(zipfile.BadZipFile) as e:
++ zipfile.ZipFile(io.BytesIO(missing_file_size_extra))
++ self.assertIn('file size', str(e.exception).lower())
++
++ # zip64 file size present, zip64 compress size present, one field in
++ # extra, expecting two, equals missing compress size.
++ missing_compress_size_extra = self.make_zip64_file(
++ file_size_64_set=True,
++ file_size_extra=True,
++ compress_size_64_set=True,
++ )
++ with self.assertRaises(zipfile.BadZipFile) as e:
++ zipfile.ZipFile(io.BytesIO(missing_compress_size_extra))
++ self.assertIn('compress size', str(e.exception).lower())
++
++ # zip64 compress size present, no fields in extra, expecting one,
++ # equals missing compress size.
++ missing_compress_size_extra = self.make_zip64_file(
++ compress_size_64_set=True,
++ )
++ with self.assertRaises(zipfile.BadZipFile) as e:
++ zipfile.ZipFile(io.BytesIO(missing_compress_size_extra))
++ self.assertIn('compress size', str(e.exception).lower())
++
++ # zip64 file size present, zip64 compress size present, zip64 header
++ # offset present, two fields in extra, expecting three, equals missing
++ # header offset
++ missing_header_offset_extra = self.make_zip64_file(
++ file_size_64_set=True,
++ file_size_extra=True,
++ compress_size_64_set=True,
++ compress_size_extra=True,
++ header_offset_64_set=True,
++ )
++ with self.assertRaises(zipfile.BadZipFile) as e:
++ zipfile.ZipFile(io.BytesIO(missing_header_offset_extra))
++ self.assertIn('header offset', str(e.exception).lower())
++
++ # zip64 compress size present, zip64 header offset present, one field
++ # in extra, expecting two, equals missing header offset
++ missing_header_offset_extra = self.make_zip64_file(
++ file_size_64_set=False,
++ compress_size_64_set=True,
++ compress_size_extra=True,
++ header_offset_64_set=True,
++ )
++ with self.assertRaises(zipfile.BadZipFile) as e:
++ zipfile.ZipFile(io.BytesIO(missing_header_offset_extra))
++ self.assertIn('header offset', str(e.exception).lower())
++
++ # zip64 file size present, zip64 header offset present, one field in
++ # extra, expecting two, equals missing header offset
++ missing_header_offset_extra = self.make_zip64_file(
++ file_size_64_set=True,
++ file_size_extra=True,
++ compress_size_64_set=False,
++ header_offset_64_set=True,
++ )
++ with self.assertRaises(zipfile.BadZipFile) as e:
++ zipfile.ZipFile(io.BytesIO(missing_header_offset_extra))
++ self.assertIn('header offset', str(e.exception).lower())
++
++ # zip64 header offset present, no fields in extra, expecting one,
++ # equals missing header offset
++ missing_header_offset_extra = self.make_zip64_file(
++ file_size_64_set=False,
++ compress_size_64_set=False,
++ header_offset_64_set=True,
++ )
++ with self.assertRaises(zipfile.BadZipFile) as e:
++ zipfile.ZipFile(io.BytesIO(missing_header_offset_extra))
++ self.assertIn('header offset', str(e.exception).lower())
++
++ def test_generated_valid_zip64_extra(self):
++ # These values are what is set in the make_zip64_file method.
++ expected_file_size = 8
++ expected_compress_size = 8
++ expected_header_offset = 0
++ expected_content = b"test1234"
++
++ # Loop through the various valid combinations of zip64 masks
++ # present and extra fields present.
++ params = (
++ {"file_size_64_set": True, "file_size_extra": True},
++ {"compress_size_64_set": True, "compress_size_extra": True},
++ {"header_offset_64_set": True, "header_offset_extra": True},
++ )
++
++ for r in range(1, len(params) + 1):
++ for combo in itertools.combinations(params, r):
++ kwargs = {}
++ for c in combo:
++ kwargs.update(c)
++ with zipfile.ZipFile(io.BytesIO(self.make_zip64_file(**kwargs))) as zf:
++ zinfo = zf.infolist()[0]
++ self.assertEqual(zinfo.file_size, expected_file_size)
++ self.assertEqual(zinfo.compress_size, expected_compress_size)
++ self.assertEqual(zinfo.header_offset, expected_header_offset)
++ self.assertEqual(zf.read(zinfo), expected_content)
++
++
+ @requires_zlib
+ class DeflateTestZip64InSmallFiles(AbstractTestZip64InSmallFiles,
+ unittest.TestCase):
+@@ -1907,6 +2129,44 @@ class DecryptionTests(unittest.TestCase):
+ self.assertRaises(TypeError, self.zip.open, "test.txt", pwd="python")
+ self.assertRaises(TypeError, self.zip.extract, "test.txt", pwd="python")
+
++ def test_seek_tell(self):
++ self.zip.setpassword(b"python")
++ txt = self.plain
++ test_word = b'encryption'
++ bloc = txt.find(test_word)
++ bloc_len = len(test_word)
++ with self.zip.open("test.txt", "r") as fp:
++ fp.seek(bloc, os.SEEK_SET)
++ self.assertEqual(fp.tell(), bloc)
++ fp.seek(-bloc, os.SEEK_CUR)
++ self.assertEqual(fp.tell(), 0)
++ fp.seek(bloc, os.SEEK_CUR)
++ self.assertEqual(fp.tell(), bloc)
++ self.assertEqual(fp.read(bloc_len), txt[bloc:bloc+bloc_len])
++
++ # Make sure that the second read after seeking back beyond
++ # _readbuffer returns the same content (ie. rewind to the start of
++ # the file to read forward to the required position).
++ old_read_size = fp.MIN_READ_SIZE
++ fp.MIN_READ_SIZE = 1
++ fp._readbuffer = b''
++ fp._offset = 0
++ fp.seek(0, os.SEEK_SET)
++ self.assertEqual(fp.tell(), 0)
++ fp.seek(bloc, os.SEEK_CUR)
++ self.assertEqual(fp.read(bloc_len), txt[bloc:bloc+bloc_len])
++ fp.MIN_READ_SIZE = old_read_size
++
++ fp.seek(0, os.SEEK_END)
++ self.assertEqual(fp.tell(), len(txt))
++ fp.seek(0, os.SEEK_SET)
++ self.assertEqual(fp.tell(), 0)
++
++ # Read the file completely to definitely call any eof integrity
++ # checks (crc) and make sure they still pass.
++ fp.read()
++
++
+ class AbstractTestsWithRandomBinaryFiles:
+ @classmethod
+ def setUpClass(cls):
+diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py
+index 57d5b25728..9f0e2e5e94 100644
+--- a/Lib/tkinter/__init__.py
++++ b/Lib/tkinter/__init__.py
+@@ -1051,7 +1051,7 @@ class Misc:
+ return self.tk.call('winfo', 'class', self._w)
+
+ def winfo_colormapfull(self):
+- """Return true if at the last color request the colormap was full."""
++ """Return True if at the last color request the colormap was full."""
+ return self.tk.getboolean(
+ self.tk.call('winfo', 'colormapfull', self._w))
+
+@@ -3224,7 +3224,7 @@ class Listbox(Widget, XView, YView):
+ select_clear = selection_clear
+
+ def selection_includes(self, index):
+- """Return 1 if INDEX is part of the selection."""
++ """Return True if INDEX is part of the selection."""
+ return self.tk.getboolean(self.tk.call(
+ self._w, 'selection', 'includes', index))
+
+diff --git a/Lib/typing.py b/Lib/typing.py
+index bd30da90ad..69f6d98734 100644
+--- a/Lib/typing.py
++++ b/Lib/typing.py
+@@ -1234,7 +1234,11 @@ def get_type_hints(obj, globalns=None, localns=None):
+ if isinstance(obj, types.ModuleType):
+ globalns = obj.__dict__
+ else:
+- globalns = getattr(obj, '__globals__', {})
++ nsobj = obj
++ # Find globalns for the unwrapped object.
++ while hasattr(nsobj, '__wrapped__'):
++ nsobj = nsobj.__wrapped__
++ globalns = getattr(nsobj, '__globals__', {})
+ if localns is None:
+ localns = globalns
+ elif localns is None:
+diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
+index 488ab1c23d..d6e3067945 100644
+--- a/Lib/unittest/mock.py
++++ b/Lib/unittest/mock.py
+@@ -1125,8 +1125,8 @@ class CallableMixin(Base):
+ _new_parent = _new_parent._mock_new_parent
+
+ def _execute_mock_call(self, /, *args, **kwargs):
+- # seperate from _increment_mock_call so that awaited functions are
+- # executed seperately from their call
++ # separate from _increment_mock_call so that awaited functions are
++ # executed separately from their call, also AsyncMock overrides this method
+
+ effect = self.side_effect
+ if effect is not None:
+@@ -2122,29 +2122,45 @@ class AsyncMockMixin(Base):
+ code_mock.co_flags = inspect.CO_COROUTINE
+ self.__dict__['__code__'] = code_mock
+
+- async def _mock_call(self, /, *args, **kwargs):
+- try:
+- result = super()._mock_call(*args, **kwargs)
+- except (BaseException, StopIteration) as e:
+- side_effect = self.side_effect
+- if side_effect is not None and not callable(side_effect):
+- raise
+- return await _raise(e)
++ async def _execute_mock_call(self, /, *args, **kwargs):
++ # This is nearly just like super(), except for sepcial handling
++ # of coroutines
+
+ _call = self.call_args
++ self.await_count += 1
++ self.await_args = _call
++ self.await_args_list.append(_call)
+
+- async def proxy():
+- try:
+- if inspect.isawaitable(result):
+- return await result
+- else:
+- return result
+- finally:
+- self.await_count += 1
+- self.await_args = _call
+- self.await_args_list.append(_call)
++ effect = self.side_effect
++ if effect is not None:
++ if _is_exception(effect):
++ raise effect
++ elif not _callable(effect):
++ try:
++ result = next(effect)
++ except StopIteration:
++ # It is impossible to propogate a StopIteration
++ # through coroutines because of PEP 479
++ raise StopAsyncIteration
++ if _is_exception(result):
++ raise result
++ elif asyncio.iscoroutinefunction(effect):
++ result = await effect(*args, **kwargs)
++ else:
++ result = effect(*args, **kwargs)
+
+- return await proxy()
++ if result is not DEFAULT:
++ return result
++
++ if self._mock_return_value is not DEFAULT:
++ return self.return_value
++
++ if self._mock_wraps is not None:
++ if asyncio.iscoroutinefunction(self._mock_wraps):
++ return await self._mock_wraps(*args, **kwargs)
++ return self._mock_wraps(*args, **kwargs)
++
++ return self.return_value
+
+ def assert_awaited(self):
+ """
+@@ -2852,10 +2868,6 @@ def seal(mock):
+ seal(m)
+
+
+-async def _raise(exception):
+- raise exception
+-
+-
+ class _AsyncIterator:
+ """
+ Wraps an iterator in an asynchronous iterator.
+diff --git a/Lib/unittest/test/testmock/testasync.py b/Lib/unittest/test/testmock/testasync.py
+index 7671d55a8c..be8e3117c4 100644
+--- a/Lib/unittest/test/testmock/testasync.py
++++ b/Lib/unittest/test/testmock/testasync.py
+@@ -353,42 +353,84 @@ class AsyncSpecSetTest(unittest.TestCase):
+ self.assertIsInstance(cm, MagicMock)
+
+
+-class AsyncArguments(unittest.TestCase):
+- def test_add_return_value(self):
++class AsyncArguments(unittest.IsolatedAsyncioTestCase):
++ async def test_add_return_value(self):
+ async def addition(self, var):
+ return var + 1
+
+ mock = AsyncMock(addition, return_value=10)
+- output = asyncio.run(mock(5))
++ output = await mock(5)
+
+ self.assertEqual(output, 10)
+
+- def test_add_side_effect_exception(self):
++ async def test_add_side_effect_exception(self):
+ async def addition(var):
+ return var + 1
+ mock = AsyncMock(addition, side_effect=Exception('err'))
+ with self.assertRaises(Exception):
+- asyncio.run(mock(5))
++ await mock(5)
+
+- def test_add_side_effect_function(self):
++ async def test_add_side_effect_function(self):
+ async def addition(var):
+ return var + 1
+ mock = AsyncMock(side_effect=addition)
+- result = asyncio.run(mock(5))
++ result = await mock(5)
+ self.assertEqual(result, 6)
+
+- def test_add_side_effect_iterable(self):
++ async def test_add_side_effect_iterable(self):
+ vals = [1, 2, 3]
+ mock = AsyncMock(side_effect=vals)
+ for item in vals:
+- self.assertEqual(item, asyncio.run(mock()))
+-
+- with self.assertRaises(RuntimeError) as e:
+- asyncio.run(mock())
+- self.assertEqual(
+- e.exception,
+- RuntimeError('coroutine raised StopIteration')
+- )
++ self.assertEqual(item, await mock())
++
++ with self.assertRaises(StopAsyncIteration) as e:
++ await mock()
++
++ async def test_return_value_AsyncMock(self):
++ value = AsyncMock(return_value=10)
++ mock = AsyncMock(return_value=value)
++ result = await mock()
++ self.assertIs(result, value)
++
++ async def test_return_value_awaitable(self):
++ fut = asyncio.Future()
++ fut.set_result(None)
++ mock = AsyncMock(return_value=fut)
++ result = await mock()
++ self.assertIsInstance(result, asyncio.Future)
++
++ async def test_side_effect_awaitable_values(self):
++ fut = asyncio.Future()
++ fut.set_result(None)
++
++ mock = AsyncMock(side_effect=[fut])
++ result = await mock()
++ self.assertIsInstance(result, asyncio.Future)
++
++ with self.assertRaises(StopAsyncIteration):
++ await mock()
++
++ async def test_side_effect_is_AsyncMock(self):
++ effect = AsyncMock(return_value=10)
++ mock = AsyncMock(side_effect=effect)
++
++ result = await mock()
++ self.assertEqual(result, 10)
++
++ async def test_wraps_coroutine(self):
++ value = asyncio.Future()
++
++ ran = False
++ async def inner():
++ nonlocal ran
++ ran = True
++ return value
++
++ mock = AsyncMock(wraps=inner)
++ result = await mock()
++ self.assertEqual(result, value)
++ mock.assert_awaited()
++ self.assertTrue(ran)
+
+ class AsyncMagicMethods(unittest.TestCase):
+ def test_async_magic_methods_return_async_mocks(self):
+diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py
+index b6608783a8..d497925b94 100644
+--- a/Lib/urllib/parse.py
++++ b/Lib/urllib/parse.py
+@@ -431,31 +431,11 @@ def urlsplit(url, scheme='', allow_fragments=True):
+ netloc = query = fragment = ''
+ i = url.find(':')
+ if i > 0:
+- if url[:i] == 'http': # optimize the common case
+- url = url[i+1:]
+- if url[:2] == '//':
+- netloc, url = _splitnetloc(url, 2)
+- if (('[' in netloc and ']' not in netloc) or
+- (']' in netloc and '[' not in netloc)):
+- raise ValueError("Invalid IPv6 URL")
+- if allow_fragments and '#' in url:
+- url, fragment = url.split('#', 1)
+- if '?' in url:
+- url, query = url.split('?', 1)
+- _checknetloc(netloc)
+- v = SplitResult('http', netloc, url, query, fragment)
+- _parse_cache[key] = v
+- return _coerce_result(v)
+ for c in url[:i]:
+ if c not in scheme_chars:
+ break
+ else:
+- # make sure "url" is not actually a port number (in which case
+- # "scheme" is really part of the path)
+- rest = url[i+1:]
+- if not rest or any(c not in '0123456789' for c in rest):
+- # not a port number
+- scheme, url = url[:i].lower(), rest
++ scheme, url = url[:i].lower(), url[i+1:]
+
+ if url[:2] == '//':
+ netloc, url = _splitnetloc(url, 2)
+diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
+index 92c6a5d015..51c4759629 100644
+--- a/Lib/urllib/request.py
++++ b/Lib/urllib/request.py
+@@ -1144,7 +1144,9 @@ class AbstractDigestAuthHandler:
+ A2 = "%s:%s" % (req.get_method(),
+ # XXX selector: what about proxies and full urls
+ req.selector)
+- if qop == 'auth':
++ # NOTE: As per RFC 2617, when server sends "auth,auth-int", the client could use either `auth`
++ # or `auth-int` to the response back. we use `auth` to send the response back.
++ if 'auth' in qop.split(','):
+ if nonce == self.last_nonce:
+ self.nonce_count += 1
+ else:
+@@ -1152,7 +1154,7 @@ class AbstractDigestAuthHandler:
+ self.last_nonce = nonce
+ ncvalue = '%08x' % self.nonce_count
+ cnonce = self.get_cnonce(nonce)
+- noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, H(A2))
++ noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, 'auth', H(A2))
+ respdig = KD(H(A1), noncebit)
+ elif qop is None:
+ respdig = KD(H(A1), "%s:%s" % (nonce, H(A2)))
+diff --git a/Lib/wave.py b/Lib/wave.py
+index f155879a9a..823f091dea 100644
+--- a/Lib/wave.py
++++ b/Lib/wave.py
+@@ -53,7 +53,7 @@ This returns an instance of a class with the following public methods:
+ -- set all parameters at once
+ tell() -- return current position in output file
+ writeframesraw(data)
+- -- write audio frames without pathing up the
++ -- write audio frames without patching up the
+ file header
+ writeframes(data)
+ -- write audio frames and patch up the file header
+diff --git a/Lib/zipfile.py b/Lib/zipfile.py
+index 59435064ea..8b99c1189b 100644
+--- a/Lib/zipfile.py
++++ b/Lib/zipfile.py
+@@ -480,14 +480,26 @@ class ZipInfo (object):
+
+ # ZIP64 extension (large files and/or large archives)
+ if self.file_size in (0xffffffffffffffff, 0xffffffff):
++ if len(counts) <= idx:
++ raise BadZipFile(
++ "Corrupt zip64 extra field. File size not found."
++ )
+ self.file_size = counts[idx]
+ idx += 1
+
+ if self.compress_size == 0xFFFFFFFF:
++ if len(counts) <= idx:
++ raise BadZipFile(
++ "Corrupt zip64 extra field. Compress size not found."
++ )
+ self.compress_size = counts[idx]
+ idx += 1
+
+ if self.header_offset == 0xffffffff:
++ if len(counts) <= idx:
++ raise BadZipFile(
++ "Corrupt zip64 extra field. Header offset not found."
++ )
+ old = self.header_offset
+ self.header_offset = counts[idx]
+ idx+=1
+@@ -792,10 +804,10 @@ class ZipExtFile(io.BufferedIOBase):
+ # Chunk size to read during seek
+ MAX_SEEK_READ = 1 << 24
+
+- def __init__(self, fileobj, mode, zipinfo, decrypter=None,
++ def __init__(self, fileobj, mode, zipinfo, pwd=None,
+ close_fileobj=False):
+ self._fileobj = fileobj
+- self._decrypter = decrypter
++ self._pwd = pwd
+ self._close_fileobj = close_fileobj
+
+ self._compress_type = zipinfo.compress_type
+@@ -810,11 +822,6 @@ class ZipExtFile(io.BufferedIOBase):
+
+ self.newlines = None
+
+- # Adjust read size for encrypted files since the first 12 bytes
+- # are for the encryption/password information.
+- if self._decrypter is not None:
+- self._compress_left -= 12
+-
+ self.mode = mode
+ self.name = zipinfo.filename
+
+@@ -835,6 +842,30 @@ class ZipExtFile(io.BufferedIOBase):
+ except AttributeError:
+ pass
+
++ self._decrypter = None
++ if pwd:
++ if zipinfo.flag_bits & 0x8:
++ # compare against the file type from extended local headers
++ check_byte = (zipinfo._raw_time >> 8) & 0xff
++ else:
++ # compare against the CRC otherwise
++ check_byte = (zipinfo.CRC >> 24) & 0xff
++ h = self._init_decrypter()
++ if h != check_byte:
++ raise RuntimeError("Bad password for file %r" % zipinfo.orig_filename)
++
++
++ def _init_decrypter(self):
++ self._decrypter = _ZipDecrypter(self._pwd)
++ # The first 12 bytes in the cypher stream is an encryption header
++ # used to strengthen the algorithm. The first 11 bytes are
++ # completely random, while the 12th contains the MSB of the CRC,
++ # or the MSB of the file time depending on the header type
++ # and is used to check the correctness of the password.
++ header = self._fileobj.read(12)
++ self._compress_left -= 12
++ return self._decrypter(header)[11]
++
+ def __repr__(self):
+ result = ['<%s.%s' % (self.__class__.__module__,
+ self.__class__.__qualname__)]
+@@ -1061,6 +1092,8 @@ class ZipExtFile(io.BufferedIOBase):
+ self._decompressor = _get_decompressor(self._compress_type)
+ self._eof = False
+ read_offset = new_pos
++ if self._decrypter is not None:
++ self._init_decrypter()
+
+ while read_offset > 0:
+ read_len = min(self.MAX_SEEK_READ, read_offset)
+@@ -1524,32 +1557,16 @@ class ZipFile:
+
+ # check for encrypted flag & handle password
+ is_encrypted = zinfo.flag_bits & 0x1
+- zd = None
+ if is_encrypted:
+ if not pwd:
+ pwd = self.pwd
+ if not pwd:
+ raise RuntimeError("File %r is encrypted, password "
+ "required for extraction" % name)
++ else:
++ pwd = None
+
+- zd = _ZipDecrypter(pwd)
+- # The first 12 bytes in the cypher stream is an encryption header
+- # used to strengthen the algorithm. The first 11 bytes are
+- # completely random, while the 12th contains the MSB of the CRC,
+- # or the MSB of the file time depending on the header type
+- # and is used to check the correctness of the password.
+- header = zef_file.read(12)
+- h = zd(header[0:12])
+- if zinfo.flag_bits & 0x8:
+- # compare against the file type from extended local headers
+- check_byte = (zinfo._raw_time >> 8) & 0xff
+- else:
+- # compare against the CRC otherwise
+- check_byte = (zinfo.CRC >> 24) & 0xff
+- if h[11] != check_byte:
+- raise RuntimeError("Bad password for file %r" % name)
+-
+- return ZipExtFile(zef_file, mode, zinfo, zd, True)
++ return ZipExtFile(zef_file, mode, zinfo, pwd, True)
+ except:
+ zef_file.close()
+ raise
+diff --git a/Mac/BuildScript/resources/License.rtf b/Mac/BuildScript/resources/License.rtf
+index 86e54f6662..7566cf3b44 100644
+--- a/Mac/BuildScript/resources/License.rtf
++++ b/Mac/BuildScript/resources/License.rtf
+@@ -16,7 +16,7 @@ Python was created in the early 1990s by Guido van Rossum at Stichting Mathemati
+ \
+ In 1995, Guido continued his work on Python at the Corporation for National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) in Reston, Virginia where he released several versions of the software.\
+ \
+-In May 2000, Guido and the Python core development team moved to BeOpen.com to form the BeOpen PythonLabs team. In October of the same year, the PythonLabs team moved to Digital Creations (now Zope Corporation, see http://www.zope.com). In 2001, the Python Software Foundation (PSF, see http://www.python.org/psf/) was formed, a non-profit organization created specifically to own Python-related Intellectual Property. Zope Corporation is a sponsoring member of the PSF.\
++In May 2000, Guido and the Python core development team moved to BeOpen.com to form the BeOpen PythonLabs team. In October of the same year, the PythonLabs team moved to Digital Creations (now Zope Corporation, see http://www.zope.org). In 2001, the Python Software Foundation (PSF, see http://www.python.org/psf/) was formed, a non-profit organization created specifically to own Python-related Intellectual Property. Zope Corporation is a sponsoring member of the PSF.\
+ \
+ All Python releases are Open Source (see http://www.opensource.org for the Open Source Definition). Historically, most, but not all, Python releases have also been GPL-compatible; the table below summarizes the various releases.\
+ \
+diff --git a/Misc/ACKS b/Misc/ACKS
+index 406009c4e2..e52ae984f1 100644
+--- a/Misc/ACKS
++++ b/Misc/ACKS
+@@ -250,6 +250,7 @@ Zach Byrne
+ Vedran Čačić
+ Nicolas Cadou
+ Jp Calderone
++Ben Caller
+ Arnaud Calmettes
+ Daniel Calvelo
+ Tony Campbell
+@@ -901,6 +902,7 @@ Steven Kryskalla
+ Andrew Kuchling
+ Dave Kuhlman
+ Jon Kuhn
++Ilya Kulakov
+ Upendra Kumar
+ Toshio Kuratomi
+ Ilia Kurenkov
+diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
+index 5261ed3d4c..d5f845ef0b 100644
+--- a/Modules/_asynciomodule.c
++++ b/Modules/_asynciomodule.c
+@@ -1092,6 +1092,7 @@ static PyObject *
+ _asyncio_Future_get_loop_impl(FutureObj *self)
+ /*[clinic end generated code: output=119b6ea0c9816c3f input=cba48c2136c79d1f]*/
+ {
++ ENSURE_FUTURE_ALIVE(self)
+ Py_INCREF(self->fut_loop);
+ return self->fut_loop;
+ }
+@@ -3393,24 +3394,28 @@ PyInit__asyncio(void)
+ Py_INCREF(&FutureType);
+ if (PyModule_AddObject(m, "Future", (PyObject *)&FutureType) < 0) {
+ Py_DECREF(&FutureType);
++ Py_DECREF(m);
+ return NULL;
+ }
+
+ Py_INCREF(&TaskType);
+ if (PyModule_AddObject(m, "Task", (PyObject *)&TaskType) < 0) {
+ Py_DECREF(&TaskType);
++ Py_DECREF(m);
+ return NULL;
+ }
+
+ Py_INCREF(all_tasks);
+ if (PyModule_AddObject(m, "_all_tasks", all_tasks) < 0) {
+ Py_DECREF(all_tasks);
++ Py_DECREF(m);
+ return NULL;
+ }
+
+ Py_INCREF(current_tasks);
+ if (PyModule_AddObject(m, "_current_tasks", current_tasks) < 0) {
+ Py_DECREF(current_tasks);
++ Py_DECREF(m);
+ return NULL;
+ }
+
+diff --git a/Modules/_contextvarsmodule.c b/Modules/_contextvarsmodule.c
+index 71dd7fd8d0..1abcdbfa92 100644
+--- a/Modules/_contextvarsmodule.c
++++ b/Modules/_contextvarsmodule.c
+@@ -52,6 +52,7 @@ PyInit__contextvars(void)
+ (PyObject *)&PyContext_Type) < 0)
+ {
+ Py_DECREF(&PyContext_Type);
++ Py_DECREF(m);
+ return NULL;
+ }
+
+@@ -60,6 +61,7 @@ PyInit__contextvars(void)
+ (PyObject *)&PyContextVar_Type) < 0)
+ {
+ Py_DECREF(&PyContextVar_Type);
++ Py_DECREF(m);
+ return NULL;
+ }
+
+@@ -68,6 +70,7 @@ PyInit__contextvars(void)
+ (PyObject *)&PyContextToken_Type) < 0)
+ {
+ Py_DECREF(&PyContextToken_Type);
++ Py_DECREF(m);
+ return NULL;
+ }
+
+diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
+index 0f11e01e11..347a3656b6 100644
+--- a/Modules/_ctypes/_ctypes.c
++++ b/Modules/_ctypes/_ctypes.c
+@@ -504,6 +504,9 @@ StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isSt
+ Py_DECREF(result);
+ return NULL;
+ }
++ if (!isStruct) {
++ dict->flags |= TYPEFLAG_HASUNION;
++ }
+ /* replace the class dict by our updated stgdict, which holds info
+ about storage requirements of the instances */
+ if (-1 == PyDict_Update((PyObject *)dict, result->tp_dict)) {
+@@ -638,6 +641,12 @@ CDataType_from_buffer(PyObject *type, PyObject *args)
+ return NULL;
+ }
+
++ if (PySys_Audit("ctypes.cdata/buffer", "nnn",
++ (Py_ssize_t)buffer->buf, buffer->len, offset) < 0) {
++ Py_DECREF(mv);
++ return NULL;
++ }
++
+ result = PyCData_AtAddress(type, (char *)buffer->buf + offset);
+ if (result == NULL) {
+ Py_DECREF(mv);
+@@ -688,6 +697,12 @@ CDataType_from_buffer_copy(PyObject *type, PyObject *args)
+ return NULL;
+ }
+
++ if (PySys_Audit("ctypes.cdata/buffer", "nnn",
++ (Py_ssize_t)buffer.buf, buffer.len, offset) < 0) {
++ PyBuffer_Release(&buffer);
++ return NULL;
++ }
++
+ result = GenericPyCData_new((PyTypeObject *)type, NULL, NULL);
+ if (result != NULL) {
+ memcpy(((CDataObject *)result)->b_ptr,
+@@ -711,6 +726,9 @@ CDataType_in_dll(PyObject *type, PyObject *args)
+
+ if (!PyArg_ParseTuple(args, "Os:in_dll", &dll, &name))
+ return NULL;
++ if (PySys_Audit("ctypes.dlsym", "O", args) < 0) {
++ return NULL;
++ }
+
+ obj = PyObject_GetAttrString(dll, "_handle");
+ if (!obj)
+@@ -2383,6 +2401,34 @@ converters_from_argtypes(PyObject *ob)
+ for (i = 0; i < nArgs; ++i) {
+ PyObject *cnv;
+ PyObject *tp = PyTuple_GET_ITEM(ob, i);
++ StgDictObject *stgdict = PyType_stgdict(tp);
++
++ if (stgdict != NULL) {
++ if (stgdict->flags & TYPEFLAG_HASUNION) {
++ Py_DECREF(converters);
++ Py_DECREF(ob);
++ if (!PyErr_Occurred()) {
++ PyErr_Format(PyExc_TypeError,
++ "item %zd in _argtypes_ passes a union by "
++ "value, which is unsupported.",
++ i + 1);
++ }
++ return NULL;
++ }
++ if (stgdict->flags & TYPEFLAG_HASBITFIELD) {
++ Py_DECREF(converters);
++ Py_DECREF(ob);
++ if (!PyErr_Occurred()) {
++ PyErr_Format(PyExc_TypeError,
++ "item %zd in _argtypes_ passes a struct/"
++ "union with a bitfield by value, which is "
++ "unsupported.",
++ i + 1);
++ }
++ return NULL;
++ }
++ }
++
+ if (_PyObject_LookupAttrId(tp, &PyId_from_param, &cnv) <= 0) {
+ Py_DECREF(converters);
+ Py_DECREF(ob);
+@@ -5503,6 +5549,9 @@ create_comerror(void)
+ static PyObject *
+ string_at(const char *ptr, int size)
+ {
++ if (PySys_Audit("ctypes.string_at", "ni", (Py_ssize_t)ptr, size) < 0) {
++ return NULL;
++ }
+ if (size == -1)
+ return PyBytes_FromStringAndSize(ptr, strlen(ptr));
+ return PyBytes_FromStringAndSize(ptr, size);
+@@ -5594,6 +5643,9 @@ static PyObject *
+ wstring_at(const wchar_t *ptr, int size)
+ {
+ Py_ssize_t ssize = size;
++ if (PySys_Audit("ctypes.wstring_at", "nn", (Py_ssize_t)ptr, ssize) < 0) {
++ return NULL;
++ }
+ if (ssize == -1)
+ ssize = wcslen(ptr);
+ return PyUnicode_FromWideChar(ptr, ssize);
+diff --git a/Modules/_ctypes/_ctypes_test.c b/Modules/_ctypes/_ctypes_test.c
+index 19066b31c1..33922082ab 100644
+--- a/Modules/_ctypes/_ctypes_test.c
++++ b/Modules/_ctypes/_ctypes_test.c
+@@ -135,6 +135,119 @@ _testfunc_array_in_struct2a(Test3B in)
+ return result;
+ }
+
++typedef union {
++ long a_long;
++ struct {
++ int an_int;
++ int another_int;
++ } a_struct;
++} Test4;
++
++typedef struct {
++ int an_int;
++ struct {
++ int an_int;
++ Test4 a_union;
++ } nested;
++ int another_int;
++} Test5;
++
++EXPORT(long)
++_testfunc_union_by_value1(Test4 in) {
++ long result = in.a_long + in.a_struct.an_int + in.a_struct.another_int;
++
++ /* As the union/struct are passed by value, changes to them shouldn't be
++ * reflected in the caller.
++ */
++ memset(&in, 0, sizeof(in));
++ return result;
++}
++
++EXPORT(long)
++_testfunc_union_by_value2(Test5 in) {
++ long result = in.an_int + in.nested.an_int;
++
++ /* As the union/struct are passed by value, changes to them shouldn't be
++ * reflected in the caller.
++ */
++ memset(&in, 0, sizeof(in));
++ return result;
++}
++
++EXPORT(long)
++_testfunc_union_by_reference1(Test4 *in) {
++ long result = in->a_long;
++
++ memset(in, 0, sizeof(Test4));
++ return result;
++}
++
++EXPORT(long)
++_testfunc_union_by_reference2(Test4 *in) {
++ long result = in->a_struct.an_int + in->a_struct.another_int;
++
++ memset(in, 0, sizeof(Test4));
++ return result;
++}
++
++EXPORT(long)
++_testfunc_union_by_reference3(Test5 *in) {
++ long result = in->an_int + in->nested.an_int + in->another_int;
++
++ memset(in, 0, sizeof(Test5));
++ return result;
++}
++
++typedef struct {
++ signed int A: 1, B:2, C:3, D:2;
++} Test6;
++
++EXPORT(long)
++_testfunc_bitfield_by_value1(Test6 in) {
++ long result = in.A + in.B + in.C + in.D;
++
++ /* As the struct is passed by value, changes to it shouldn't be
++ * reflected in the caller.
++ */
++ memset(&in, 0, sizeof(in));
++ return result;
++}
++
++EXPORT(long)
++_testfunc_bitfield_by_reference1(Test6 *in) {
++ long result = in->A + in->B + in->C + in->D;
++
++ memset(in, 0, sizeof(Test6));
++ return result;
++}
++
++typedef struct {
++ unsigned int A: 1, B:2, C:3, D:2;
++} Test7;
++
++EXPORT(long)
++_testfunc_bitfield_by_reference2(Test7 *in) {
++ long result = in->A + in->B + in->C + in->D;
++
++ memset(in, 0, sizeof(Test7));
++ return result;
++}
++
++typedef union {
++ signed int A: 1, B:2, C:3, D:2;
++} Test8;
++
++EXPORT(long)
++_testfunc_bitfield_by_value2(Test8 in) {
++ long result = in.A + in.B + in.C + in.D;
++
++ /* As the struct is passed by value, changes to it shouldn't be
++ * reflected in the caller.
++ */
++ memset(&in, 0, sizeof(in));
++ return result;
++}
++
+ EXPORT(void)testfunc_array(int values[4])
+ {
+ printf("testfunc_array %d %d %d %d\n",
+diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c
+index d9bdd98813..77492e650e 100644
+--- a/Modules/_ctypes/callproc.c
++++ b/Modules/_ctypes/callproc.c
+@@ -199,8 +199,9 @@ set_error_internal(PyObject *self, PyObject *args, int index)
+ PyObject *errobj;
+ int *space;
+
+- if (!PyArg_ParseTuple(args, "i", &new_errno))
++ if (!PyArg_ParseTuple(args, "i", &new_errno)) {
+ return NULL;
++ }
+ errobj = _ctypes_get_errobj(&space);
+ if (errobj == NULL)
+ return NULL;
+@@ -213,12 +214,18 @@ set_error_internal(PyObject *self, PyObject *args, int index)
+ static PyObject *
+ get_errno(PyObject *self, PyObject *args)
+ {
++ if (PySys_Audit("ctypes.get_errno", NULL) < 0) {
++ return NULL;
++ }
+ return get_error_internal(self, args, 0);
+ }
+
+ static PyObject *
+ set_errno(PyObject *self, PyObject *args)
+ {
++ if (PySys_Audit("ctypes.set_errno", "O", args) < 0) {
++ return NULL;
++ }
+ return set_error_internal(self, args, 0);
+ }
+
+@@ -227,12 +234,18 @@ set_errno(PyObject *self, PyObject *args)
+ static PyObject *
+ get_last_error(PyObject *self, PyObject *args)
+ {
++ if (PySys_Audit("ctypes.get_last_error", NULL) < 0) {
++ return NULL;
++ }
+ return get_error_internal(self, args, 1);
+ }
+
+ static PyObject *
+ set_last_error(PyObject *self, PyObject *args)
+ {
++ if (PySys_Audit("ctypes.set_last_error", "O", args) < 0) {
++ return NULL;
++ }
+ return set_error_internal(self, args, 1);
+ }
+
+@@ -262,6 +275,11 @@ static WCHAR *FormatError(DWORD code)
+ #ifndef DONT_USE_SEH
+ static void SetException(DWORD code, EXCEPTION_RECORD *pr)
+ {
++ if (PySys_Audit("ctypes.seh_exception", "I", code) < 0) {
++ /* An exception was set by the audit hook */
++ return;
++ }
++
+ /* The 'code' is a normal win32 error code so it could be handled by
+ PyErr_SetFromWindowsErr(). However, for some errors, we have additional
+ information not included in the error code. We handle those here and
+@@ -1427,6 +1445,9 @@ static PyObject *py_dl_sym(PyObject *self, PyObject *args)
+ if (!PyArg_ParseTuple(args, "O&s:dlsym",
+ &_parse_voidp, &handle, &name))
+ return NULL;
++ if (PySys_Audit("ctypes.dlsym/handle", "O", args) < 0) {
++ return NULL;
++ }
+ ptr = ctypes_dlsym((void*)handle, name);
+ if (!ptr) {
+ PyErr_SetString(PyExc_OSError,
+@@ -1454,6 +1475,10 @@ call_function(PyObject *self, PyObject *args)
+ &_parse_voidp, &func,
+ &PyTuple_Type, &arguments))
+ return NULL;
++ if (PySys_Audit("ctypes.call_function", "nO",
++ (Py_ssize_t)func, arguments) < 0) {
++ return NULL;
++ }
+
+ result = _ctypes_callproc((PPROC)func,
+ arguments,
+@@ -1485,6 +1510,10 @@ call_cdeclfunction(PyObject *self, PyObject *args)
+ &_parse_voidp, &func,
+ &PyTuple_Type, &arguments))
+ return NULL;
++ if (PySys_Audit("ctypes.call_function", "nO",
++ (Py_ssize_t)func, arguments) < 0) {
++ return NULL;
++ }
+
+ result = _ctypes_callproc((PPROC)func,
+ arguments,
+@@ -1597,11 +1626,15 @@ static const char addressof_doc[] =
+ static PyObject *
+ addressof(PyObject *self, PyObject *obj)
+ {
+- if (CDataObject_Check(obj))
+- return PyLong_FromVoidPtr(((CDataObject *)obj)->b_ptr);
+- PyErr_SetString(PyExc_TypeError,
+- "invalid type");
+- return NULL;
++ if (!CDataObject_Check(obj)) {
++ PyErr_SetString(PyExc_TypeError,
++ "invalid type");
++ return NULL;
++ }
++ if (PySys_Audit("ctypes.addressof", "(O)", obj) < 0) {
++ return NULL;
++ }
++ return PyLong_FromVoidPtr(((CDataObject *)obj)->b_ptr);
+ }
+
+ static int
+@@ -1615,8 +1648,12 @@ static PyObject *
+ My_PyObj_FromPtr(PyObject *self, PyObject *args)
+ {
+ PyObject *ob;
+- if (!PyArg_ParseTuple(args, "O&:PyObj_FromPtr", converter, &ob))
++ if (!PyArg_ParseTuple(args, "O&:PyObj_FromPtr", converter, &ob)) {
+ return NULL;
++ }
++ if (PySys_Audit("ctypes.PyObj_FromPtr", "(O)", ob) < 0) {
++ return NULL;
++ }
+ Py_INCREF(ob);
+ return ob;
+ }
+diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h
+index 5d3b966338..e58f85233c 100644
+--- a/Modules/_ctypes/ctypes.h
++++ b/Modules/_ctypes/ctypes.h
+@@ -288,6 +288,8 @@ PyObject *_ctypes_callproc(PPROC pProc,
+
+ #define TYPEFLAG_ISPOINTER 0x100
+ #define TYPEFLAG_HASPOINTER 0x200
++#define TYPEFLAG_HASUNION 0x400
++#define TYPEFLAG_HASBITFIELD 0x800
+
+ #define DICTFLAG_FINAL 0x1000
+
+diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c
+index 97bcf5539a..1d45ade5ef 100644
+--- a/Modules/_ctypes/stgdict.c
++++ b/Modules/_ctypes/stgdict.c
+@@ -440,6 +440,13 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct
+ PyMem_Free(stgdict->ffi_type_pointer.elements);
+
+ basedict = PyType_stgdict((PyObject *)((PyTypeObject *)type)->tp_base);
++ if (basedict) {
++ stgdict->flags |= (basedict->flags &
++ (TYPEFLAG_HASUNION | TYPEFLAG_HASBITFIELD));
++ }
++ if (!isStruct) {
++ stgdict->flags |= TYPEFLAG_HASUNION;
++ }
+ if (basedict && !use_broken_old_ctypes_semantics) {
+ size = offset = basedict->size;
+ align = basedict->align;
+@@ -515,8 +522,10 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct
+ stgdict->ffi_type_pointer.elements[ffi_ofs + i] = &dict->ffi_type_pointer;
+ if (dict->flags & (TYPEFLAG_ISPOINTER | TYPEFLAG_HASPOINTER))
+ stgdict->flags |= TYPEFLAG_HASPOINTER;
++ stgdict->flags |= dict->flags & (TYPEFLAG_HASUNION | TYPEFLAG_HASBITFIELD);
+ dict->flags |= DICTFLAG_FINAL; /* mark field type final */
+ if (PyTuple_Size(pair) == 3) { /* bits specified */
++ stgdict->flags |= TYPEFLAG_HASBITFIELD;
+ switch(dict->ffi_type_pointer.type) {
+ case FFI_TYPE_UINT8:
+ case FFI_TYPE_UINT16:
+diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
+index 1513e4e35e..3e5f9c3e0d 100644
+--- a/Modules/_hashopenssl.c
++++ b/Modules/_hashopenssl.c
+@@ -42,7 +42,7 @@
+ #define PY_OPENSSL_HAS_SHAKE 1
+ #endif
+
+-#ifdef NID_blake2b512
++#if defined(NID_blake2b512) && !defined(OPENSSL_NO_BLAKE2)
+ #define PY_OPENSSL_HAS_BLAKE2 1
+ #endif
+
+diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
+index 9166c607e7..482d08f9f2 100644
+--- a/Modules/_io/fileio.c
++++ b/Modules/_io/fileio.c
+@@ -4,6 +4,7 @@
+ #include "Python.h"
+ #include "pycore_object.h"
+ #include "structmember.h"
++#include <stdbool.h>
+ #ifdef HAVE_SYS_TYPES_H
+ #include <sys/types.h>
+ #endif
+@@ -75,7 +76,7 @@ _Py_IDENTIFIER(name);
+ #define PyFileIO_Check(op) (PyObject_TypeCheck((op), &PyFileIO_Type))
+
+ /* Forward declarations */
+-static PyObject* portable_lseek(fileio *self, PyObject *posobj, int whence);
++static PyObject* portable_lseek(fileio *self, PyObject *posobj, int whence, bool suppress_pipe_error);
+
+ int
+ _PyFileIO_closed(PyObject *self)
+@@ -480,7 +481,7 @@ _io_FileIO___init___impl(fileio *self, PyObject *nameobj, const char *mode,
+ /* For consistent behaviour, we explicitly seek to the
+ end of file (otherwise, it might be done only on the
+ first write()). */
+- PyObject *pos = portable_lseek(self, NULL, 2);
++ PyObject *pos = portable_lseek(self, NULL, 2, true);
+ if (pos == NULL)
+ goto error;
+ Py_DECREF(pos);
+@@ -603,7 +604,7 @@ _io_FileIO_seekable_impl(fileio *self)
+ return err_closed();
+ if (self->seekable < 0) {
+ /* portable_lseek() sets the seekable attribute */
+- PyObject *pos = portable_lseek(self, NULL, SEEK_CUR);
++ PyObject *pos = portable_lseek(self, NULL, SEEK_CUR, false);
+ assert(self->seekable >= 0);
+ if (pos == NULL) {
+ PyErr_Clear();
+@@ -870,7 +871,7 @@ _io_FileIO_write_impl(fileio *self, Py_buffer *b)
+
+ /* Cribbed from posix_lseek() */
+ static PyObject *
+-portable_lseek(fileio *self, PyObject *posobj, int whence)
++portable_lseek(fileio *self, PyObject *posobj, int whence, bool suppress_pipe_error)
+ {
+ Py_off_t pos, res;
+ int fd = self->fd;
+@@ -921,8 +922,13 @@ portable_lseek(fileio *self, PyObject *posobj, int whence)
+ self->seekable = (res >= 0);
+ }
+
+- if (res < 0)
+- return PyErr_SetFromErrno(PyExc_OSError);
++ if (res < 0) {
++ if (suppress_pipe_error && errno == ESPIPE) {
++ res = 0;
++ } else {
++ return PyErr_SetFromErrno(PyExc_OSError);
++ }
++ }
+
+ #if defined(HAVE_LARGEFILE_SUPPORT)
+ return PyLong_FromLongLong(res);
+@@ -955,7 +961,7 @@ _io_FileIO_seek_impl(fileio *self, PyObject *pos, int whence)
+ if (self->fd < 0)
+ return err_closed();
+
+- return portable_lseek(self, pos, whence);
++ return portable_lseek(self, pos, whence, false);
+ }
+
+ /*[clinic input]
+@@ -973,7 +979,7 @@ _io_FileIO_tell_impl(fileio *self)
+ if (self->fd < 0)
+ return err_closed();
+
+- return portable_lseek(self, NULL, 1);
++ return portable_lseek(self, NULL, 1, false);
+ }
+
+ #ifdef HAVE_FTRUNCATE
+@@ -1004,7 +1010,7 @@ _io_FileIO_truncate_impl(fileio *self, PyObject *posobj)
+
+ if (posobj == Py_None) {
+ /* Get the current position. */
+- posobj = portable_lseek(self, NULL, 1);
++ posobj = portable_lseek(self, NULL, 1, false);
+ if (posobj == NULL)
+ return NULL;
+ }
+diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
+index cccf924904..b54071669c 100644
+--- a/Modules/_testcapimodule.c
++++ b/Modules/_testcapimodule.c
+@@ -4500,6 +4500,14 @@ test_pyobject_is_freed(const char *test_name, PyObject *op)
+ }
+
+
++static PyObject*
++check_pyobject_null_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
++{
++ PyObject *op = NULL;
++ return test_pyobject_is_freed("check_pyobject_null_is_freed", op);
++}
++
++
+ static PyObject*
+ check_pyobject_uninitialized_is_freed(PyObject *self, PyObject *Py_UNUSED(args))
+ {
+@@ -5268,6 +5276,7 @@ static PyMethodDef TestMethods[] = {
+ {"pymem_api_misuse", pymem_api_misuse, METH_NOARGS},
+ {"pymem_malloc_without_gil", pymem_malloc_without_gil, METH_NOARGS},
+ {"pymem_getallocatorsname", test_pymem_getallocatorsname, METH_NOARGS},
++ {"check_pyobject_null_is_freed", check_pyobject_null_is_freed, METH_NOARGS},
+ {"check_pyobject_uninitialized_is_freed", check_pyobject_uninitialized_is_freed, METH_NOARGS},
+ {"check_pyobject_forbidden_bytes_is_freed", check_pyobject_forbidden_bytes_is_freed, METH_NOARGS},
+ {"check_pyobject_freed_is_freed", check_pyobject_freed_is_freed, METH_NOARGS},
+@@ -6274,11 +6283,14 @@ PyInit__testcapi(void)
+ PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);
+
+ PyModule_AddIntConstant(m, "the_number_three", 3);
++ PyObject *v;
+ #ifdef WITH_PYMALLOC
+- PyModule_AddObject(m, "WITH_PYMALLOC", Py_True);
++ v = Py_True;
+ #else
+- PyModule_AddObject(m, "WITH_PYMALLOC", Py_False);
++ v = Py_False;
+ #endif
++ Py_INCREF(v);
++ PyModule_AddObject(m, "WITH_PYMALLOC", v);
+
+ TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
+ Py_INCREF(TestError);
+diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
+index b622c158a4..a1071e5a58 100644
+--- a/Modules/_tkinter.c
++++ b/Modules/_tkinter.c
+@@ -3549,11 +3549,13 @@ PyInit__tkinter(void)
+ if (!ret && GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
+ str_path = _get_tcl_lib_path();
+ if (str_path == NULL && PyErr_Occurred()) {
++ Py_DECREF(m);
+ return NULL;
+ }
+ if (str_path != NULL) {
+ wcs_path = PyUnicode_AsWideCharString(str_path, NULL);
+ if (wcs_path == NULL) {
++ Py_DECREF(m);
+ return NULL;
+ }
+ SetEnvironmentVariableW(L"TCL_LIBRARY", wcs_path);
+diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c
+index ee32ac29b7..cbcf55f817 100644
+--- a/Modules/_tracemalloc.c
++++ b/Modules/_tracemalloc.c
+@@ -1637,8 +1637,10 @@ PyInit__tracemalloc(void)
+ if (m == NULL)
+ return NULL;
+
+- if (tracemalloc_init() < 0)
++ if (tracemalloc_init() < 0) {
++ Py_DECREF(m);
+ return NULL;
++ }
+
+ return m;
+ }
+diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
+index 26c90a8a59..5289ea0e91 100644
+--- a/Modules/arraymodule.c
++++ b/Modules/arraymodule.c
+@@ -3042,9 +3042,15 @@ array_modexec(PyObject *m)
+ Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
+
+ Py_INCREF((PyObject *)&Arraytype);
+- PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
++ if (PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype) < 0) {
++ Py_DECREF((PyObject *)&Arraytype);
++ return -1;
++ }
+ Py_INCREF((PyObject *)&Arraytype);
+- PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
++ if (PyModule_AddObject(m, "array", (PyObject *)&Arraytype) < 0) {
++ Py_DECREF((PyObject *)&Arraytype);
++ return -1;
++ }
+
+ for (descr=descriptors; descr->typecode != '\0'; descr++) {
+ size++;
+@@ -3055,13 +3061,11 @@ array_modexec(PyObject *m)
+ *p++ = (char)descr->typecode;
+ }
+ typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
+-
+- PyModule_AddObject(m, "typecodes", typecodes);
+-
+- if (PyErr_Occurred()) {
+- Py_DECREF(m);
+- m = NULL;
++ if (PyModule_AddObject(m, "typecodes", typecodes) < 0) {
++ Py_XDECREF(typecodes);
++ return -1;
+ }
++
+ return 0;
+ }
+
+diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
+index 7b325996b2..251d8e08a2 100644
+--- a/Modules/faulthandler.c
++++ b/Modules/faulthandler.c
+@@ -1276,25 +1276,36 @@ PyInit_faulthandler(void)
+ #ifdef MS_WINDOWS
+ /* RaiseException() codes (prefixed by an underscore) */
+ if (PyModule_AddIntConstant(m, "_EXCEPTION_ACCESS_VIOLATION",
+- EXCEPTION_ACCESS_VIOLATION))
+- return NULL;
++ EXCEPTION_ACCESS_VIOLATION)) {
++ goto error;
++ }
+ if (PyModule_AddIntConstant(m, "_EXCEPTION_INT_DIVIDE_BY_ZERO",
+- EXCEPTION_INT_DIVIDE_BY_ZERO))
+- return NULL;
++ EXCEPTION_INT_DIVIDE_BY_ZERO)) {
++ goto error;
++ }
+ if (PyModule_AddIntConstant(m, "_EXCEPTION_STACK_OVERFLOW",
+- EXCEPTION_STACK_OVERFLOW))
+- return NULL;
++ EXCEPTION_STACK_OVERFLOW)) {
++ goto error;
++ }
+
+ /* RaiseException() flags (prefixed by an underscore) */
+ if (PyModule_AddIntConstant(m, "_EXCEPTION_NONCONTINUABLE",
+- EXCEPTION_NONCONTINUABLE))
+- return NULL;
++ EXCEPTION_NONCONTINUABLE)) {
++ goto error;
++ }
+ if (PyModule_AddIntConstant(m, "_EXCEPTION_NONCONTINUABLE_EXCEPTION",
+- EXCEPTION_NONCONTINUABLE_EXCEPTION))
+- return NULL;
++ EXCEPTION_NONCONTINUABLE_EXCEPTION)) {
++ goto error;
++ }
+ #endif
+
+ return m;
++
++#ifdef MS_WINDOWS
++error:
++ Py_DECREF(m);
++ return NULL;
++#endif
+ }
+
+ static int
+diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
+index 8d7d67cb67..5a6a81d813 100644
+--- a/Modules/gcmodule.c
++++ b/Modules/gcmodule.c
+@@ -373,10 +373,9 @@ update_refs(PyGC_Head *containers)
+
+ /* A traversal callback for subtract_refs. */
+ static int
+-visit_decref(PyObject *op, void *data)
++visit_decref(PyObject *op, void *parent)
+ {
+- assert(op != NULL);
+- _PyObject_ASSERT(op, !_PyObject_IsFreed(op));
++ _PyObject_ASSERT(_PyObject_CAST(parent), !_PyObject_IsFreed(op));
+
+ if (PyObject_IS_GC(op)) {
+ PyGC_Head *gc = AS_GC(op);
+@@ -402,10 +401,11 @@ subtract_refs(PyGC_Head *containers)
+ traverseproc traverse;
+ PyGC_Head *gc = GC_NEXT(containers);
+ for (; gc != containers; gc = GC_NEXT(gc)) {
+- traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
++ PyObject *op = FROM_GC(gc);
++ traverse = Py_TYPE(op)->tp_traverse;
+ (void) traverse(FROM_GC(gc),
+ (visitproc)visit_decref,
+- NULL);
++ op);
+ }
+ }
+
+diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
+index b09204d633..7c823434e6 100644
+--- a/Modules/posixmodule.c
++++ b/Modules/posixmodule.c
+@@ -4316,7 +4316,7 @@ os_system_impl(PyObject *module, const Py_UNICODE *command)
+ {
+ long result;
+
+- if (PySys_Audit("system", "(u)", command) < 0) {
++ if (PySys_Audit("os.system", "(u)", command) < 0) {
+ return -1;
+ }
+
+@@ -4343,7 +4343,7 @@ os_system_impl(PyObject *module, PyObject *command)
+ long result;
+ const char *bytes = PyBytes_AsString(command);
+
+- if (PySys_Audit("system", "(O)", command) < 0) {
++ if (PySys_Audit("os.system", "(O)", command) < 0) {
+ return -1;
+ }
+
+diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
+index 3b69fecde2..feeabcb8b4 100644
+--- a/Objects/bytesobject.c
++++ b/Objects/bytesobject.c
+@@ -667,9 +667,6 @@ _PyBytes_FormatEx(const char *format, Py_ssize_t format_len,
+ Py_ssize_t len = 0;
+ char onechar; /* For byte_converter() */
+ Py_ssize_t alloc;
+-#ifdef Py_DEBUG
+- char *before;
+-#endif
+
+ fmt++;
+ if (*fmt == '%') {
+@@ -981,8 +978,8 @@ _PyBytes_FormatEx(const char *format, Py_ssize_t format_len,
+ if (res == NULL)
+ goto error;
+ }
+-#ifdef Py_DEBUG
+- before = res;
++#ifndef NDEBUG
++ char *before = res;
+ #endif
+
+ /* Write the sign if needed */
+@@ -1047,7 +1044,7 @@ _PyBytes_FormatEx(const char *format, Py_ssize_t format_len,
+ }
+ Py_XDECREF(temp);
+
+-#ifdef Py_DEBUG
++#ifndef NDEBUG
+ /* check that we computed the exact size for this write */
+ assert((res - before) == alloc);
+ #endif
+@@ -3225,8 +3222,9 @@ _PyBytesWriter_Init(_PyBytesWriter *writer)
+ {
+ /* Set all attributes before small_buffer to 0 */
+ memset(writer, 0, offsetof(_PyBytesWriter, small_buffer));
+-#ifdef Py_DEBUG
+- memset(writer->small_buffer, 0xCB, sizeof(writer->small_buffer));
++#ifndef NDEBUG
++ memset(writer->small_buffer, PYMEM_CLEANBYTE,
++ sizeof(writer->small_buffer));
+ #endif
+ }
+
+@@ -3263,10 +3261,10 @@ _PyBytesWriter_GetSize(_PyBytesWriter *writer, char *str)
+ return str - start;
+ }
+
+-Py_LOCAL_INLINE(void)
++#ifndef NDEBUG
++Py_LOCAL_INLINE(int)
+ _PyBytesWriter_CheckConsistency(_PyBytesWriter *writer, char *str)
+ {
+-#ifdef Py_DEBUG
+ char *start, *end;
+
+ if (writer->use_small_buffer) {
+@@ -3296,15 +3294,16 @@ _PyBytesWriter_CheckConsistency(_PyBytesWriter *writer, char *str)
+ end = start + writer->allocated;
+ assert(str != NULL);
+ assert(start <= str && str <= end);
+-#endif
++ return 1;
+ }
++#endif
+
+ void*
+ _PyBytesWriter_Resize(_PyBytesWriter *writer, void *str, Py_ssize_t size)
+ {
+ Py_ssize_t allocated, pos;
+
+- _PyBytesWriter_CheckConsistency(writer, str);
++ assert(_PyBytesWriter_CheckConsistency(writer, str));
+ assert(writer->allocated < size);
+
+ allocated = size;
+@@ -3353,14 +3352,15 @@ _PyBytesWriter_Resize(_PyBytesWriter *writer, void *str, Py_ssize_t size)
+ }
+
+ writer->use_small_buffer = 0;
+-#ifdef Py_DEBUG
+- memset(writer->small_buffer, 0xDB, sizeof(writer->small_buffer));
++#ifndef NDEBUG
++ memset(writer->small_buffer, PYMEM_CLEANBYTE,
++ sizeof(writer->small_buffer));
+ #endif
+ }
+ writer->allocated = allocated;
+
+ str = _PyBytesWriter_AsString(writer) + pos;
+- _PyBytesWriter_CheckConsistency(writer, str);
++ assert(_PyBytesWriter_CheckConsistency(writer, str));
+ return str;
+
+ error:
+@@ -3373,7 +3373,7 @@ _PyBytesWriter_Prepare(_PyBytesWriter *writer, void *str, Py_ssize_t size)
+ {
+ Py_ssize_t new_min_size;
+
+- _PyBytesWriter_CheckConsistency(writer, str);
++ assert(_PyBytesWriter_CheckConsistency(writer, str));
+ assert(size >= 0);
+
+ if (size == 0) {
+@@ -3406,7 +3406,7 @@ _PyBytesWriter_Alloc(_PyBytesWriter *writer, Py_ssize_t size)
+ assert(size >= 0);
+
+ writer->use_small_buffer = 1;
+-#ifdef Py_DEBUG
++#ifndef NDEBUG
+ writer->allocated = sizeof(writer->small_buffer) - 1;
+ /* In debug mode, don't use the full small buffer because it is less
+ efficient than bytes and bytearray objects to detect buffer underflow
+@@ -3434,7 +3434,7 @@ _PyBytesWriter_Finish(_PyBytesWriter *writer, void *str)
+ Py_ssize_t size;
+ PyObject *result;
+
+- _PyBytesWriter_CheckConsistency(writer, str);
++ assert(_PyBytesWriter_CheckConsistency(writer, str));
+
+ size = _PyBytesWriter_GetSize(writer, str);
+ if (size == 0 && !writer->use_bytearray) {
+diff --git a/Objects/dictobject.c b/Objects/dictobject.c
+index a6ddf70cd8..76f4fefe09 100644
+--- a/Objects/dictobject.c
++++ b/Objects/dictobject.c
+@@ -459,23 +459,26 @@ static PyObject *empty_values[1] = { NULL };
+ int
+ _PyDict_CheckConsistency(PyObject *op, int check_content)
+ {
+-#ifndef NDEBUG
+- _PyObject_ASSERT(op, PyDict_Check(op));
++#define CHECK(expr) \
++ do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG(op, Py_STRINGIFY(expr)); } } while (0)
++
++ assert(op != NULL);
++ CHECK(PyDict_Check(op));
+ PyDictObject *mp = (PyDictObject *)op;
+
+ PyDictKeysObject *keys = mp->ma_keys;
+ int splitted = _PyDict_HasSplitTable(mp);
+ Py_ssize_t usable = USABLE_FRACTION(keys->dk_size);
+
+- _PyObject_ASSERT(op, 0 <= mp->ma_used && mp->ma_used <= usable);
+- _PyObject_ASSERT(op, IS_POWER_OF_2(keys->dk_size));
+- _PyObject_ASSERT(op, 0 <= keys->dk_usable && keys->dk_usable <= usable);
+- _PyObject_ASSERT(op, 0 <= keys->dk_nentries && keys->dk_nentries <= usable);
+- _PyObject_ASSERT(op, keys->dk_usable + keys->dk_nentries <= usable);
++ CHECK(0 <= mp->ma_used && mp->ma_used <= usable);
++ CHECK(IS_POWER_OF_2(keys->dk_size));
++ CHECK(0 <= keys->dk_usable && keys->dk_usable <= usable);
++ CHECK(0 <= keys->dk_nentries && keys->dk_nentries <= usable);
++ CHECK(keys->dk_usable + keys->dk_nentries <= usable);
+
+ if (!splitted) {
+ /* combined table */
+- _PyObject_ASSERT(op, keys->dk_refcnt == 1);
++ CHECK(keys->dk_refcnt == 1);
+ }
+
+ if (check_content) {
+@@ -484,7 +487,7 @@ _PyDict_CheckConsistency(PyObject *op, int check_content)
+
+ for (i=0; i < keys->dk_size; i++) {
+ Py_ssize_t ix = dictkeys_get_index(keys, i);
+- _PyObject_ASSERT(op, DKIX_DUMMY <= ix && ix <= usable);
++ CHECK(DKIX_DUMMY <= ix && ix <= usable);
+ }
+
+ for (i=0; i < usable; i++) {
+@@ -494,32 +497,33 @@ _PyDict_CheckConsistency(PyObject *op, int check_content)
+ if (key != NULL) {
+ if (PyUnicode_CheckExact(key)) {
+ Py_hash_t hash = ((PyASCIIObject *)key)->hash;
+- _PyObject_ASSERT(op, hash != -1);
+- _PyObject_ASSERT(op, entry->me_hash == hash);
++ CHECK(hash != -1);
++ CHECK(entry->me_hash == hash);
+ }
+ else {
+ /* test_dict fails if PyObject_Hash() is called again */
+- _PyObject_ASSERT(op, entry->me_hash != -1);
++ CHECK(entry->me_hash != -1);
+ }
+ if (!splitted) {
+- _PyObject_ASSERT(op, entry->me_value != NULL);
++ CHECK(entry->me_value != NULL);
+ }
+ }
+
+ if (splitted) {
+- _PyObject_ASSERT(op, entry->me_value == NULL);
++ CHECK(entry->me_value == NULL);
+ }
+ }
+
+ if (splitted) {
+ /* splitted table */
+ for (i=0; i < mp->ma_used; i++) {
+- _PyObject_ASSERT(op, mp->ma_values[i] != NULL);
++ CHECK(mp->ma_values[i] != NULL);
+ }
+ }
+ }
+-#endif
+ return 1;
++
++#undef CHECK
+ }
+
+
+@@ -3458,10 +3462,15 @@ dictiter_new(PyDictObject *dict, PyTypeObject *itertype)
+ di->di_dict = dict;
+ di->di_used = dict->ma_used;
+ di->len = dict->ma_used;
+- if ((itertype == &PyDictRevIterKey_Type ||
++ if (itertype == &PyDictRevIterKey_Type ||
+ itertype == &PyDictRevIterItem_Type ||
+- itertype == &PyDictRevIterValue_Type) && dict->ma_used) {
++ itertype == &PyDictRevIterValue_Type) {
++ if (dict->ma_values) {
++ di->di_pos = dict->ma_used - 1;
++ }
++ else {
+ di->di_pos = dict->ma_keys->dk_nentries - 1;
++ }
+ }
+ else {
+ di->di_pos = 0;
+@@ -3831,22 +3840,21 @@ dictreviter_iternext(dictiterobject *di)
+ PyDictKeysObject *k = d->ma_keys;
+ PyObject *key, *value, *result;
+
++ if (i < 0) {
++ goto fail;
++ }
+ if (d->ma_values) {
+- if (i < 0) {
+- goto fail;
+- }
+ key = DK_ENTRIES(k)[i].me_key;
+ value = d->ma_values[i];
+ assert (value != NULL);
+ }
+ else {
+ PyDictKeyEntry *entry_ptr = &DK_ENTRIES(k)[i];
+- while (i >= 0 && entry_ptr->me_value == NULL) {
++ while (entry_ptr->me_value == NULL) {
++ if (--i < 0) {
++ goto fail;
++ }
+ entry_ptr--;
+- i--;
+- }
+- if (i < 0) {
+- goto fail;
+ }
+ key = entry_ptr->me_key;
+ value = entry_ptr->me_value;
+diff --git a/Objects/genobject.c b/Objects/genobject.c
+index 6285219bb2..5643553b70 100644
+--- a/Objects/genobject.c
++++ b/Objects/genobject.c
+@@ -1947,6 +1947,17 @@ async_gen_athrow_throw(PyAsyncGenAThrow *o, PyObject *args)
+ PyErr_SetString(PyExc_RuntimeError, ASYNC_GEN_IGNORED_EXIT_MSG);
+ return NULL;
+ }
++ if (PyErr_ExceptionMatches(PyExc_StopAsyncIteration) ||
++ PyErr_ExceptionMatches(PyExc_GeneratorExit))
++ {
++ /* when aclose() is called we don't want to propagate
++ StopAsyncIteration or GeneratorExit; just raise
++ StopIteration, signalling that this 'aclose()' await
++ is done.
++ */
++ PyErr_Clear();
++ PyErr_SetNone(PyExc_StopIteration);
++ }
+ return retval;
+ }
+ }
+diff --git a/Objects/object.c b/Objects/object.c
+index df2531371f..566593a9c6 100644
+--- a/Objects/object.c
++++ b/Objects/object.c
+@@ -25,13 +25,14 @@ _Py_IDENTIFIER(__isabstractmethod__);
+ int
+ _PyObject_CheckConsistency(PyObject *op, int check_content)
+ {
+- _PyObject_ASSERT(op, op != NULL);
+- _PyObject_ASSERT(op, !_PyObject_IsFreed(op));
+- _PyObject_ASSERT(op, Py_REFCNT(op) >= 1);
++#define CHECK(expr) \
++ do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG(op, Py_STRINGIFY(expr)); } } while (0)
+
+- PyTypeObject *type = op->ob_type;
+- _PyObject_ASSERT(op, type != NULL);
+- _PyType_CheckConsistency(type);
++ CHECK(!_PyObject_IsFreed(op));
++ CHECK(Py_REFCNT(op) >= 1);
++
++ CHECK(op->ob_type != NULL);
++ _PyType_CheckConsistency(op->ob_type);
+
+ if (PyUnicode_Check(op)) {
+ _PyUnicode_CheckConsistency(op, check_content);
+@@ -40,6 +41,8 @@ _PyObject_CheckConsistency(PyObject *op, int check_content)
+ _PyDict_CheckConsistency(op, check_content);
+ }
+ return 1;
++
++#undef CHECK
+ }
+
+
+@@ -463,41 +466,41 @@ _PyObject_IsFreed(PyObject *op)
+ void
+ _PyObject_Dump(PyObject* op)
+ {
+- if (op == NULL) {
+- fprintf(stderr, "<object at NULL>\n");
+- fflush(stderr);
+- return;
+- }
+-
+ if (_PyObject_IsFreed(op)) {
+ /* It seems like the object memory has been freed:
+ don't access it to prevent a segmentation fault. */
+ fprintf(stderr, "<object at %p is freed>\n", op);
++ fflush(stderr);
+ return;
+ }
+
+- PyGILState_STATE gil;
+- PyObject *error_type, *error_value, *error_traceback;
++ /* first, write fields which are the least likely to crash */
++ fprintf(stderr, "object address : %p\n", (void *)op);
++ /* XXX(twouters) cast refcount to long until %zd is
++ universally available */
++ fprintf(stderr, "object refcount : %ld\n", (long)op->ob_refcnt);
++ fflush(stderr);
+
+- fprintf(stderr, "object : ");
++ PyTypeObject *type = Py_TYPE(op);
++ fprintf(stderr, "object type : %p\n", type);
++ fprintf(stderr, "object type name: %s\n",
++ type==NULL ? "NULL" : type->tp_name);
++
++ /* the most dangerous part */
++ fprintf(stderr, "object repr : ");
+ fflush(stderr);
+- gil = PyGILState_Ensure();
+
++ PyGILState_STATE gil = PyGILState_Ensure();
++ PyObject *error_type, *error_value, *error_traceback;
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
++
+ (void)PyObject_Print(op, stderr, 0);
+ fflush(stderr);
+- PyErr_Restore(error_type, error_value, error_traceback);
+
++ PyErr_Restore(error_type, error_value, error_traceback);
+ PyGILState_Release(gil);
+- /* XXX(twouters) cast refcount to long until %zd is
+- universally available */
+- fprintf(stderr, "\n"
+- "type : %s\n"
+- "refcount: %ld\n"
+- "address : %p\n",
+- Py_TYPE(op)==NULL ? "NULL" : Py_TYPE(op)->tp_name,
+- (long)op->ob_refcnt,
+- (void *)op);
++
++ fprintf(stderr, "\n");
+ fflush(stderr);
+ }
+
+@@ -2148,6 +2151,7 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
+ fprintf(stderr, "%s: ", function);
+ }
+ fflush(stderr);
++
+ if (expr) {
+ fprintf(stderr, "Assertion \"%s\" failed", expr);
+ }
+@@ -2155,26 +2159,18 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
+ fprintf(stderr, "Assertion failed");
+ }
+ fflush(stderr);
++
+ if (msg) {
+ fprintf(stderr, ": %s", msg);
+ }
+ fprintf(stderr, "\n");
+ fflush(stderr);
+
+- if (obj == NULL) {
+- fprintf(stderr, "<object at NULL>\n");
+- }
+- else if (_PyObject_IsFreed(obj)) {
++ if (_PyObject_IsFreed(obj)) {
+ /* It seems like the object memory has been freed:
+ don't access it to prevent a segmentation fault. */
+ fprintf(stderr, "<object at %p is freed>\n", obj);
+- }
+- else if (Py_TYPE(obj) == NULL) {
+- fprintf(stderr, "<object at %p: ob_type=NULL>\n", obj);
+- }
+- else if (_PyObject_IsFreed((PyObject *)Py_TYPE(obj))) {
+- fprintf(stderr, "<object at %p: type at %p is freed>\n",
+- obj, (void *)Py_TYPE(obj));
++ fflush(stderr);
+ }
+ else {
+ /* Display the traceback where the object has been allocated.
+@@ -2193,8 +2189,10 @@ _PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
+ /* This might succeed or fail, but we're about to abort, so at least
+ try to provide any extra info we can: */
+ _PyObject_Dump(obj);
++
++ fprintf(stderr, "\n");
++ fflush(stderr);
+ }
+- fflush(stderr);
+
+ Py_FatalError("_PyObject_AssertFailed");
+ }
+diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c
+index f420e19761..bd6480a625 100644
+--- a/Objects/obmalloc.c
++++ b/Objects/obmalloc.c
+@@ -2006,20 +2006,6 @@ _Py_GetAllocatedBlocks(void)
+ * it wraps a real allocator, adding extra debugging info to the memory blocks.
+ */
+
+-/* Special bytes broadcast into debug memory blocks at appropriate times.
+- * Strings of these are unlikely to be valid addresses, floats, ints or
+- * 7-bit ASCII. If modified, _PyMem_IsPtrFreed() should be updated as well.
+- *
+- * Byte patterns 0xCB, 0xBB and 0xFB have been replaced with 0xCD, 0xDD and
+- * 0xFD to use the same values than Windows CRT debug malloc() and free().
+- */
+-#undef CLEANBYTE
+-#undef DEADBYTE
+-#undef FORBIDDENBYTE
+-#define CLEANBYTE 0xCD /* clean (newly allocated) memory */
+-#define DEADBYTE 0xDD /* dead (newly freed) memory */
+-#define FORBIDDENBYTE 0xFD /* untouchable bytes at each end of a block */
+-
+ /* Uncomment this define to add the "serialno" field */
+ /* #define PYMEM_DEBUG_SERIALNO */
+
+@@ -2081,14 +2067,14 @@ p[0: S]
+ p[S]
+ API ID. See PEP 445. This is a character, but seems undocumented.
+ p[S+1: 2*S]
+- Copies of FORBIDDENBYTE. Used to catch under- writes and reads.
++ Copies of PYMEM_FORBIDDENBYTE. Used to catch under- writes and reads.
+ p[2*S: 2*S+n]
+- The requested memory, filled with copies of CLEANBYTE.
++ The requested memory, filled with copies of PYMEM_CLEANBYTE.
+ Used to catch reference to uninitialized memory.
+ &p[2*S] is returned. Note that this is 8-byte aligned if pymalloc
+ handled the request itself.
+ p[2*S+n: 2*S+n+S]
+- Copies of FORBIDDENBYTE. Used to catch over- writes and reads.
++ Copies of PYMEM_FORBIDDENBYTE. Used to catch over- writes and reads.
+ p[2*S+n+S: 2*S+n+2*S]
+ A serial number, incremented by 1 on each call to _PyMem_DebugMalloc
+ and _PyMem_DebugRealloc.
+@@ -2145,15 +2131,15 @@ _PyMem_DebugRawAlloc(int use_calloc, void *ctx, size_t nbytes)
+ /* at p, write size (SST bytes), id (1 byte), pad (SST-1 bytes) */
+ write_size_t(p, nbytes);
+ p[SST] = (uint8_t)api->api_id;
+- memset(p + SST + 1, FORBIDDENBYTE, SST-1);
++ memset(p + SST + 1, PYMEM_FORBIDDENBYTE, SST-1);
+
+ if (nbytes > 0 && !use_calloc) {
+- memset(data, CLEANBYTE, nbytes);
++ memset(data, PYMEM_CLEANBYTE, nbytes);
+ }
+
+ /* at tail, write pad (SST bytes) and serialno (SST bytes) */
+ tail = data + nbytes;
+- memset(tail, FORBIDDENBYTE, SST);
++ memset(tail, PYMEM_FORBIDDENBYTE, SST);
+ #ifdef PYMEM_DEBUG_SERIALNO
+ write_size_t(tail + SST, serialno);
+ #endif
+@@ -2179,7 +2165,7 @@ _PyMem_DebugRawCalloc(void *ctx, size_t nelem, size_t elsize)
+
+ /* The debug free first checks the 2*SST bytes on each end for sanity (in
+ particular, that the FORBIDDENBYTEs with the api ID are still intact).
+- Then fills the original bytes with DEADBYTE.
++ Then fills the original bytes with PYMEM_DEADBYTE.
+ Then calls the underlying free.
+ */
+ static void
+@@ -2197,7 +2183,7 @@ _PyMem_DebugRawFree(void *ctx, void *p)
+ _PyMem_DebugCheckAddress(api->api_id, p);
+ nbytes = read_size_t(q);
+ nbytes += PYMEM_DEBUG_EXTRA_BYTES;
+- memset(q, DEADBYTE, nbytes);
++ memset(q, PYMEM_DEADBYTE, nbytes);
+ api->alloc.free(api->alloc.ctx, q);
+ }
+
+@@ -2239,14 +2225,14 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes)
+ */
+ if (original_nbytes <= sizeof(save)) {
+ memcpy(save, data, original_nbytes);
+- memset(data - 2 * SST, DEADBYTE,
++ memset(data - 2 * SST, PYMEM_DEADBYTE,
+ original_nbytes + PYMEM_DEBUG_EXTRA_BYTES);
+ }
+ else {
+ memcpy(save, data, ERASED_SIZE);
+- memset(head, DEADBYTE, ERASED_SIZE + 2 * SST);
++ memset(head, PYMEM_DEADBYTE, ERASED_SIZE + 2 * SST);
+ memcpy(&save[ERASED_SIZE], tail - ERASED_SIZE, ERASED_SIZE);
+- memset(tail - ERASED_SIZE, DEADBYTE,
++ memset(tail - ERASED_SIZE, PYMEM_DEADBYTE,
+ ERASED_SIZE + PYMEM_DEBUG_EXTRA_BYTES - 2 * SST);
+ }
+
+@@ -2268,10 +2254,10 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes)
+
+ write_size_t(head, nbytes);
+ head[SST] = (uint8_t)api->api_id;
+- memset(head + SST + 1, FORBIDDENBYTE, SST-1);
++ memset(head + SST + 1, PYMEM_FORBIDDENBYTE, SST-1);
+
+ tail = data + nbytes;
+- memset(tail, FORBIDDENBYTE, SST);
++ memset(tail, PYMEM_FORBIDDENBYTE, SST);
+ #ifdef PYMEM_DEBUG_SERIALNO
+ write_size_t(tail + SST, block_serialno);
+ #endif
+@@ -2295,7 +2281,8 @@ _PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes)
+
+ if (nbytes > original_nbytes) {
+ /* growing: mark new extra memory clean */
+- memset(data + original_nbytes, CLEANBYTE, nbytes - original_nbytes);
++ memset(data + original_nbytes, PYMEM_CLEANBYTE,
++ nbytes - original_nbytes);
+ }
+
+ return data;
+@@ -2374,7 +2361,7 @@ _PyMem_DebugCheckAddress(char api, const void *p)
+ * the tail could lead to a segfault then.
+ */
+ for (i = SST-1; i >= 1; --i) {
+- if (*(q-i) != FORBIDDENBYTE) {
++ if (*(q-i) != PYMEM_FORBIDDENBYTE) {
+ msg = "bad leading pad byte";
+ goto error;
+ }
+@@ -2383,7 +2370,7 @@ _PyMem_DebugCheckAddress(char api, const void *p)
+ nbytes = read_size_t(q - 2*SST);
+ tail = q + nbytes;
+ for (i = 0; i < SST; ++i) {
+- if (tail[i] != FORBIDDENBYTE) {
++ if (tail[i] != PYMEM_FORBIDDENBYTE) {
+ msg = "bad trailing pad byte";
+ goto error;
+ }
+@@ -2423,7 +2410,7 @@ _PyObject_DebugDumpAddress(const void *p)
+ fprintf(stderr, " The %d pad bytes at p-%d are ", SST-1, SST-1);
+ ok = 1;
+ for (i = 1; i <= SST-1; ++i) {
+- if (*(q-i) != FORBIDDENBYTE) {
++ if (*(q-i) != PYMEM_FORBIDDENBYTE) {
+ ok = 0;
+ break;
+ }
+@@ -2432,11 +2419,11 @@ _PyObject_DebugDumpAddress(const void *p)
+ fputs("FORBIDDENBYTE, as expected.\n", stderr);
+ else {
+ fprintf(stderr, "not all FORBIDDENBYTE (0x%02x):\n",
+- FORBIDDENBYTE);
++ PYMEM_FORBIDDENBYTE);
+ for (i = SST-1; i >= 1; --i) {
+ const uint8_t byte = *(q-i);
+ fprintf(stderr, " at p-%d: 0x%02x", i, byte);
+- if (byte != FORBIDDENBYTE)
++ if (byte != PYMEM_FORBIDDENBYTE)
+ fputs(" *** OUCH", stderr);
+ fputc('\n', stderr);
+ }
+@@ -2451,7 +2438,7 @@ _PyObject_DebugDumpAddress(const void *p)
+ fprintf(stderr, " The %d pad bytes at tail=%p are ", SST, (void *)tail);
+ ok = 1;
+ for (i = 0; i < SST; ++i) {
+- if (tail[i] != FORBIDDENBYTE) {
++ if (tail[i] != PYMEM_FORBIDDENBYTE) {
+ ok = 0;
+ break;
+ }
+@@ -2460,12 +2447,12 @@ _PyObject_DebugDumpAddress(const void *p)
+ fputs("FORBIDDENBYTE, as expected.\n", stderr);
+ else {
+ fprintf(stderr, "not all FORBIDDENBYTE (0x%02x):\n",
+- FORBIDDENBYTE);
++ PYMEM_FORBIDDENBYTE);
+ for (i = 0; i < SST; ++i) {
+ const uint8_t byte = tail[i];
+ fprintf(stderr, " at tail+%d: 0x%02x",
+ i, byte);
+- if (byte != FORBIDDENBYTE)
++ if (byte != PYMEM_FORBIDDENBYTE)
+ fputs(" *** OUCH", stderr);
+ fputc('\n', stderr);
+ }
+diff --git a/Objects/typeobject.c b/Objects/typeobject.c
+index e635b718d6..5df121775a 100644
+--- a/Objects/typeobject.c
++++ b/Objects/typeobject.c
+@@ -137,22 +137,24 @@ skip_signature(const char *doc)
+ int
+ _PyType_CheckConsistency(PyTypeObject *type)
+ {
+-#define ASSERT(expr) _PyObject_ASSERT((PyObject *)type, (expr))
++#define CHECK(expr) \
++ do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG((PyObject *)type, Py_STRINGIFY(expr)); } } while (0)
++
++ CHECK(!_PyObject_IsFreed((PyObject *)type));
+
+ if (!(type->tp_flags & Py_TPFLAGS_READY)) {
+- /* don't check types before PyType_Ready() */
++ /* don't check static types before PyType_Ready() */
+ return 1;
+ }
+
+- ASSERT(!_PyObject_IsFreed((PyObject *)type));
+- ASSERT(Py_REFCNT(type) >= 1);
+- ASSERT(PyType_Check(type));
++ CHECK(Py_REFCNT(type) >= 1);
++ CHECK(PyType_Check(type));
+
+- ASSERT(!(type->tp_flags & Py_TPFLAGS_READYING));
+- ASSERT(type->tp_dict != NULL);
++ CHECK(!(type->tp_flags & Py_TPFLAGS_READYING));
++ CHECK(type->tp_dict != NULL);
+
+ return 1;
+-#undef ASSERT
++#undef CHECK
+ }
+
+ static const char *
+diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
+index 9eef05a621..0556eff8d0 100644
+--- a/Objects/unicodeobject.c
++++ b/Objects/unicodeobject.c
+@@ -442,65 +442,63 @@ PyUnicode_GetMax(void)
+ int
+ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
+ {
++#define CHECK(expr) \
++ do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG(op, Py_STRINGIFY(expr)); } } while (0)
++
+ PyASCIIObject *ascii;
+ unsigned int kind;
+
+- _PyObject_ASSERT(op, PyUnicode_Check(op));
++ assert(op != NULL);
++ CHECK(PyUnicode_Check(op));
+
+ ascii = (PyASCIIObject *)op;
+ kind = ascii->state.kind;
+
+ if (ascii->state.ascii == 1 && ascii->state.compact == 1) {
+- _PyObject_ASSERT(op, kind == PyUnicode_1BYTE_KIND);
+- _PyObject_ASSERT(op, ascii->state.ready == 1);
++ CHECK(kind == PyUnicode_1BYTE_KIND);
++ CHECK(ascii->state.ready == 1);
+ }
+ else {
+ PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
+-#ifndef NDEBUG
+ void *data;
+-#endif
+
+ if (ascii->state.compact == 1) {
+-#ifndef NDEBUG
+ data = compact + 1;
+-#endif
+- _PyObject_ASSERT(op, kind == PyUnicode_1BYTE_KIND
++ CHECK(kind == PyUnicode_1BYTE_KIND
+ || kind == PyUnicode_2BYTE_KIND
+ || kind == PyUnicode_4BYTE_KIND);
+- _PyObject_ASSERT(op, ascii->state.ascii == 0);
+- _PyObject_ASSERT(op, ascii->state.ready == 1);
+- _PyObject_ASSERT(op, compact->utf8 != data);
++ CHECK(ascii->state.ascii == 0);
++ CHECK(ascii->state.ready == 1);
++ CHECK(compact->utf8 != data);
+ }
+ else {
+-#ifndef NDEBUG
+ PyUnicodeObject *unicode = (PyUnicodeObject *)op;
+
+ data = unicode->data.any;
+-#endif
+ if (kind == PyUnicode_WCHAR_KIND) {
+- _PyObject_ASSERT(op, ascii->length == 0);
+- _PyObject_ASSERT(op, ascii->hash == -1);
+- _PyObject_ASSERT(op, ascii->state.compact == 0);
+- _PyObject_ASSERT(op, ascii->state.ascii == 0);
+- _PyObject_ASSERT(op, ascii->state.ready == 0);
+- _PyObject_ASSERT(op, ascii->state.interned == SSTATE_NOT_INTERNED);
+- _PyObject_ASSERT(op, ascii->wstr != NULL);
+- _PyObject_ASSERT(op, data == NULL);
+- _PyObject_ASSERT(op, compact->utf8 == NULL);
++ CHECK(ascii->length == 0);
++ CHECK(ascii->hash == -1);
++ CHECK(ascii->state.compact == 0);
++ CHECK(ascii->state.ascii == 0);
++ CHECK(ascii->state.ready == 0);
++ CHECK(ascii->state.interned == SSTATE_NOT_INTERNED);
++ CHECK(ascii->wstr != NULL);
++ CHECK(data == NULL);
++ CHECK(compact->utf8 == NULL);
+ }
+ else {
+- _PyObject_ASSERT(op, kind == PyUnicode_1BYTE_KIND
++ CHECK(kind == PyUnicode_1BYTE_KIND
+ || kind == PyUnicode_2BYTE_KIND
+ || kind == PyUnicode_4BYTE_KIND);
+- _PyObject_ASSERT(op, ascii->state.compact == 0);
+- _PyObject_ASSERT(op, ascii->state.ready == 1);
+- _PyObject_ASSERT(op, data != NULL);
++ CHECK(ascii->state.compact == 0);
++ CHECK(ascii->state.ready == 1);
++ CHECK(data != NULL);
+ if (ascii->state.ascii) {
+- _PyObject_ASSERT(op, compact->utf8 == data);
+- _PyObject_ASSERT(op, compact->utf8_length == ascii->length);
++ CHECK(compact->utf8 == data);
++ CHECK(compact->utf8_length == ascii->length);
+ }
+ else
+- _PyObject_ASSERT(op, compact->utf8 != data);
++ CHECK(compact->utf8 != data);
+ }
+ }
+ if (kind != PyUnicode_WCHAR_KIND) {
+@@ -512,16 +510,16 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
+ #endif
+ )
+ {
+- _PyObject_ASSERT(op, ascii->wstr == data);
+- _PyObject_ASSERT(op, compact->wstr_length == ascii->length);
++ CHECK(ascii->wstr == data);
++ CHECK(compact->wstr_length == ascii->length);
+ } else
+- _PyObject_ASSERT(op, ascii->wstr != data);
++ CHECK(ascii->wstr != data);
+ }
+
+ if (compact->utf8 == NULL)
+- _PyObject_ASSERT(op, compact->utf8_length == 0);
++ CHECK(compact->utf8_length == 0);
+ if (ascii->wstr == NULL)
+- _PyObject_ASSERT(op, compact->wstr_length == 0);
++ CHECK(compact->wstr_length == 0);
+ }
+
+ /* check that the best kind is used: O(n) operation */
+@@ -540,23 +538,25 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
+ }
+ if (kind == PyUnicode_1BYTE_KIND) {
+ if (ascii->state.ascii == 0) {
+- _PyObject_ASSERT(op, maxchar >= 128);
+- _PyObject_ASSERT(op, maxchar <= 255);
++ CHECK(maxchar >= 128);
++ CHECK(maxchar <= 255);
+ }
+ else
+- _PyObject_ASSERT(op, maxchar < 128);
++ CHECK(maxchar < 128);
+ }
+ else if (kind == PyUnicode_2BYTE_KIND) {
+- _PyObject_ASSERT(op, maxchar >= 0x100);
+- _PyObject_ASSERT(op, maxchar <= 0xFFFF);
++ CHECK(maxchar >= 0x100);
++ CHECK(maxchar <= 0xFFFF);
+ }
+ else {
+- _PyObject_ASSERT(op, maxchar >= 0x10000);
+- _PyObject_ASSERT(op, maxchar <= MAX_UNICODE);
++ CHECK(maxchar >= 0x10000);
++ CHECK(maxchar <= MAX_UNICODE);
+ }
+- _PyObject_ASSERT(op, PyUnicode_READ(kind, data, ascii->length) == 0);
++ CHECK(PyUnicode_READ(kind, data, ascii->length) == 0);
+ }
+ return 1;
++
++#undef CHECK
+ }
+
+
+diff --git a/PC/layout/main.py b/PC/layout/main.py
+index e598581962..3ca49d08e8 100644
+--- a/PC/layout/main.py
++++ b/PC/layout/main.py
+@@ -216,12 +216,7 @@ def get_layout(ns):
+
+ if ns.include_dev:
+
+- def _c(d):
+- if d.is_dir():
+- return d.name != "internal"
+- return True
+-
+- for dest, src in rglob(ns.source / "Include", "**/*.h", _c):
++ for dest, src in rglob(ns.source / "Include", "**/*.h"):
+ yield "include/{}".format(dest), src
+ src = ns.source / "PC" / "pyconfig.h"
+ yield "include/pyconfig.h", src
+diff --git a/Python/ast.c b/Python/ast.c
+index 79a29a6628..2031b88359 100644
+--- a/Python/ast.c
++++ b/Python/ast.c
+@@ -1747,8 +1747,10 @@ ast_for_decorator(struct compiling *c, const node *n)
+ name_expr = NULL;
+ }
+ else if (NCH(n) == 5) { /* Call with no arguments */
+- d = Call(name_expr, NULL, NULL, LINENO(n),
+- n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena);
++ d = Call(name_expr, NULL, NULL,
++ name_expr->lineno, name_expr->col_offset,
++ CHILD(n, 3)->n_end_lineno, CHILD(n, 3)->n_end_col_offset,
++ c->c_arena);
+ if (!d)
+ return NULL;
+ name_expr = NULL;
+diff --git a/Python/compile.c b/Python/compile.c
+index a512e9cbd1..f09e99fd4a 100644
+--- a/Python/compile.c
++++ b/Python/compile.c
+@@ -2736,7 +2736,15 @@ compiler_while(struct compiler *c, stmt_ty s)
+
+ if (constant == 0) {
+ BEGIN_DO_NOT_EMIT_BYTECODE
++ // Push a dummy block so the VISIT_SEQ knows that we are
++ // inside a while loop so it can correctly evaluate syntax
++ // errors.
++ if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL)) {
++ return 0;
++ }
+ VISIT_SEQ(c, stmt, s->v.While.body);
++ // Remove the dummy block now that is not needed.
++ compiler_pop_fblock(c, WHILE_LOOP, NULL);
+ END_DO_NOT_EMIT_BYTECODE
+ if (s->v.While.orelse) {
+ VISIT_SEQ(c, stmt, s->v.While.orelse);
+diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
+index 3e9e9ba086..7c4ecf0b3e 100644
+--- a/Python/formatter_unicode.c
++++ b/Python/formatter_unicode.c
+@@ -590,7 +590,7 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
+ spec->n_remainder + spec->n_rpadding;
+ }
+
+-/* Fill in the digit parts of a numbers's string representation,
++/* Fill in the digit parts of a number's string representation,
+ as determined in calc_number_widths().
+ Return -1 on error, or 0 on success. */
+ static int
+diff --git a/Python/getargs.c b/Python/getargs.c
+index c65530d859..c1b7b1a275 100644
+--- a/Python/getargs.c
++++ b/Python/getargs.c
+@@ -1199,7 +1199,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
+ trailing 0-byte
+
+ */
+- FETCH_SIZE;
++ int *q = NULL; Py_ssize_t *q2 = NULL;
++ if (flags & FLAG_SIZE_T) {
++ q2 = va_arg(*p_va, Py_ssize_t*);
++ }
++ else {
++ if (PyErr_WarnEx(PyExc_DeprecationWarning,
++ "PY_SSIZE_T_CLEAN will be required for '#' formats", 1))
++ {
++ Py_DECREF(s);
++ return NULL;
++ }
++ q = va_arg(*p_va, int*);
++ }
+
+ format++;
+ if (q == NULL && q2 == NULL) {
+@@ -1232,7 +1244,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
+ }
+ }
+ memcpy(*buffer, ptr, size+1);
+- STORE_SIZE(size);
++
++ if (flags & FLAG_SIZE_T) {
++ *q2 = size;
++ }
++ else {
++ if (INT_MAX < size) {
++ Py_DECREF(s);
++ PyErr_SetString(PyExc_OverflowError,
++ "size does not fit in an int");
++ return converterr("", arg, msgbuf, bufsize);
++ }
++ *q = (int)size;
++ }
+ } else {
+ /* Using a 0-terminated buffer:
+
+diff --git a/Python/hamt.c b/Python/hamt.c
+index b3cbf9ac82..38412596a3 100644
+--- a/Python/hamt.c
++++ b/Python/hamt.c
+@@ -6,7 +6,7 @@
+ #include "structmember.h"
+
+ /*
+-This file provides an implemention of an immutable mapping using the
++This file provides an implementation of an immutable mapping using the
+ Hash Array Mapped Trie (or HAMT) datastructure.
+
+ This design allows to have:
+diff --git a/Python/marshal.c b/Python/marshal.c
+index b2daff2c8a..c6a06e8c23 100644
+--- a/Python/marshal.c
++++ b/Python/marshal.c
+@@ -1829,6 +1829,9 @@ PyMarshal_Init(void)
+ PyObject *mod = PyModule_Create(&marshalmodule);
+ if (mod == NULL)
+ return NULL;
+- PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION);
++ if (PyModule_AddIntConstant(mod, "version", Py_MARSHAL_VERSION) < 0) {
++ Py_DECREF(mod);
++ return NULL;
++ }
+ return mod;
+ }
+diff --git a/Python/pythonrun.c b/Python/pythonrun.c
+index f1d946a0b0..c9afa8f8ba 100644
+--- a/Python/pythonrun.c
++++ b/Python/pythonrun.c
+@@ -1648,56 +1648,56 @@ PyOS_CheckStack(void)
+ /* Deprecated C API functions still provided for binary compatibility */
+
+ #undef PyParser_SimpleParseFile
+-node *
++PyAPI_FUNC(node *)
+ PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)
+ {
+ return PyParser_SimpleParseFileFlags(fp, filename, start, 0);
+ }
+
+ #undef PyParser_SimpleParseString
+-node *
++PyAPI_FUNC(node *)
+ PyParser_SimpleParseString(const char *str, int start)
+ {
+ return PyParser_SimpleParseStringFlags(str, start, 0);
+ }
+
+ #undef PyRun_AnyFile
+-int
++PyAPI_FUNC(int)
+ PyRun_AnyFile(FILE *fp, const char *name)
+ {
+ return PyRun_AnyFileExFlags(fp, name, 0, NULL);
+ }
+
+ #undef PyRun_AnyFileEx
+-int
++PyAPI_FUNC(int)
+ PyRun_AnyFileEx(FILE *fp, const char *name, int closeit)
+ {
+ return PyRun_AnyFileExFlags(fp, name, closeit, NULL);
+ }
+
+ #undef PyRun_AnyFileFlags
+-int
++PyAPI_FUNC(int)
+ PyRun_AnyFileFlags(FILE *fp, const char *name, PyCompilerFlags *flags)
+ {
+ return PyRun_AnyFileExFlags(fp, name, 0, flags);
+ }
+
+ #undef PyRun_File
+-PyObject *
++PyAPI_FUNC(PyObject *)
+ PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l)
+ {
+ return PyRun_FileExFlags(fp, p, s, g, l, 0, NULL);
+ }
+
+ #undef PyRun_FileEx
+-PyObject *
++PyAPI_FUNC(PyObject *)
+ PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c)
+ {
+ return PyRun_FileExFlags(fp, p, s, g, l, c, NULL);
+ }
+
+ #undef PyRun_FileFlags
+-PyObject *
++PyAPI_FUNC(PyObject *)
+ PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
+ PyCompilerFlags *flags)
+ {
+@@ -1705,14 +1705,14 @@ PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l,
+ }
+
+ #undef PyRun_SimpleFile
+-int
++PyAPI_FUNC(int)
+ PyRun_SimpleFile(FILE *f, const char *p)
+ {
+ return PyRun_SimpleFileExFlags(f, p, 0, NULL);
+ }
+
+ #undef PyRun_SimpleFileEx
+-int
++PyAPI_FUNC(int)
+ PyRun_SimpleFileEx(FILE *f, const char *p, int c)
+ {
+ return PyRun_SimpleFileExFlags(f, p, c, NULL);
+@@ -1720,28 +1720,28 @@ PyRun_SimpleFileEx(FILE *f, const char *p, int c)
+
+
+ #undef PyRun_String
+-PyObject *
++PyAPI_FUNC(PyObject *)
+ PyRun_String(const char *str, int s, PyObject *g, PyObject *l)
+ {
+ return PyRun_StringFlags(str, s, g, l, NULL);
+ }
+
+ #undef PyRun_SimpleString
+-int
++PyAPI_FUNC(int)
+ PyRun_SimpleString(const char *s)
+ {
+ return PyRun_SimpleStringFlags(s, NULL);
+ }
+
+ #undef Py_CompileString
+-PyObject *
++PyAPI_FUNC(PyObject *)
+ Py_CompileString(const char *str, const char *p, int s)
+ {
+ return Py_CompileStringExFlags(str, p, s, NULL, -1);
+ }
+
+ #undef Py_CompileStringFlags
+-PyObject *
++PyAPI_FUNC(PyObject *)
+ Py_CompileStringFlags(const char *str, const char *p, int s,
+ PyCompilerFlags *flags)
+ {
+@@ -1749,14 +1749,14 @@ Py_CompileStringFlags(const char *str, const char *p, int s,
+ }
+
+ #undef PyRun_InteractiveOne
+-int
++PyAPI_FUNC(int)
+ PyRun_InteractiveOne(FILE *f, const char *p)
+ {
+ return PyRun_InteractiveOneFlags(f, p, NULL);
+ }
+
+ #undef PyRun_InteractiveLoop
+-int
++PyAPI_FUNC(int)
+ PyRun_InteractiveLoop(FILE *f, const char *p)
+ {
+ return PyRun_InteractiveLoopFlags(f, p, NULL);
+diff --git a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp
+index 570798de1a..fbdf7b6424 100644
+--- a/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp
++++ b/Tools/msi/bundle/bootstrap/PythonBootstrapperApplication.cpp
+@@ -3013,8 +3013,8 @@ private:
+ } else if (IsWindowsVersionOrGreater(6, 1, 1)) {
+ HMODULE hKernel32 = GetModuleHandleW(L"kernel32");
+ if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) {
+- BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008 R2 without KB2533625");
+- BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533625 update is required to continue.");
++ BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows Server 2008 R2 without KB2533623");
++ BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533623 update is required to continue.");
+ /* The "MissingSP1" error also specifies updates are required */
+ LocGetString(_wixLoc, L"#(loc.FailureWS2K8R2MissingSP1)", &pLocString);
+ } else {
+@@ -3044,8 +3044,8 @@ private:
+ } else if (IsWindows7SP1OrGreater()) {
+ HMODULE hKernel32 = GetModuleHandleW(L"kernel32");
+ if (hKernel32 && !GetProcAddress(hKernel32, "AddDllDirectory")) {
+- BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 SP1 without KB2533625");
+- BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533625 update is required to continue.");
++ BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "Detected Windows 7 SP1 without KB2533623");
++ BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "KB2533623 update is required to continue.");
+ /* The "MissingSP1" error also specifies updates are required */
+ LocGetString(_wixLoc, L"#(loc.FailureWin7MissingSP1)", &pLocString);
+ } else {
+diff --git a/Tools/msi/doc/doc.wxs b/Tools/msi/doc/doc.wxs
+index 306fb11dc6..cd1a68cc26 100644
+--- a/Tools/msi/doc/doc.wxs
++++ b/Tools/msi/doc/doc.wxs
+@@ -8,7 +8,7 @@
+ <PropertyRef Id="REGISTRYKEY" />
+
+ <Property Id="HHExe" Value="C:\Windows\hh.exe" />
+- <CustomAction Id="SetHHExe" Property="HHCExe" Value='[WindowsFolder]\hh.exe' Execute="immediate" />
++ <CustomAction Id="SetHHExe" Property="HHExe" Value='[WindowsFolder]\hh.exe' Execute="immediate" />
+ <InstallExecuteSequence>
+ <Custom Action="SetHHExe" Before="CostFinalize">1</Custom>
+ </InstallExecuteSequence>
+diff --git a/configure.ac b/configure.ac
+index a189d42c2c..7051dc109a 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -5403,9 +5403,12 @@ AC_LINK_IFELSE(
+ [
+ AC_LANG_SOURCE([[
+ #include <stdatomic.h>
+- atomic_int value = ATOMIC_VAR_INIT(1);
++ atomic_int int_var;
++ atomic_uintptr_t uintptr_var;
+ int main() {
+- int loaded_value = atomic_load(&value);
++ atomic_store_explicit(&int_var, 5, memory_order_relaxed);
++ atomic_store_explicit(&uintptr_var, 0, memory_order_relaxed);
++ int loaded_value = atomic_load_explicit(&int_var, memory_order_seq_cst);
+ return 0;
+ }
+ ]])
+@@ -5415,7 +5418,7 @@ AC_MSG_RESULT($have_stdatomic_h)
+
+ if test "$have_stdatomic_h" = yes; then
+ AC_DEFINE(HAVE_STD_ATOMIC, 1,
+- [Has stdatomic.h with atomic_int])
++ [Has stdatomic.h with atomic_int and atomic_uintptr_t])
+ fi
+
+ # Check for GCC >= 4.7 __atomic builtins
+diff --git a/pyconfig.h.in b/pyconfig.h.in
+index 5f952d2cfc..aaa7b72cac 100644
+--- a/pyconfig.h.in
++++ b/pyconfig.h.in
+@@ -1025,7 +1025,7 @@
+ /* Define to 1 if you have the <stdlib.h> header file. */
+ #undef HAVE_STDLIB_H
+
+-/* Has stdatomic.h with atomic_int */
++/* Has stdatomic.h with atomic_int and atomic_uintptr_t */
+ #undef HAVE_STD_ATOMIC
+
+ /* Define to 1 if you have the `strdup' function. */
diff --git a/debian/patches/hurd_kfreebsd_thread_native_id.diff b/debian/patches/hurd_kfreebsd_thread_native_id.diff
new file mode 100644
index 0000000..1b02cf7
--- /dev/null
+++ b/debian/patches/hurd_kfreebsd_thread_native_id.diff
@@ -0,0 +1,34 @@
+--- a/Include/pythread.h
++++ b/Include/pythread.h
+@@ -26,7 +26,7 @@ PyAPI_FUNC(unsigned long) PyThread_start
+ PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void);
+ PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void);
+
+-#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) || defined(_AIX)
++#if defined(__APPLE__) || defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(_WIN32) || defined(_AIX) || defined(__GNU__)
+ #define PY_HAVE_THREAD_NATIVE_ID
+ PyAPI_FUNC(unsigned long) PyThread_get_thread_native_id(void);
+ #endif
+--- a/Python/thread_pthread.h
++++ b/Python/thread_pthread.h
+@@ -22,6 +22,9 @@
+ # include <sys/thread.h> /* thread_self() */
+ #elif defined(__NetBSD__)
+ # include <lwp.h> /* _lwp_self() */
++#elif defined(__GNU__) || defined(__FreeBSD_kernel__)
++# include <mach.h> /* mach_thread_self(), mach_task_self(),
++ mach_port_deallocate() */
+ #endif
+
+ /* The POSIX spec requires that use of pthread_attr_setstacksize
+@@ -343,6 +346,10 @@ PyThread_get_thread_native_id(void)
+ #elif defined(__NetBSD__)
+ lwpid_t native_id;
+ native_id = _lwp_self();
++#elif defined(__GNU__) || defined(__FreeBSD_kernel__)
++ mach_port_t native_id;
++ native_id = mach_thread_self();
++ mach_port_deallocate(mach_task_self(), mach_thread_self());
+ #endif
+ return (unsigned long) native_id;
+ }
diff --git a/debian/patches/issue35998.diff b/debian/patches/issue35998.diff
deleted file mode 100644
index 51cdd1f..0000000
--- a/debian/patches/issue35998.diff
+++ /dev/null
@@ -1,22 +0,0 @@
---- a/Lib/test/test_asyncio/test_sslproto.py
-+++ b/Lib/test/test_asyncio/test_sslproto.py
-@@ -495,14 +495,11 @@
-
- server_context = test_utils.simple_server_sslcontext()
- client_context = test_utils.simple_client_sslcontext()
-- if (sys.platform.startswith('freebsd')
-- or sys.platform.startswith('win')
-- or sys.platform.startswith('darwin')):
-- # bpo-35031: Some FreeBSD and Windows buildbots fail to run this test
-- # as the eof was not being received by the server if the payload
-- # size is not big enough. This behaviour only appears if the
-- # client is using TLS1.3. Also seen on macOS.
-- client_context.options |= ssl.OP_NO_TLSv1_3
-+ # bpo-35031: Some buildbots fail to run this test as the eof
-+ # was not being received by the server if the payload size is
-+ # not big enough. This behaviour only appears if the client is
-+ # using TLS1.3.
-+ client_context.options |= ssl.OP_NO_TLSv1_3
- answer = None
-
- def client(sock, addr):
diff --git a/debian/patches/langpack-gettext.diff b/debian/patches/langpack-gettext.diff
index c80e300..fc441ef 100644
--- a/debian/patches/langpack-gettext.diff
+++ b/debian/patches/langpack-gettext.diff
@@ -3,11 +3,9 @@
# DP: prefer the newer one
# DP: Upstream status: Ubuntu-Specific
-Index: b/Lib/gettext.py
-===================================================================
--- a/Lib/gettext.py
+++ b/Lib/gettext.py
-@@ -499,11 +499,26 @@ def find(domain, localedir=None, languag
+@@ -563,11 +563,26 @@ def find(domain, localedir=None, languag
if lang == 'C':
break
mofile = os.path.join(localedir, lang, 'LC_MESSAGES', '%s.mo' % domain)
diff --git a/debian/patches/lib-argparse.diff b/debian/patches/lib-argparse.diff
index 28856ff..883bbc6 100644
--- a/debian/patches/lib-argparse.diff
+++ b/debian/patches/lib-argparse.diff
@@ -1,11 +1,9 @@
# DP: argparse.py: Make the gettext import conditional
-Index: b/Lib/argparse.py
-===================================================================
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
-@@ -87,7 +87,16 @@ import os as _os
- import re as _re
+@@ -89,7 +89,16 @@ import re as _re
+ import shutil as _shutil
import sys as _sys
-from gettext import gettext as _, ngettext
diff --git a/debian/patches/lib2to3-no-pickled-grammar.diff b/debian/patches/lib2to3-no-pickled-grammar.diff
index a7cc1ec..a1dd900 100644
--- a/debian/patches/lib2to3-no-pickled-grammar.diff
+++ b/debian/patches/lib2to3-no-pickled-grammar.diff
@@ -1,8 +1,6 @@
-Index: b/Lib/lib2to3/pgen2/driver.py
-===================================================================
--- a/Lib/lib2to3/pgen2/driver.py
+++ b/Lib/lib2to3/pgen2/driver.py
-@@ -120,7 +120,10 @@ def load_grammar(gt="Grammar.txt", gp=No
+@@ -119,7 +119,10 @@ def load_grammar(gt="Grammar.txt", gp=No
if force or not _newer(gp, gt):
logger.info("Generating grammar tables from %s", gt)
g = pgen.generate_grammar(gt)
@@ -14,8 +12,6 @@ Index: b/Lib/lib2to3/pgen2/driver.py
logger.info("Writing grammar tables to %s", gp)
try:
g.dump(gp)
-Index: b/Lib/lib2to3/tests/test_parser.py
-===================================================================
--- a/Lib/lib2to3/tests/test_parser.py
+++ b/Lib/lib2to3/tests/test_parser.py
@@ -38,83 +38,6 @@ class TestDriver(support.TestCase):
diff --git a/debian/patches/link-opt.diff b/debian/patches/link-opt.diff
index 5608d5c..db96d4c 100644
--- a/debian/patches/link-opt.diff
+++ b/debian/patches/link-opt.diff
@@ -2,10 +2,10 @@
--- a/configure.ac
+++ b/configure.ac
-@@ -2611,8 +2611,8 @@ then
+@@ -2592,8 +2592,8 @@ then
fi
;;
- Linux*|GNU*|QNX*)
+ Linux*|GNU*|QNX*|VxWorks*)
- LDSHARED='$(CC) -shared'
- LDCXXSHARED='$(CXX) -shared';;
+ LDSHARED='$(CC) -shared -Wl,-O1 -Wl,-Bsymbolic-functions'
@@ -13,7 +13,7 @@
FreeBSD*)
if [[ "`$CC -dM -E - </dev/null | grep __ELF__`" != "" ]]
then
-@@ -2703,7 +2703,7 @@ then
+@@ -2686,7 +2686,7 @@ then
LINKFORSHARED="-Wl,-E -Wl,+s";;
# LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";;
Linux-android*) LINKFORSHARED="-pie -Xlinker -export-dynamic";;
diff --git a/debian/patches/local-doc-references.diff b/debian/patches/local-doc-references.diff
index 631a1de..d3ba19f 100644
--- a/debian/patches/local-doc-references.diff
+++ b/debian/patches/local-doc-references.diff
@@ -1,22 +1,22 @@
--- a/Doc/tools/templates/layout.html
+++ b/Doc/tools/templates/layout.html
-@@ -50,7 +50,7 @@
+@@ -24,7 +24,7 @@
{% endblock %}
+
{% block extrahead %}
- <link rel="shortcut icon" type="image/png" href="{{ pathto('_static/py.png', 1) }}" />
- <link rel="canonical" href="https://docs.python.org/3/{{pagename}}.html" />
-+ <link rel="canonical" href="file:///usr/share/doc/python3.7/html/{{pagename}}.html" />
++ <link rel="canonical" href="file:///usr/share/doc/python3.8/html/{{pagename}}.html" />
{% if builder != "htmlhelp" %}
- {% if not embedded %}<script type="text/javascript" src="{{ pathto('_static/copybutton.js', 1) }}"></script>{% endif %}
- {% if switchers is defined and not embedded %}<script type="text/javascript" src="{{ pathto('_static/switchers.js', 1) }}"></script>{% endif %}
+ {% if switchers is defined and not embedded %}
+ <script type="text/javascript" src="{{ pathto('_static/switchers.js', 1) }}"></script>{% endif %}
--- a/Lib/idlelib/help.html
+++ b/Lib/idlelib/help.html
-@@ -27,7 +27,7 @@
+@@ -25,7 +25,7 @@
<link rel="copyright" title="Copyright" href="../copyright.html" />
<link rel="next" title="Other Graphical User Interface Packages" href="othergui.html" />
<link rel="prev" title="tkinter.scrolledtext — Scrolled Text Widget" href="tkinter.scrolledtext.html" />
- <link rel="canonical" href="https://docs.python.org/3/library/idle.html" />
-+ <link rel="canonical" href="file:///usr/share/doc/python3.7/html/library/idle.html" />
++ <link rel="canonical" href="file:///usr/share/doc/python3.8/html/library/idle.html" />
diff --git a/debian/patches/locale-module.diff b/debian/patches/locale-module.diff
index a35f0bf..4d378a5 100644
--- a/debian/patches/locale-module.diff
+++ b/debian/patches/locale-module.diff
@@ -2,11 +2,9 @@
# DP: - Don't map 'utf8', 'utf-8' to 'utf', which is not a known encoding
# DP: for glibc.
-Index: b/Lib/locale.py
-===================================================================
--- a/Lib/locale.py
+++ b/Lib/locale.py
-@@ -1403,8 +1403,8 @@ locale_alias = {
+@@ -1407,8 +1407,8 @@ locale_alias = {
'ug_cn': 'ug_CN.UTF-8',
'uk': 'uk_UA.KOI8-U',
'uk_ua': 'uk_UA.KOI8-U',
diff --git a/debian/patches/lto-link-flags.diff b/debian/patches/lto-link-flags.diff
index dcf9d5d..57d5d85 100644
--- a/debian/patches/lto-link-flags.diff
+++ b/debian/patches/lto-link-flags.diff
@@ -1,6 +1,8 @@
+Index: b/Makefile.pre.in
+===================================================================
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -150,7 +150,7 @@ CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$
+@@ -147,7 +147,7 @@ CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$
SHLIB_SUFFIX= @SHLIB_SUFFIX@
EXT_SUFFIX= @EXT_SUFFIX@
LDSHARED= @LDSHARED@ $(PY_LDFLAGS)
@@ -9,7 +11,7 @@
LDCXXSHARED= @LDCXXSHARED@
DESTSHARED= $(BINLIBDEST)/lib-dynload
-@@ -580,7 +580,7 @@ clinic: check-clean-src $(srcdir)/Module
+@@ -577,7 +577,7 @@ clinic: check-clean-src $(srcdir)/Module
# Build the interpreter
$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
diff --git a/debian/patches/mangle-fstack-protector.diff b/debian/patches/mangle-fstack-protector.diff
index 35384c7..ac09d47 100644
--- a/debian/patches/mangle-fstack-protector.diff
+++ b/debian/patches/mangle-fstack-protector.diff
@@ -10,8 +10,8 @@
+import fnmatch
from .errors import DistutilsPlatformError
-
-@@ -216,6 +217,10 @@ def customize_compiler(compiler):
+ from .util import get_platform, get_host_platform
+@@ -214,6 +215,10 @@ def customize_compiler(compiler):
cc = newcc
if 'CXX' in os.environ:
cxx = os.environ['CXX']
diff --git a/debian/patches/multiarch.diff b/debian/patches/multiarch.diff
index cdd5290..76b9a33 100644
--- a/debian/patches/multiarch.diff
+++ b/debian/patches/multiarch.diff
@@ -15,7 +15,7 @@
if os.name == 'posix':
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
-@@ -112,6 +112,9 @@ def get_python_inc(plat_specific=0, pref
+@@ -111,6 +111,9 @@ def get_python_inc(plat_specific=0, pref
incdir = os.path.join(get_config_var('srcdir'), 'Include')
return os.path.normpath(incdir)
python_dir = 'python' + get_python_version() + build_flags
@@ -27,7 +27,7 @@
if python_build:
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -794,6 +794,7 @@ Modules/signalmodule.o: $(srcdir)/Module
+@@ -784,6 +784,7 @@ Modules/signalmodule.o: $(srcdir)/Module
Python/dynload_shlib.o: $(srcdir)/Python/dynload_shlib.c Makefile
$(CC) -c $(PY_CORE_CFLAGS) \
@@ -35,7 +35,7 @@
-DSOABI='"$(SOABI)"' \
-o $@ $(srcdir)/Python/dynload_shlib.c
-@@ -1477,7 +1478,7 @@ inclinstall:
+@@ -1556,7 +1557,7 @@ inclinstall:
LIBPL= @LIBPL@
# pkgconfig directory
diff --git a/debian/patches/platform-lsbrelease.diff b/debian/patches/platform-lsbrelease.diff
deleted file mode 100644
index 83f3df3..0000000
--- a/debian/patches/platform-lsbrelease.diff
+++ /dev/null
@@ -1,50 +0,0 @@
-# DP: Use /etc/lsb-release to identify the platform.
-
---- a/Lib/platform.py
-+++ b/Lib/platform.py
-@@ -299,7 +299,7 @@ _release_version = re.compile(r'([^0-9]+
- _supported_dists = (
- 'SuSE', 'debian', 'fedora', 'redhat', 'centos',
- 'mandrake', 'mandriva', 'rocks', 'slackware', 'yellowdog', 'gentoo',
-- 'UnitedLinux', 'turbolinux', 'arch', 'mageia')
-+ 'UnitedLinux', 'turbolinux', 'arch', 'mageia', 'Ubuntu')
-
- def _parse_release_file(firstline):
-
-@@ -328,6 +328,10 @@ def _parse_release_file(firstline):
- id = l[1]
- return '', version, id
-
-+_distributor_id_file_re = re.compile(r"(?:DISTRIB_ID\s*=)\s*(.*)", re.I)
-+_release_file_re = re.compile(r"(?:DISTRIB_RELEASE\s*=)\s*(.*)", re.I)
-+_codename_file_re = re.compile(r"(?:DISTRIB_CODENAME\s*=)\s*(.*)", re.I)
-+
- def linux_distribution(distname='', version='', id='',
-
- supported_dists=_supported_dists,
-@@ -360,6 +364,25 @@ def _linux_distribution(distname, versio
- args given as parameters.
-
- """
-+ # check for the Debian/Ubuntu /etc/lsb-release file first, needed so
-+ # that the distribution doesn't get identified as Debian.
-+ try:
-+ with open("/etc/lsb-release", "r") as etclsbrel:
-+ for line in etclsbrel:
-+ m = _distributor_id_file_re.search(line)
-+ if m:
-+ _u_distname = m.group(1).strip()
-+ m = _release_file_re.search(line)
-+ if m:
-+ _u_version = m.group(1).strip()
-+ m = _codename_file_re.search(line)
-+ if m:
-+ _u_id = m.group(1).strip()
-+ if _u_distname and _u_version:
-+ return (_u_distname, _u_version, _u_id)
-+ except (EnvironmentError, UnboundLocalError):
-+ pass
-+
- try:
- etc = os.listdir(_UNIXCONFDIR)
- except OSError:
diff --git a/debian/patches/profiled-build.diff b/debian/patches/profiled-build.diff
index b4e67c5..8191d68 100644
--- a/debian/patches/profiled-build.diff
+++ b/debian/patches/profiled-build.diff
@@ -2,7 +2,7 @@
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -504,6 +504,16 @@ build_all_generate_profile:
+@@ -497,6 +497,16 @@ build_all_generate_profile:
run_profile_task:
@ # FIXME: can't run for a cross build
$(LLVM_PROF_FILE) $(RUNSHARED) ./$(BUILDPYTHON) $(PROFILE_TASK) || true
diff --git a/debian/patches/pydoc-use-pager.diff b/debian/patches/pydoc-use-pager.diff
index ca2b49f..6c9ca55 100644
--- a/debian/patches/pydoc-use-pager.diff
+++ b/debian/patches/pydoc-use-pager.diff
@@ -2,7 +2,7 @@
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
-@@ -1473,6 +1473,8 @@ def getpager():
+@@ -1491,6 +1491,8 @@ def getpager():
return plainpager
if sys.platform == 'win32':
return lambda text: tempfilepager(plain(text), 'more <')
diff --git a/debian/patches/reproducible-buildinfo.diff b/debian/patches/reproducible-buildinfo.diff
index 8ee5271..e13cbdd 100644
--- a/debian/patches/reproducible-buildinfo.diff
+++ b/debian/patches/reproducible-buildinfo.diff
@@ -2,7 +2,7 @@
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
-@@ -766,6 +766,8 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \
+@@ -756,6 +756,8 @@ Modules/getbuildinfo.o: $(PARSER_OBJS) \
-DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \
-DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \
-DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \
diff --git a/debian/patches/revert-profile-opt-changes.diff b/debian/patches/revert-profile-opt-changes.diff
deleted file mode 100644
index b66c6ce..0000000
--- a/debian/patches/revert-profile-opt-changes.diff
+++ /dev/null
@@ -1,189 +0,0 @@
---- a/Lib/_osx_support.py
-+++ b/Lib/_osx_support.py
-@@ -17,7 +17,7 @@ __all__ = [
- _UNIVERSAL_CONFIG_VARS = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS', 'BASECFLAGS',
- 'BLDSHARED', 'LDSHARED', 'CC', 'CXX',
- 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS',
-- 'PY_CORE_CFLAGS', 'PY_CORE_LDFLAGS')
-+ 'PY_CORE_CFLAGS')
-
- # configuration variables that may contain compiler calls
- _COMPILER_CONFIG_VARS = ('BLDSHARED', 'LDSHARED', 'CC', 'CXX')
---- a/Lib/test/pythoninfo.py
-+++ b/Lib/test/pythoninfo.py
-@@ -420,10 +420,7 @@ def collect_sysconfig(info_add):
- 'OPT',
- 'PY_CFLAGS',
- 'PY_CFLAGS_NODIST',
-- 'PY_CORE_LDFLAGS',
- 'PY_LDFLAGS',
-- 'PY_LDFLAGS_NODIST',
-- 'PY_STDMODULE_CFLAGS',
- 'Py_DEBUG',
- 'Py_ENABLE_SHARED',
- 'SHELL',
---- a/Lib/test/test__osx_support.py
-+++ b/Lib/test/test__osx_support.py
-@@ -24,7 +24,7 @@ class Test_OSXSupport(unittest.TestCase)
- for cv in ('CFLAGS', 'LDFLAGS', 'CPPFLAGS',
- 'BASECFLAGS', 'BLDSHARED', 'LDSHARED', 'CC',
- 'CXX', 'PY_CFLAGS', 'PY_LDFLAGS', 'PY_CPPFLAGS',
-- 'PY_CORE_CFLAGS', 'PY_CORE_LDFLAGS'):
-+ 'PY_CORE_CFLAGS'):
- if cv in self.env:
- self.env.unset(cv)
-
---- a/Makefile.pre.in
-+++ b/Makefile.pre.in
-@@ -85,10 +85,6 @@ CONFIGURE_CFLAGS= @CFLAGS@
- # Use it when a compiler flag should _not_ be part of the distutils CFLAGS
- # once Python is installed (Issue #21121).
- CONFIGURE_CFLAGS_NODIST=@CFLAGS_NODIST@
--# LDFLAGS_NODIST is used in the same manner as CFLAGS_NODIST.
--# Use it when a linker flag should _not_ be part of the distutils LDFLAGS
--# once Python is installed (bpo-35257)
--CONFIGURE_LDFLAGS_NODIST=@LDFLAGS_NODIST@
- CONFIGURE_CPPFLAGS= @CPPFLAGS@
- CONFIGURE_LDFLAGS= @LDFLAGS@
- # Avoid assigning CFLAGS, LDFLAGS, etc. so users can use them on the
-@@ -101,7 +97,6 @@ PY_CFLAGS_NODIST=$(CONFIGURE_CFLAGS_NODI
- # environment variables
- PY_CPPFLAGS= $(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)
- PY_LDFLAGS= $(CONFIGURE_LDFLAGS) $(LDFLAGS)
--PY_LDFLAGS_NODIST=$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)
- NO_AS_NEEDED= @NO_AS_NEEDED@
- LDLAST= @LDLAST@
- SGI_ABI= @SGI_ABI@
-@@ -116,8 +111,6 @@ CFLAGSFORSHARED=@CFLAGSFORSHARED@
- PY_STDMODULE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)
- PY_BUILTIN_MODULE_CFLAGS= $(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN
- PY_CORE_CFLAGS= $(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE
--# Linker flags used for building the interpreter object files
--PY_CORE_LDFLAGS=$(PY_LDFLAGS) $(PY_LDFLAGS_NODIST)
- # Strict or non-strict aliasing flags used to compile dtoa.c, see above
- CFLAGS_ALIASING=@CFLAGS_ALIASING@
-
-@@ -157,7 +150,7 @@ CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$
- SHLIB_SUFFIX= @SHLIB_SUFFIX@
- EXT_SUFFIX= @EXT_SUFFIX@
- LDSHARED= @LDSHARED@ $(PY_LDFLAGS)
--BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS)
-+BLDSHARED= @BLDSHARED@ $(PY_LDFLAGS)
- LDCXXSHARED= @LDCXXSHARED@
- DESTSHARED= $(BINLIBDEST)/lib-dynload
-
-@@ -506,7 +499,7 @@ profile-run-stamp:
- touch $@
-
- build_all_generate_profile:
-- $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LDFLAGS_NODIST="$(LDFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LIBS="$(LIBS)"
-+ $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_GEN_FLAG)" LDFLAGS="$(LDFLAGS) $(PGO_PROF_GEN_FLAG)" LIBS="$(LIBS)"
-
- run_profile_task:
- @ # FIXME: can't run for a cross build
-@@ -520,7 +513,7 @@ build_all_merge_profile:
- profile-opt: profile-run-stamp
- @echo "Rebuilding with profile guided optimizations:"
- -rm -f profile-clean-stamp
-- $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_USE_FLAG)" LDFLAGS_NODIST="$(LDFLAGS_NODIST)"
-+ $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS) $(PGO_PROF_USE_FLAG)" LDFLAGS="$(LDFLAGS)"
-
- # Compile and run with gcov
- .PHONY=coverage coverage-lcov coverage-report
-@@ -577,7 +570,7 @@ clinic: check-clean-src $(srcdir)/Module
-
- # Build the interpreter
- $(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
-- $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-
- platform: $(BUILDPYTHON) pybuilddir.txt
- $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print("%s-%d.%d" % (get_platform(), *sys.version_info[:2]))' >platform
-@@ -642,7 +635,7 @@ libpython3.so: libpython$(LDVERSION).so
- $(BLDSHARED) $(NO_AS_NEEDED) -o $@ -Wl,-h$@ $^
-
- libpython$(LDVERSION).dylib: $(LIBRARY_OBJS)
-- $(CC) -dynamiclib -Wl,-single_module $(PY_CORE_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
-+ $(CC) -dynamiclib -Wl,-single_module $(PY_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
-
-
- libpython$(VERSION).sl: $(LIBRARY_OBJS)
-@@ -667,7 +660,7 @@ $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION
- $(LIBRARY) \
- $(RESSRCDIR)/Info.plist
- $(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)
-- $(CC) -o $(LDLIBRARY) $(PY_CORE_LDFLAGS) -dynamiclib \
-+ $(CC) -o $(LDLIBRARY) $(PY_LDFLAGS) -dynamiclib \
- -all_load $(LIBRARY) -Wl,-single_module \
- -install_name $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK) \
- -compatibility_version $(VERSION) \
-@@ -718,7 +711,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.d
- fi
-
- Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
-- $(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-+ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-
- ############################################################################
- # Importlib
-@@ -726,7 +719,7 @@ Programs/_testembed: Programs/_testembed
- Programs/_freeze_importlib.o: Programs/_freeze_importlib.c Makefile
-
- Programs/_freeze_importlib: Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN)
-- $(LINKCC) $(PY_CORE_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-+ $(LINKCC) $(PY_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
-
- .PHONY: regen-importlib
- regen-importlib: Programs/_freeze_importlib
-@@ -808,7 +801,7 @@ Python/sysmodule.o: $(srcdir)/Python/sys
- $(IO_OBJS): $(IO_H)
-
- $(PGEN): $(PGENOBJS)
-- $(CC) $(OPT) $(PY_CORE_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
-+ $(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
-
- .PHONY: regen-grammar
- regen-grammar: $(PGEN)
---- a/configure.ac
-+++ b/configure.ac
-@@ -1395,7 +1395,7 @@ if test "$Py_LTO" = 'true' ; then
- fi
-
- CFLAGS_NODIST="$CFLAGS_NODIST $LTOFLAGS"
-- LDFLAGS_NODIST="$LDFLAGS_NODIST $LTOFLAGS"
-+ LDFLAGS="$LDFLAGS $LTOFLAGS"
- fi
-
- # Enable PGO flags.
-@@ -1555,7 +1555,6 @@ fi
-
- AC_SUBST(BASECFLAGS)
- AC_SUBST(CFLAGS_NODIST)
--AC_SUBST(LDFLAGS_NODIST)
-
- # The -arch flags for universal builds on OSX
- UNIVERSAL_ARCH_FLAGS=
---- a/setup.py
-+++ b/setup.py
-@@ -18,16 +18,11 @@ from distutils.spawn import find_executa
-
- cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
-
--# Set common compiler and linker flags derived from the Makefile,
--# reserved for building the interpreter and the stdlib modules.
--# See bpo-21121 and bpo-35257
--def set_compiler_flags(compiler_flags, compiler_py_flags_nodist):
-- flags = sysconfig.get_config_var(compiler_flags)
-- py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist)
-- sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist
--
--set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
--set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
-+# Add special CFLAGS reserved for building the interpreter and the stdlib
-+# modules (Issue #21121).
-+cflags = sysconfig.get_config_var('CFLAGS')
-+py_cflags_nodist = sysconfig.get_config_var('PY_CFLAGS_NODIST')
-+sysconfig.get_config_vars()['CFLAGS'] = cflags + ' ' + py_cflags_nodist
-
- class Dummy:
- """Hack for parallel build"""
diff --git a/debian/patches/series b/debian/patches/series
index 51e7616..98cfd23 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,5 +1,4 @@
-# git-updates.diff
-revert-profile-opt-changes.diff
+git-updates.diff
deb-setup.diff
deb-locations.diff
distutils-install-layout.diff
@@ -11,7 +10,6 @@ tkinter-import.diff
gdbm-import.diff
link-opt.diff
setup-modules.diff
-platform-lsbrelease.diff
bdist-wininst-notfound.diff
profiled-build.diff
langpack-gettext.diff
@@ -19,7 +17,7 @@ disable-sem-check.diff
lib-argparse.diff
ctypes-arm.diff
# link-timemodule.diff
-lto-link-flags.diff
+#lto-link-flags.diff
multiarch.diff
lib2to3-no-pickled-grammar.diff
ext-no-libpython-link.diff
@@ -35,7 +33,7 @@ pydoc-use-pager.diff
local-doc-references.diff
doc-build-texinfo.diff
build-math-object.diff
-issue35998.diff
+argparse-no-shutil.diff
arm-alignment.diff
dyson.patch
dyson-socketmodule-ifindex.patch
diff --git a/debian/patches/setup-modules.diff b/debian/patches/setup-modules.diff
index 6f80339..9a71a94 100644
--- a/debian/patches/setup-modules.diff
+++ b/debian/patches/setup-modules.diff
@@ -1,17 +1,15 @@
-# DP: Modules/Setup.dist: patches to build some extensions statically
-
---- a/Modules/Setup.dist
-+++ b/Modules/Setup.dist
-@@ -178,7 +178,7 @@ _symtable symtablemodule.c
- #_weakref _weakref.c # basic weak reference support
+--- a/Modules/Setup
++++ b/Modules/Setup
+@@ -175,7 +175,7 @@ _symtable symtablemodule.c
#_testcapi _testcapimodule.c # Python C API test module
+ #_testinternalcapi _testinternalcapi.c -I$(srcdir)/Include/internal -DPy_BUILD_CORE_MODULE # Python internal C API test module
#_random _randommodule.c # Random number generator
-#_elementtree -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DUSE_PYEXPAT_CAPI _elementtree.c # elementtree accelerator
+#_elementtree _elementtree.c -lexpat # elementtree accelerator
#_pickle _pickle.c # pickle accelerator
#_datetime _datetimemodule.c # datetime accelerator
#_bisect _bisectmodule.c # Bisection algorithms
-@@ -208,10 +208,7 @@ _symtable symtablemodule.c
+@@ -207,10 +207,7 @@ _symtable symtablemodule.c
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
@@ -23,7 +21,7 @@
# The crypt module is now disabled by default because it breaks builds
# on many systems (where -lcrypt is needed), e.g. Linux (I believe).
-@@ -244,6 +241,7 @@ _symtable symtablemodule.c
+@@ -243,6 +240,7 @@ _symtable symtablemodule.c
#_md5 md5module.c
@@ -31,7 +29,7 @@
# The _sha module implements the SHA checksum algorithms.
# (NIST's Secure Hash Algorithms.)
-@@ -331,6 +329,7 @@ _symtable symtablemodule.c
+@@ -330,6 +328,7 @@ _symtable symtablemodule.c
# Fred Drake's interface to the Python parser
#parser parsermodule.c
@@ -39,12 +37,12 @@
# Andrew Kuchling's zlib module.
# This require zlib 1.1.3 (or later).
-@@ -340,7 +339,7 @@ _symtable symtablemodule.c
+@@ -339,7 +338,7 @@ _symtable symtablemodule.c
# Interface to the Expat XML parser
# More information on Expat can be found at www.libexpat.org.
#
-#pyexpat expat/xmlparse.c expat/xmlrole.c expat/xmltok.c pyexpat.c -I$(srcdir)/Modules/expat -DHAVE_EXPAT_CONFIG_H -DXML_POOR_ENTROPY -DUSE_PYEXPAT_CAPI
-+#pyexpat pyexpat.c -lexpat
++pyexpat pyexpat.c -lexpat
# Hye-Shik Chang's CJKCodecs
diff --git a/debian/patches/sysconfigdata-name.diff b/debian/patches/sysconfigdata-name.diff
new file mode 100644
index 0000000..d8dea8b
--- /dev/null
+++ b/debian/patches/sysconfigdata-name.diff
@@ -0,0 +1,60 @@
+--- a/Lib/sysconfig.py
++++ b/Lib/sysconfig.py
+@@ -345,9 +345,8 @@ def get_makefile_filename():
+
+ def _get_sysconfigdata_name():
+ return os.environ.get('_PYTHON_SYSCONFIGDATA_NAME',
+- '_sysconfigdata_{abi}_{platform}_{multiarch}'.format(
++ '_sysconfigdata_{abi}_{multiarch}'.format(
+ abi=sys.abiflags,
+- platform=sys.platform,
+ multiarch=getattr(sys.implementation, '_multiarch', ''),
+ ))
+
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -1463,8 +1463,10 @@ libinstall: build_all $(srcdir)/Modules/
+ esac; \
+ done; \
+ done
+- $(INSTALL_DATA) `cat pybuilddir.txt`/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py \
+- $(DESTDIR)$(LIBDEST); \
++ $(INSTALL_DATA) `cat pybuilddir.txt`/_sysconfigdata_$(ABIFLAGS)_$(MULTIARCH).py \
++ $(DESTDIR)$(LIBDEST)
++ $(LN) -s _sysconfigdata_$(ABIFLAGS)_$(MULTIARCH).py \
++ $(DESTDIR)$(LIBDEST)/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py
+ $(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt
+ if test -d $(DESTDIR)$(LIBDEST)/distutils/tests; then \
+ $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
+@@ -1619,6 +1621,7 @@ sharedinstall: sharedmods
+ --install-scripts=$(BINDIR) \
+ --install-platlib=$(DESTSHARED) \
+ --root=$(DESTDIR)/
++ -rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata_$(ABIFLAGS)_$(MULTIARCH).py
+ -rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py
+ -rm -r $(DESTDIR)$(DESTSHARED)/__pycache__
+
+--- a/Lib/distutils/sysconfig.py
++++ b/Lib/distutils/sysconfig.py
+@@ -459,9 +459,8 @@ def _init_posix():
+ """Initialize the module as appropriate for POSIX systems."""
+ # _sysconfigdata is generated at build time, see the sysconfig module
+ name = os.environ.get('_PYTHON_SYSCONFIGDATA_NAME',
+- '_sysconfigdata_{abi}_{platform}_{multiarch}'.format(
++ '_sysconfigdata_{abi}_{multiarch}'.format(
+ abi=sys.abiflags,
+- platform=sys.platform,
+ multiarch=getattr(sys.implementation, '_multiarch', ''),
+ ))
+ _temp = __import__(name, globals(), locals(), ['build_time_vars'], 0)
+--- a/configure.ac
++++ b/configure.ac
+@@ -75,7 +75,7 @@ if test "$cross_compiling" = yes; then
+ AC_MSG_ERROR([python$PACKAGE_VERSION interpreter not found])
+ fi
+ AC_MSG_RESULT($interp)
+- PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH) '$interp
++ PYTHON_FOR_BUILD='_PYTHON_PROJECT_BASE=$(abs_builddir) _PYTHON_HOST_PLATFORM=$(_PYTHON_HOST_PLATFORM) PYTHONPATH=$(shell test -f pybuilddir.txt && echo $(abs_builddir)/`cat pybuilddir.txt`:)$(srcdir)/Lib _PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata_$(ABIFLAGS)_$(MULTIARCH) '$interp
+ fi
+ elif test "$cross_compiling" = maybe; then
+ AC_MSG_ERROR([Cross compiling required --host=HOST-TUPLE and --build=ARCH])
diff --git a/debian/patches/tempfile-minimal.diff b/debian/patches/tempfile-minimal.diff
index 8aeb75d..3059e77 100644
--- a/debian/patches/tempfile-minimal.diff
+++ b/debian/patches/tempfile-minimal.diff
@@ -151,19 +151,13 @@ Index: b/Lib/tempfile.py
+
import errno as _errno
from random import Random as _Random
- import weakref as _weakref
-@@ -792,7 +931,7 @@ class TemporaryDirectory(object):
+ import sys as _sys
+@@ -808,7 +947,7 @@ class TemporaryDirectory(object):
+ else:
+ raise
+
+- _shutil.rmtree(name, onerror=onerror)
++ _rmtree(name, onerror=onerror)
@classmethod
def _cleanup(cls, name, warn_message):
-- _shutil.rmtree(name)
-+ _rmtree(name)
- _warnings.warn(warn_message, ResourceWarning)
-
- def __repr__(self):
-@@ -806,4 +945,4 @@ class TemporaryDirectory(object):
-
- def cleanup(self):
- if self._finalizer.detach():
-- _shutil.rmtree(self.name)
-+ _rmtree(self.name)
diff --git a/debian/py37-breaks.Debian b/debian/py37-breaks.Debian
deleted file mode 100644
index 35ff818..0000000
--- a/debian/py37-breaks.Debian
+++ /dev/null
@@ -1,73 +0,0 @@
-python3-twisted (<< 18.4.0-2),
-python3-pexpect (<< 4.6.0-1~),
-python3-cxx-dev (<< 7.0.3-2),
-libboost-python1.62.0 (<< 1.62.0+dfsg-6),
-python3-psycopg2 (<< 2.7.5-2),
-python3-maxminddb (<< 1.4.1-1~),
-python3-blist (<< 1.3.6-5),
-python3-django (<< 1:1.11.13-2),
-diffoscope (<< 98),
-gpodder (<< 3.10.3-2),
-python3-trollius (<< 2.1~b1-5),
-python3-slixmpp (<< 1.3.0+git20180724-1),
-python3-exabgp (<< 4.0.8-1),
-python3-dns (<< 3.2.0-1),
-openscap-daemon (<< 0.1.10-3),
-patroni (<< 1.4.4-2),
-python3-cs (<< 2.3.1-1),
-snakemake (<< 5.2.1-1),
-python3-pycsw (<< 2.2.0+dfsg-4),
-python3-aiomeasures (<< 0.5.14-2),
-python3-dns (<< 3.2.0),
-python3-dkim (<< 0.9.0),
-pyzo (<< 4.4.3-1.1~),
-xapers (<< 0.8.2-1.1),
-python3-motor (<= 1.2.3-1.1),
-python3-http-parser (<= 0.8.3-2+b3),
-python3-celery (<= 4.2.0-1),
-python3-astroid (<= 1.6.5-1),
-python3-ubjson (<= 0.8.5-2),
-python3-protobuf (<= 3.0.0-9.1+b1),
-python3-opengl (<= 3.1.0+dfsg-1),
-python3-ws4py (<= 0.4.2+dfsg1-2),
-python3-dropbox (<= 8.7.1-1),
-python3-pycuda (<= 2017.1.1-2+b1),
-python3-libcloud (<= 2.3.0-1),
-python3-jira (<= 1.0.10-1),
-python3-sleekxmpp (<= 1.3.3-3),
-voltron (<= 0.1.4-2),
-visidata (<= 1.0-1),
-salt-common (<= 2017.7.4+dfsg1-1),
-python3-yowsup (<= 2.5.7-3),
-python3-websockets (<= 4.0.1-1),
-python3-txfixtures (<= 0.2.6-1),
-python3-tweepy (<= 3.5.0-1),
-python3-signaller (<= 1.1.0-1),
-python3-rpyc (<= 3.4.4-1),
-python3-protorpc-standalone (<= 0.9.1-3),
-python3-nova (<= 2:17.0.3-12),
-python3-murano (<= 1:5.0.0-1),
-python3-mastodon (<= 1.2.2-1),
-python3-hug (<= 2.3.0-1.1),
-python3-async (<= 0.6.2-2),
-python3-pylama (<= 7.4.3-1),
-python3-glance (<= 2:16.0.1-6),
-python3-gbulb (<= 0.5.3-2),
-python3-engineio (<= 1.6.1-1),
-python3-doublex (<= 1.8.2-1),
-python3-opcua (<= 0.95.1-1),
-oca-core (<= 11.0.20180420-1),
-python3-panoramisk (<= 1.0-1),
-linux-show-player (<= 0.5-1),
-python3-azure (<= 20170915+git-1),
-python3-applicationinsights (<= 0.11.0-1),
-python3-aiopg (<= 0.14.0-1),
-python3-aiozmq (<= 0.7.1-2),
-python3-pysnmp4 (<= 4.4.3-1),
-python3-astroquery (<= 0.3.8+dfsg-2),
-fail2ban (<= 0.10.2-2),
-python3-morse-simulator (<= 1.4-3),
-python3-tango (<= 9.2.3-1),
-python3-pycuda (<= 2017.1.1-2),
-gnome-builder (<< 3.28.3-1),
-python3-pyatspi (<= 2.26.0+dfsg-1),
diff --git a/debian/pymindeps.py b/debian/pymindeps.py
index 4fee74b..a5a1849 100644
--- a/debian/pymindeps.py
+++ b/debian/pymindeps.py
@@ -54,10 +54,10 @@ class mymf(modulefinder.ModuleFinder):
callee = m.__name__
if '.' in callee:
callee = callee[:callee.index('.')]
- #print "XXX last_caller", caller, "MOD", callee
+ #print("XXX last_caller", caller, "MOD", callee)
#self._depgraph.setdefault(self._last_caller.__name__,{})[r.__name__] = 1
- #if caller in ('pdb', 'doctest') or callee in ('pdb', 'doctest'):
- # print caller, "-->", callee
+ #if caller in ('pdb', 'doctest', 'importlib') or callee in ('pdb', 'doctest', 'importlib'):
+ # print(caller, "-->", callee)
if caller != callee:
self._depgraph.setdefault(caller,{})[callee] = 1
return m
@@ -106,7 +106,7 @@ def reduce_depgraph(dg):
# guarded imports, which don't need to be included in python-minimal
excluded_imports = {
- 'argparse': set(('gettext',)),
+ 'argparse': set(('gettext', 'shutil')),
'codecs': set(('encodings',)),
'collections': set(('cPickle', 'pickle', 'doctest')),
'compileall': set(('concurrent',)),
@@ -115,14 +115,17 @@ excluded_imports = {
'hashlib': set(('logging', '_hashlib')),
#'hashlib': set(('_hashlib', '_md5', '_sha', '_sha256','_sha512',)),
'heapq': set(('doctest',)),
+ 'importlib': set(('csv', 'email', 'zipfile')),
#'io': set(('_dummy_thread',)),
'logging': set(('multiprocessing',)),
'os': set(('nt', 'ntpath', 'os2', 'os2emxpath', 'mac', 'macpath',
'riscos', 'riscospath', 'riscosenviron')),
'optparse': set(('gettext',)),
+ 'pathlib': set(('urllib',)), # Windows only
'pickle': set(('argparse', 'doctest', 'pprint')),
'platform': set(('ctypes', 'plistlib', 'tempfile')),
'reprlib': set(('_dummy_thread',)),
+ 'shutil': set(('bz2','lzma', 'tarfile', 'zipfile')),
#'socket': set(('_ssl',)),
'_sitebuiltins': set(('pydoc',)),
'subprocess': set(('dummy_threading',)),
@@ -130,6 +133,7 @@ excluded_imports = {
'tempfile': set(('_dummy_thread', 'shutil')),
'functools': set(('typing',)),
'platform': set(('distutils','plistlib')),
+ 'zipfile': set(('bz2','lzma')),
}
def main(argv):
diff --git a/debian/pyvenv3.1 b/debian/pyvenv3.1
deleted file mode 100644
index 32e2f0f..0000000
--- a/debian/pyvenv3.1
+++ /dev/null
@@ -1,34 +0,0 @@
-.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.10.
-.TH PYVENV-3.3 "1" "June 2012" "pyvenv-3.3 3.3" "User Commands"
-.SH NAME
-pyvenv-3.3 \- create virtual python environments
-.SH DESCRIPTION
-usage: venv [\-h] [\-\-system\-site\-packages] [\-\-symlinks] [\-\-clear] [\-\-upgrade]
-.IP
-ENV_DIR [ENV_DIR ...]
-.PP
-Creates virtual Python environments in one or more target directories.
-.SS "positional arguments:"
-.TP
-ENV_DIR
-A directory to create the environment in.
-.SS "optional arguments:"
-.TP
-\fB\-h\fR, \fB\-\-help\fR
-show this help message and exit
-.TP
-\fB\-\-system\-site\-packages\fR
-Give the virtual environment access to the system
-site\-packages dir.
-.TP
-\fB\-\-symlinks\fR
-Attempt to symlink rather than copy.
-.TP
-\fB\-\-clear\fR
-Delete the environment directory if it already exists.
-If not specified and the directory exists, an error is
-raised.
-.TP
-\fB\-\-upgrade\fR
-Upgrade the environment directory to use this version
-of Python, assuming Python has been upgraded in\-place.
diff --git a/debian/rules b/debian/rules
index dff7d29..8647938 100755
--- a/debian/rules
+++ b/debian/rules
@@ -24,7 +24,7 @@ DEB_HOST_MULTIARCH ?= $(call vafilt,$(DPKG_VARS),DEB_HOST_MULTIARCH)
ifeq ($(DEB_HOST_ARCH_OS),linux)
PLAT = linux
else ifeq ($(DEB_HOST_ARCH_OS),kfreebsd)
- PLAT = gnukfreebsd11
+ PLAT = gnukfreebsd10
else ifeq ($(DEB_HOST_ARCH_OS),hurd)
PLAT = gnu0
else ifeq ($(DEB_HOST_ARCH_OS),illumos)
@@ -83,9 +83,9 @@ derivative := $(shell \
elif dpkg-vendor --derives-from Debian; then echo Debian; \
else echo Unknown; fi)
-VER=3.7
-SVER=3.7.0
-NVER=3.8
+VER=3.8
+SVER=3.8.0~a1
+NVER=3.9
PVER=python$(VER)
EXT_VER=$(subst .,,$(VER))
PRIORITY=$(shell echo $(VER) | tr -d '.')0
@@ -155,6 +155,9 @@ endif
AR=$(DEB_HOST_GNU_TYPE)-ar
RANLIB=$(DEB_HOST_GNU_TYPE)-ranlib
+# configure and dtrace consume these
+export CC CXX
+
DPKG_CPPFLAGS= $(shell $(dpkg_buildflags) --get CPPFLAGS)
DPKG_CFLAGS := $(shell $(dpkg_buildflags) --get CFLAGS)
DPKG_CFLAGS := $(subst -fstack-protector-strong,-fstack-protector,$(DPKG_CFLAGS))
@@ -183,6 +186,14 @@ ifneq (,$(findstring $(DEB_HOST_ARCH), amd64 armel armhf arm64 i386 powerpc ppc6
with_lto := yes
endif
+ifneq (,$(findstring nopgo, $(DEB_BUILD_OPTIONS)))
+ with_pgo :=
+endif
+
+ifneq (,$(findstring nolto, $(DEB_BUILD_OPTIONS)))
+ with_lto :=
+endif
+
ifneq (,$(findstring noopt, $(DEB_BUILD_OPTIONS)))
OPT_CFLAGS := $(filter-out -O%, $(OPT_CFLAGS))
EXTRA_OPT_CFLAGS = -O0
@@ -218,7 +229,7 @@ sysconfig_substflags = \
ifeq ($(derivative),Ubuntu)
arch_substvars =
else ifeq ($(derivative),Debian)
- arch_substvars = '-Vpython37:Breaks=$(shell tr '\n' ' ' < debian/py37-breaks.$(derivative))'
+ arch_substvars = # '-Vpython38:Breaks=$(shell tr '\n' ' ' < debian/py38-breaks.$(derivative))'
endif
make_build_target = $(if $(with_pgo),profile-opt)
@@ -306,10 +317,11 @@ stamps/stamp-build-static: stamps/stamp-configure-static
dh_testdir
$(MAKE) $(NJOBS) -C $(buildd_static) \
EXTRA_CFLAGS="$(EXTRA_OPT_CFLAGS)" \
+ CONFIGURE_LDFLAGS="$(DPKG_LDFLAGS) $(LTO_CFLAGS)" \
PROFILE_TASK='$(PROFILE_TASK)' $(make_build_target)
+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
: # check that things are correctly built
-ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
ifneq (,$(filter $(DEB_HOST_ARCH_OS), linux))
cd $(buildd_static) && ./python -c 'from _multiprocessing import SemLock'
endif
@@ -330,7 +342,7 @@ stamps/stamp-build-shared: stamps/stamp-configure-shared
: # build a static library with PIC objects
$(MAKE) $(NJOBS) -C $(buildd_shared) \
EXTRA_CFLAGS="$(EXTRA_OPT_CFLAGS)" \
- LIBRARY=libpython$(VER)m-pic.a libpython$(VER)m-pic.a
+ LIBRARY=libpython$(VER)-pic.a libpython$(VER)-pic.a
touch stamps/stamp-build-shared
stamps/stamp-build-debug: stamps/stamp-configure-debug
@@ -338,7 +350,7 @@ stamps/stamp-build-debug: stamps/stamp-configure-debug
$(MAKE) $(NJOBS) -C $(buildd_debug) \
EXTRA_CFLAGS="$(DEBUG_CFLAGS)"
-ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
cd $(buildd_static) && ./python -c 'import _decimal'
cd $(buildd_debug) && ./python -c 'import math, cmath'
endif
@@ -361,6 +373,7 @@ common_configure_args = \
--without-ensurepip \
--with-system-expat \
--with-system-libmpdec \
+ --with-dtrace \
ifneq (,$(filter $(DEB_HOST_ARCH), avr32 or1k))
common_configure_args += --without-ffi
@@ -384,8 +397,8 @@ stamps/stamp-configure-shared: stamps/stamp-patch
rm -rf $(buildd_shared)
mkdir -p $(buildd_shared)
cd $(buildd_shared) && \
- CC="$(CC)" CXX="$(CXX)" AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(OPT_CFLAGS)" \
- CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS)" \
+ AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(OPT_CFLAGS)" \
+ CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS) $(LTO_CFLAGS)" \
$(config_site) \
../configure \
--enable-shared \
@@ -402,8 +415,8 @@ stamps/stamp-configure-static: stamps/stamp-patch
rm -rf $(buildd_static)
mkdir -p $(buildd_static)
cd $(buildd_static) && \
- CC="$(CC)" CXX="$(CXX)" AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(OPT_CFLAGS)" \
- CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS)" \
+ AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(OPT_CFLAGS)" \
+ CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS) $(LTO_CFLAGS)" \
$(config_site) \
../configure \
$(common_configure_args)
@@ -415,7 +428,7 @@ stamps/stamp-configure-debug: stamps/stamp-patch
rm -rf $(buildd_debug)
mkdir -p $(buildd_debug)
cd $(buildd_debug) && \
- CC="$(CC)" CXX="$(CXX)" AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(DEBUG_CFLAGS)" \
+ AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(DEBUG_CFLAGS)" \
CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS)" \
$(config_site) \
../configure \
@@ -429,7 +442,7 @@ stamps/stamp-configure-shared-debug: stamps/stamp-patch
rm -rf $(buildd_shdebug)
mkdir -p $(buildd_shdebug)
cd $(buildd_shdebug) && \
- CC="$(CC)" CXX="$(CXX)" AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(DEBUG_CFLAGS)" \
+ AR="$(AR)" RANLIB="$(RANLIB)" CFLAGS="$(DEBUG_CFLAGS)" \
CPPFLAGS="$(DPKG_CPPFLAGS)" LDFLAGS="$(DPKG_LDFLAGS)" \
$(config_site) \
../configure \
@@ -443,14 +456,14 @@ stamps/stamp-configure-shared-debug: stamps/stamp-patch
define __post_configure
egrep \
"^#($$(awk -v ORS='|' '$$2 ~ /^extension$$/ {print $$1}' debian/PVER-minimal.README.Debian.in)XX)" \
- Modules/Setup.dist \
+ Modules/Setup \
| sed -e 's/^#//' -e 's/-Wl,-Bdynamic//;s/-Wl,-Bstatic//' \
>> $(1)/Modules/Setup.local
: # unconditionally run makesetup
cd $(1) && \
../Modules/makesetup -c ../Modules/config.c.in -s Modules \
- Modules/Setup.local Modules/Setup
+ Modules/Setup.local ../Modules/Setup
mv $(1)/config.c $(1)/Modules/
: # and fix the timestamps
@@ -780,9 +793,6 @@ stamps/stamp-control:
help2man --no-info --version-string=$(VER) --no-discard-stderr \
--name 'pysetup tool' \
pysetup$(VER) > debian/pysetup3.1
- help2man --no-info --version-string=$(VER) --no-discard-stderr \
- --name 'create virtual python environments' \
- pyvenv-$(VER) > debian/pyvenv3.1
install: build-arch stamps/stamp-install
stamps/stamp-install: stamps/stamp-build control-file stamps/stamp-control
@@ -798,18 +808,18 @@ ifeq ($(with_interp),static)
$(MAKE) -C $(buildd_static) install DESTDIR=$(CURDIR)/$(d)
ls -l $(d)/$(scriptdir)/_sysconfigdata*
sed $(sysconfig_substflags) \
- $(buildd_shared)/$(shell cat $(buildd_shared)/pybuilddir.txt)/_sysconfigdata_m_$(PLAT)_$(DEB_HOST_MULTIARCH).py \
- > $(d)/$(scriptdir)/_sysconfigdata_m_$(PLAT)_$(DEB_HOST_MULTIARCH).py
+ $(buildd_shared)/$(shell cat $(buildd_shared)/pybuilddir.txt)/_sysconfigdata__$(DEB_HOST_MULTIARCH).py \
+ > $(d)/$(scriptdir)/_sysconfigdata__$(DEB_HOST_MULTIARCH).py
else
$(MAKE) -C $(buildd_shared) install DESTDIR=$(CURDIR)/$(d)
endif
- mkdir -p $(d)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)m
- mv $(d)/usr/include/$(PVER)m/pyconfig.h \
- $(d)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)m/.
+ mkdir -p $(d)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)
+ mv $(d)/usr/include/$(PVER)/pyconfig.h \
+ $(d)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)/.
rm -f $(d)/$(scriptdir)/lib-dynload/*.py
ls -l $(d)/$(scriptdir)/_sysconfigdata*
sed -i $(sysconfig_substflags) \
- $(d)/$(scriptdir)/_sysconfigdata_m_$(PLAT)_$(DEB_HOST_MULTIARCH).py
+ $(d)/$(scriptdir)/_sysconfigdata__$(DEB_HOST_MULTIARCH).py
-find $(d)/usr/lib/python$(VER) -name '*_failed*.so'
find $(d)/usr/lib/python$(VER) -name '*_failed*.so' | xargs -r rm -f
@@ -854,37 +864,36 @@ endif
mkdir -p $(d)/usr/share/man/man1
cp -p Misc/python.man $(d)/usr/share/man/man1/python$(VER).1
- ln -sf python$(VER).1 $(d)/usr/share/man/man1/python$(VER)m.1
cp -p debian/pydoc.1 $(d)/usr/share/man/man1/pydoc$(VER).1
: # Symlinks to /usr/bin for some tools
ln -sf ../lib/python$(VER)/pdb.py $(d)/usr/bin/pdb$(VER)
cp -p debian/pdb.1 $(d)/usr/share/man/man1/pdb$(VER).1
cp -p debian/pysetup3.1 $(d)/usr/share/man/man1/pysetup$(VER).1
- cp -p debian/pyvenv3.1 $(d)/usr/share/man/man1/pyvenv-$(VER).1
: # versioned install only
rm -f $(d)/usr/bin/{2to3,idle3,pydoc3,pysetup3,python3,python3-config}
rm -f $(d)/usr/lib/*/pkgconfig/python3.pc
+ rm -f $(d)/usr/lib/*/pkgconfig/python3-embed.pc
dh_installdirs -p$(p_lib) \
usr/lib/$(DEB_HOST_MULTIARCH) \
$(scriptdir)/config-$(VER)m-$(DEB_HOST_MULTIARCH) \
usr/share/doc
: # install the shared library
- cp -p $(buildd_shared)/libpython$(VER)m.so.1.0 \
+ cp -p $(buildd_shared)/libpython$(VER).so.1.0 \
$(d_lib)/usr/lib/$(DEB_HOST_MULTIARCH)/
dh_link -p$(p_lib) \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)m.so.1.0 \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)m.so.1 \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)m.so.1 \
- /$(scriptdir)/config-$(VER)m-$(DEB_HOST_MULTIARCH)/libpython$(VER)m.so \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)m.so.1 \
- /$(scriptdir)/config-$(VER)m-$(DEB_HOST_MULTIARCH)/libpython$(VER).so
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER).so.1.0 \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER).so.1 \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER).so.1 \
+ /$(scriptdir)/config-$(VER)-$(DEB_HOST_MULTIARCH)/libpython$(VER).so \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER).so.1 \
+ /$(scriptdir)/config-$(VER)-$(DEB_HOST_MULTIARCH)/libpython$(VER).so
ln -sf $(p_base) $(d_lib)/usr/share/doc/$(p_lib)
- ln -sf libpython$(VER)m.so.1 $(d)/usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)m.so
+ ln -sf libpython$(VER).so.1 $(d)/usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER).so
ifeq ($(with_interp),shared)
: # install the statically linked runtime
@@ -897,7 +906,7 @@ endif
: # install the Makefile of the shared python build
sed $(sysconfig_substflags) \
$(buildd_shared)/Makefile \
- > $(d)/$(scriptdir)/config-$(VER)m-$(DEB_HOST_MULTIARCH)/Makefile
+ > $(d)/$(scriptdir)/config-$(VER)-$(DEB_HOST_MULTIARCH)/Makefile
: # Move the minimal libraries into $(p_lmin).
dh_installdirs -p$(p_lmin) \
@@ -915,7 +924,7 @@ endif
$(foreach i,$(MIN_PACKAGES),$(scriptdir)/$(i)) \
$(foreach i,$(MIN_ENCODINGS),$(scriptdir)/$(i)) \
$(scriptdir)/site.py \
- $(scriptdir)/_sysconfigdata_m_$(PLAT)_$(DEB_HOST_MULTIARCH).py \
+ $(scriptdir)/_sysconfigdata__$(DEB_HOST_MULTIARCH).py \
`cd $(d); for i in $(MIN_EXTS); do \
test -e $(scriptdir)/lib-dynload/$$i.*.so \
&& echo $(scriptdir)/lib-dynload/$$i.*.so; \
@@ -928,9 +937,7 @@ endif
usr/share/man/man1
$(dh_compat2) dh_movefiles -p$(p_min) --sourcedir=$(d) \
usr/bin/python$(VER) \
- usr/bin/python$(VER)m \
- usr/share/man/man1/python$(VER).1 \
- usr/share/man/man1/python$(VER)m.1
+ usr/share/man/man1/python$(VER).1
rv=0; \
for i in $(MIN_EXTS); do \
@@ -950,8 +957,7 @@ endif
# mv $(d)/usr/share/include/python$(VER)/* $(d)/usr/include/python$(VER)/.
# rm -rf $(d)/usr/share/include
- cp $(d)/usr/bin/$(PVER)m-config $(d)/usr/bin/$(DEB_HOST_MULTIARCH)-$(PVER)m-config
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)m-config $(d)/usr/bin/$(DEB_HOST_MULTIARCH)-$(PVER)-config
+ cp $(d)/usr/bin/$(PVER)-config $(d)/usr/bin/$(DEB_HOST_MULTIARCH)-$(PVER)-config
dh_installdirs -p$(p_ldev) \
usr/bin \
@@ -961,29 +967,30 @@ endif
$(dh_compat2) dh_movefiles -p$(p_ldev) --sourcedir=$(d) \
usr/bin/$(DEB_HOST_MULTIARCH)-$(PVER)*-config \
- usr/lib/python$(VER)/config-$(VER)m-$(DEB_HOST_MULTIARCH) \
+ usr/lib/python$(VER)/config-$(VER)-$(DEB_HOST_MULTIARCH) \
usr/include \
- usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)m.{a,so} \
+ usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER).{a,so} \
usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/python-$(VER)*.pc \
usr/lib/python$(VER)/distutils/command/wininst-*.exe
- sed 's/@subdir@/$(PVER)m/;s/@header@/pyconfig.h/' \
- debian/multiarch.h.in > $(d_ldev)/usr/include/$(PVER)m/pyconfig.h
+ sed 's/@subdir@/$(PVER)/;s/@header@/pyconfig.h/' \
+ debian/multiarch.h.in > $(d_ldev)/usr/include/$(PVER)/pyconfig.h
sed -i \
- -e '/^Cflags:/s,$$, -I$${includedir}/$(DEB_HOST_MULTIARCH)/python$(VER)m,' \
+ -e '/^Cflags:/s,$$, -I$${includedir}/$(DEB_HOST_MULTIARCH)/python$(VER),' \
-e '/^libdir=/d;s/-L\$${libdir} *//' \
$(d_ldev)/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/python-$(VER).pc
dh_link -p$(p_ldev) \
- /usr/lib/$(PVER)/config-$(VER)m-$(DEB_HOST_MULTIARCH)/libpython$(VER)m.a \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)m.a
+ /usr/lib/$(PVER)/config-$(VER)-$(DEB_HOST_MULTIARCH)/libpython$(VER).a \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER).a
- cp -p $(buildd_shared)/libpython$(VER)m-pic.a \
- $(d_ldev)/usr/lib/python$(VER)/config-$(VER)m-$(DEB_HOST_MULTIARCH)/
+ cp -p $(buildd_shared)/libpython$(VER)-pic.a \
+ $(d_ldev)/usr/lib/python$(VER)/config-$(VER)-$(DEB_HOST_MULTIARCH)/
- : # symlinks for the "old" include directory name
- ln -sf python$(VER)m $(d_ldev)/usr/include/python$(VER)
+# FIXME
+# : # symlinks for the "old" include directory name
+# ln -sf python$(VER)m $(d_ldev)/usr/include/python$(VER)
dh_installdirs -p$(p_dev) \
usr/share/doc/python$(VER) \
@@ -1000,21 +1007,13 @@ endif
: # in $(p_ldev), prefix python-config with triplets
cp -p debian/python3-config.1 \
- $(d_ldev)/usr/share/man/man1/$(DEB_HOST_MULTIARCH)-$(PVER)m-config.1
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)m-config.1.gz \
- $(d_ldev)/usr/share/man/man1/$(DEB_HOST_MULTIARCH)-$(PVER)-config.1.gz
+ $(d_ldev)/usr/share/man/man1/$(DEB_HOST_MULTIARCH)-$(PVER)-config.1
ifneq ($(DEB_HOST_MULTIARCH),$(DEB_HOST_GNU_TYPE))
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)m-config \
- $(d_ldev)/usr/bin/$(DEB_HOST_GNU_TYPE)-$(PVER)m-config
ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config \
$(d_ldev)/usr/bin/$(DEB_HOST_GNU_TYPE)-$(PVER)-config
ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config.1.gz \
$(d_ldev)/usr/share/man/man1/$(DEB_HOST_GNU_TYPE)-$(PVER)-config.1.gz
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config.1.gz \
- $(d_ldev)/usr/share/man/man1/$(DEB_HOST_GNU_TYPE)-$(PVER)m-config.1.gz
endif
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)m-config $(d_dev)/usr/bin/$(PVER)m-config
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)m-config.1.gz $(d_dev)/usr/share/man/man1/$(PVER)m-config.1.gz
ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config $(d_dev)/usr/bin/$(PVER)-config
ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config.1.gz $(d_dev)/usr/share/man/man1/$(PVER)-config.1.gz
@@ -1134,12 +1133,8 @@ endif
: # pyvenv and ensurepip files into $(p_venv)
dh_installdirs -p$(p_venv) \
- usr/bin \
- usr/share/man/man1 \
usr/lib/python$(VER)
dh_movefiles -p$(p_venv) \
- usr/bin/pyvenv-$(VER) \
- usr/share/man/man1/pyvenv-$(VER).1 \
usr/lib/python$(VER)/ensurepip
: # library files into $(p_lbase)
@@ -1152,7 +1147,6 @@ endif
mkdir -p $(d)/usr/lib/python3/dist-packages
(cd $(d) && tar cf - .) | (cd $(d_base) && tar xpf -)
rm -f $(d_base)/usr/bin/python
- rm -f $(d_base)/usr/bin/pyvenv
: # Install menu icon
dh_installdirs -p$(p_base) usr/share/pixmaps
@@ -1185,19 +1179,19 @@ endif
: # install the Makefile of the shared python debug build
sed $(sysconfig_substflags) \
$(buildd_shdebug)/Makefile \
- > $(d)-dbg/$(scriptdir)/config-$(VER)dm-$(DEB_HOST_MULTIARCH)/Makefile
+ > $(d)-dbg/$(scriptdir)/config-$(VER)d-$(DEB_HOST_MULTIARCH)/Makefile
sed $(sysconfig_substflags) \
- $(buildd_shdebug)/$(shell cat $(buildd_shdebug)/pybuilddir.txt)/_sysconfigdata_dm_$(PLAT)_$(DEB_HOST_MULTIARCH).py \
- > $(d)-dbg/$(scriptdir)/_sysconfigdata_dm_$(PLAT)_$(DEB_HOST_MULTIARCH).py
+ $(buildd_shdebug)/$(shell cat $(buildd_shdebug)/pybuilddir.txt)/_sysconfigdata_d_$(DEB_HOST_MULTIARCH).py \
+ > $(d)-dbg/$(scriptdir)/_sysconfigdata_d_$(DEB_HOST_MULTIARCH).py
sed -i $(sysconfig_substflags) \
- $(d)-dbg/$(scriptdir)/_sysconfigdata_dm_$(PLAT)_$(DEB_HOST_MULTIARCH).py
+ $(d)-dbg/$(scriptdir)/_sysconfigdata_d_$(DEB_HOST_MULTIARCH).py
mv $(d)-dbg/usr/lib/libpython*.a $(d)-dbg/usr/lib/$(DEB_HOST_MULTIARCH)/
for i in $(d)-dbg/$(scriptdir)/lib-dynload/*.so; do \
case "$$i" in *$(DEB_HOST_MULTIARCH)*) continue; esac; \
- b=$$(basename $$i .cpython-$(EXT_VER)dm.so); \
- d=$${b}.cpython-$(EXT_VER)dm-$(DEB_HOST_MULTIARCH).so; \
+ b=$$(basename $$i .cpython-$(EXT_VER)d.so); \
+ d=$${b}.cpython-$(EXT_VER)d-$(DEB_HOST_MULTIARCH).so; \
mv $$i $(d)-dbg/$(scriptdir)/lib-dynload/$$d; \
done
@@ -1205,25 +1199,29 @@ endif
usr/bin \
usr/share/man/man1 \
$(scriptdir)/lib-dynload \
- usr/include/$(PVER)dm \
- usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)dm \
+ usr/include/$(PVER)d \
+ usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)d \
usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig
cp -p $(d)-dbg/$(scriptdir)/lib-dynload/*.so \
$(d_ldbg)/$(scriptdir)/lib-dynload/
- cp -p $(d)-dbg/$(scriptdir)/_sysconfigdata_dm_$(PLAT)_$(DEB_HOST_MULTIARCH).py \
+ cp -p $(d)-dbg/$(scriptdir)/_sysconfigdata_d_$(DEB_HOST_MULTIARCH).py \
$(d_ldbg)/$(scriptdir)/
- cp -p $(buildd_shdebug)/libpython$(VER)dm.so.1.0 \
+ cp -p $(buildd_shdebug)/libpython$(VER)d.so.1.0 \
$(d_ldbg)/usr/lib/$(DEB_HOST_MULTIARCH)/
dh_link -p$(p_ldbg) \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)dm.so.1.0 \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)dm.so.1 \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)dm.so.1 \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)dm.so
- cp $(d)-dbg/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/python-$(VER)dm.pc \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)d.so.1.0 \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)d.so.1 \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)d.so.1 \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)d.so
+ cp $(d)-dbg/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/python-$(VER)d.pc \
$(d_ldbg)/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/.
- ln -s python-$(VER)dm.pc \
+ ln -s python-$(VER)d.pc \
$(d_ldbg)/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/python-$(VER)-dbg.pc
+ cp $(d)-dbg/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/python-$(VER)d-embed.pc \
+ $(d_ldbg)/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/.
+ ln -s python-$(VER)d-embed.pc \
+ $(d_ldbg)/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig/python-$(VER)-dbg-embed.pc
dh_installdirs -p$(p_dbg) \
usr/bin \
@@ -1232,8 +1230,8 @@ endif
cp -p Misc/SpecialBuilds.txt $(d_dbg)/usr/share/doc/$(p_base)/
cp -p debian/$(PVER)-dbg.README.Debian \
$(d_dbg)/usr/share/doc/$(p_base)/README.debug
- cp -p $(buildd_debug)/python $(d_dbg)/usr/bin/$(PVER)dm
- ln -sf python$(VER)dm $(d_dbg)/usr/bin/$(PVER)-dbg
+ cp -p $(buildd_debug)/python $(d_dbg)/usr/bin/$(PVER)d
+ ln -sf python$(VER)d $(d_dbg)/usr/bin/$(PVER)-dbg
ifneq ($(with_tk),yes)
rm -f $(d_ldbg)/$(scriptdir)/lib-dynload/_tkinter*.so
@@ -1244,67 +1242,67 @@ ifneq ($(with_gdbm),yes)
rm -f $(d_ldbg)/usr/lib/debug/$(scriptdir)/lib-dynload/_gdbm*.so
endif
- cp -a $(d)-dbg/$(scriptdir)/config-$(VER)dm-$(DEB_HOST_MULTIARCH) \
+ cp -a $(d)-dbg/$(scriptdir)/config-$(VER)d-$(DEB_HOST_MULTIARCH) \
$(d_ldbg)/$(scriptdir)/
dh_link -p$(p_ldbg) \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)dm.so \
- /$(scriptdir)/config-$(VER)dm-$(DEB_HOST_MULTIARCH)/libpython$(VER)dm.so \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)dm.so \
- /$(scriptdir)/config-$(VER)dm-$(DEB_HOST_MULTIARCH)/libpython$(VER).so \
- /$(scriptdir)/config-$(VER)dm-$(DEB_HOST_MULTIARCH)/libpython$(VER)dm.a \
- /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)dm.a
-
- for i in $(d_ldev)/usr/include/$(PVER)m/*; do \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)d.so \
+ /$(scriptdir)/config-$(VER)d-$(DEB_HOST_MULTIARCH)/libpython$(VER)d.so \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)d.so \
+ /$(scriptdir)/config-$(VER)d-$(DEB_HOST_MULTIARCH)/libpython$(VER).so \
+ /$(scriptdir)/config-$(VER)d-$(DEB_HOST_MULTIARCH)/libpython$(VER)d.a \
+ /usr/lib/$(DEB_HOST_MULTIARCH)/libpython$(VER)d.a
+
+ for i in $(d_ldev)/usr/include/$(PVER)/*; do \
i=$$(basename $$i); \
case $$i in pyconfig.h) continue; esac; \
- ln -sf ../$(PVER)m/$$i $(d_ldbg)/usr/include/$(PVER)dm/$$i; \
+ ln -sf ../$(PVER)/$$i $(d_ldbg)/usr/include/$(PVER)d/$$i; \
done
- cp -p $(buildd_debug)/pyconfig.h $(d_ldbg)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)dm/
- sed 's/@subdir@/$(PVER)dm/;s/@header@/pyconfig.h/' \
- debian/multiarch.h.in > $(d_ldbg)/usr/include/$(PVER)dm/pyconfig.h
+ cp -p $(buildd_debug)/pyconfig.h $(d_ldbg)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)d/
+ sed 's/@subdir@/$(PVER)d/;s/@header@/pyconfig.h/' \
+ debian/multiarch.h.in > $(d_ldbg)/usr/include/$(PVER)d/pyconfig.h
ln -sf $(PVER).1.gz $(d_dbg)/usr/share/man/man1/$(PVER)-dbg.1.gz
: # in $(p_ldbg), prefix python-config with triplets
- cp $(d)-dbg/usr/bin/$(PVER)dm-config \
- $(d_ldbg)/usr/bin/$(DEB_HOST_MULTIARCH)-$(PVER)dm-config
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)dm-config \
+ cp $(d)-dbg/usr/bin/$(PVER)d-config \
+ $(d_ldbg)/usr/bin/$(DEB_HOST_MULTIARCH)-$(PVER)d-config
+ ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)d-config \
$(d_ldbg)/usr/bin/$(DEB_HOST_MULTIARCH)-$(PVER)-dbg-config
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)m-config.1.gz \
- $(d_ldbg)/usr/share/man/man1/$(DEB_HOST_MULTIARCH)-$(PVER)dm-config.1.gz
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)m-config.1.gz \
+ ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config.1.gz \
+ $(d_ldbg)/usr/share/man/man1/$(DEB_HOST_MULTIARCH)-$(PVER)d-config.1.gz
+ ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config.1.gz \
$(d_ldbg)/usr/share/man/man1/$(DEB_HOST_MULTIARCH)-$(PVER)-dbg-config.1.gz
ifneq ($(DEB_HOST_MULTIARCH),$(DEB_HOST_GNU_TYPE))
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)dm-config \
- $(d_ldbg)/usr/bin/$(DEB_HOST_GNU_TYPE)-$(PVER)dm-config
+ ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)d-config \
+ $(d_ldbg)/usr/bin/$(DEB_HOST_GNU_TYPE)-$(PVER)d-config
ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-config.1.gz \
- $(d_ldbg)/usr/share/man/man1/$(DEB_HOST_GNU_TYPE)-$(PVER)dm-config.1.gz
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)dm-config \
+ $(d_ldbg)/usr/share/man/man1/$(DEB_HOST_GNU_TYPE)-$(PVER)d-config.1.gz
+ ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)d-config \
$(d_ldbg)/usr/bin/$(DEB_HOST_GNU_TYPE)-$(PVER)-dbg-config
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)dm-config.1.gz \
+ ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)d-config.1.gz \
$(d_ldbg)/usr/share/man/man1/$(DEB_HOST_GNU_TYPE)-$(PVER)-dbg-config.1.gz
endif
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)dm-config $(d_dbg)/usr/bin/$(PVER)dm-config
- ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)dm-config.1.gz $(d_dbg)/usr/share/man/man1/$(PVER)dm-config.1.gz
+ ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)d-config $(d_dbg)/usr/bin/$(PVER)d-config
+ ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)d-config.1.gz $(d_dbg)/usr/share/man/man1/$(PVER)d-config.1.gz
ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-dbg-config $(d_dbg)/usr/bin/$(PVER)-dbg-config
ln -sf $(DEB_HOST_MULTIARCH)-$(PVER)-dbg-config.1.gz $(d_dbg)/usr/share/man/man1/$(PVER)-dbg-config.1.gz
: # symlinks for the "old" include / config directory names
ln -sf $(PVER)-config.1.gz $(d_dbg)/usr/share/man/man1/$(PVER)-dbg-config.1.gz
- ln -sf $(PVER).1.gz $(d_dbg)/usr/share/man/man1/$(PVER)dm.1.gz
- ln -sf $(PVER)-config.1.gz $(d_dbg)/usr/share/man/man1/$(PVER)dm-config.1.gz
+ ln -sf $(PVER).1.gz $(d_dbg)/usr/share/man/man1/$(PVER)d.1.gz
+ ln -sf $(PVER)-config.1.gz $(d_dbg)/usr/share/man/man1/$(PVER)d-config.1.gz
ifeq ($(with_udeb),yes)
: # Copy the most important files from $(p_min) into $(p_udeb).
dh_installdirs -p$(p_udeb) \
etc/$(PVER) \
usr/bin \
- usr/include/$(PVER)mu \
+ usr/include/$(PVER)u \
$(scriptdir)/lib-dynload \
- $(scriptdir)/config-$(VER)m-$(DEB_HOST_MULTIARCH)
+ $(scriptdir)/config-$(VER)-$(DEB_HOST_MULTIARCH)
cp -p $(d_min)/usr/bin/python$(VER) $(d_udeb)/usr/bin/
- ln -sf python$(VER)mu $(d_udeb)/usr/bin/python$(VER)
+ ln -sf python$(VER)u $(d_udeb)/usr/bin/python$(VER)
ln -sf python$(VER) $(d_udeb)/usr/bin/python3
cp -p $(foreach i,$(MIN_MODS),$(d_min)/$(scriptdir)/$(i).py) \
$(d_udeb)/$(scriptdir)/
@@ -1312,10 +1310,10 @@ ifeq ($(with_udeb),yes)
$(d_udeb)/$(scriptdir)/
cp -p $(foreach i,$(MIN_ENCODINGS),$(d_min)/$(scriptdir)/$(i)) \
$(d_udeb)/$(scriptdir)/
- cp -p $(d_min)/$(scriptdir)/config-$(VER)m-$(DEB_HOST_MULTIARCH)/Makefile \
- $(d_udeb)/$(scriptdir)/config-$(VER)m-$(DEB_HOST_MULTIARCH)/
- cp -p $(d_min)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)m/pyconfig.h \
- $(d_udeb)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)m/
+ cp -p $(d_min)/$(scriptdir)/config-$(VER)-$(DEB_HOST_MULTIARCH)/Makefile \
+ $(d_udeb)/$(scriptdir)/config-$(VER)-$(DEB_HOST_MULTIARCH)/
+ cp -p $(d_min)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)/pyconfig.h \
+ $(d_udeb)/usr/include/$(DEB_HOST_MULTIARCH)/$(PVER)/
cp -p $(d_min)/$(scriptdir)/site.py $(d_udeb)/$(scriptdir)/
cp -p debian/sitecustomize.py $(d_udeb)/etc/$(PVER)/
dh_link -p$(p_udeb) /etc/$(PVER)/sitecustomize.py \
@@ -1487,11 +1485,10 @@ stamps/stamp-patch:
done >> stamps/pxx
touch Parser/acceler.c Parser/grammar1.c Parser/listnode.c \
- Parser/node.c Parser/parser.c Parser/bitset.c Parser/metagrammar.c \
- Parser/firstsets.c Parser/grammar.c Parser/pgen.c
+ Parser/node.c Parser/parser.c Parser/token.c
+
touch Objects/obmalloc.c Python/dynamic_annotations.c \
- Python/mysnprintf.c Python/pyctype.c Parser/tokenizer_pgen.c \
- Parser/printgrammar.c Parser/parsetok_pgen.c Parser/pgenmain.c
+ Python/mysnprintf.c Python/pyctype.c
@sleep 1
touch Grammar/Grammar
@sleep 1
diff --git a/debian/source.lintian-overrides b/debian/source.lintian-overrides
deleted file mode 100644
index ba7e349..0000000
--- a/debian/source.lintian-overrides
+++ /dev/null
@@ -1,5 +0,0 @@
-# generated during the build
-python3.7 source: quilt-build-dep-but-no-series-file
-
-# wininst binaries included upstream, buildable with mingw64, not shipped
-python3.7 source: source-contains-prebuilt-windows-binary
diff --git a/debian/source.lintian-overrides.in b/debian/source.lintian-overrides.in
deleted file mode 100644
index 06ab070..0000000
--- a/debian/source.lintian-overrides.in
+++ /dev/null
@@ -1,5 +0,0 @@
-# generated during the build
-@PVER@ source: quilt-build-dep-but-no-series-file
-
-# wininst binaries included upstream, buildable with mingw64, not shipped
-@PVER@ source: source-contains-prebuilt-windows-binary
diff --git a/debian/source/lintian-overrides b/debian/source/lintian-overrides
new file mode 100644
index 0000000..421c3f3
--- /dev/null
+++ b/debian/source/lintian-overrides
@@ -0,0 +1,5 @@
+# generated during the build
+quilt-build-dep-but-no-series-file
+
+# in the source only, and can be built with mingw64
+source-contains-prebuilt-windows-binary
diff --git a/debian/tests/control b/debian/tests/control
index 6a9d7b2..35150ae 100644
--- a/debian/tests/control
+++ b/debian/tests/control
@@ -1,33 +1,35 @@
Tests: testsuite
Depends: build-essential,
locales-all,
- python3.7-dev,
- libpython3.7-testsuite,
+ python3.8-dev,
+ libpython3.8-testsuite,
python3-gdbm,
python3-distutils,
python3-tk,
- idle-python3.7,
+ idle-python3.8,
+ systemtap-sdt-dev,
# need to turn off apport
Restrictions: needs-root
Tests: testsuite-dbg
Depends: build-essential,
- locales-all, python3.7-dev,
- python3.7-dbg,
- libpython3.7-testsuite,
+ locales-all, python3.8-dev,
+ python3.8-dbg,
+ libpython3.8-testsuite,
python3-gdbm-dbg,
gdb,
python3-distutils,
python3-tk-dbg,
- idle-python3.7,
+ idle-python3.8,
+ systemtap-sdt-dev,
# need to turn off apport
Restrictions: needs-root
Tests: failing-tests
Depends: build-essential,
locales-all,
- python3.7-dev,
- libpython3.7-testsuite,
+ python3.8-dev,
+ libpython3.8-testsuite,
python3-gdbm,
python3-distutils,
# need to turn off apport
@@ -36,9 +38,9 @@ Restrictions: needs-root allow-stderr
Tests: failing-tests-dbg
Depends: build-essential,
locales-all,
- python3.7-dev,
- python3.7-dbg,
- libpython3.7-testsuite,
+ python3.8-dev,
+ python3.8-dbg,
+ libpython3.8-testsuite,
python3-gdbm-dbg,
gdb,
python3-distutils,
diff --git a/debian/tests/failing-tests b/debian/tests/failing-tests
index 1ee6f38..cdc4911 100755
--- a/debian/tests/failing-tests
+++ b/debian/tests/failing-tests
@@ -17,7 +17,7 @@ if [ "$(whoami)" = root ]; then
fi
tmphome=$ADTTMP/home
-mkdir -p $tmphome/.local/lib/python3.7/site-packages
+mkdir -p $tmphome/.local/lib/python3.8/site-packages
if [ -n "$su_user" ]; then
chmod go+rx $ADTTMP
chown $su_user:nogroup $tmphome
@@ -28,7 +28,7 @@ debian_dir=$(dirname $(dirname $0))
# no root access needed after this point
-TESTPYTHON="python3.7 -W default -bb -E -R -m test"
+TESTPYTHON="python3.8 -W default -bb -E -R -m test"
TESTEXCLUSIONS=""
. $debian_dir/tests/test-common.sh
@@ -44,7 +44,7 @@ echo "Running the failing tests with the standard interpreter:"
progressions=
for tst in $TESTEXCLUSIONS; do
if [ -f "$script" ]; then
- cmd="HOME=$tmphome python3.7 $script \"$log\" \"$TESTPYTHON $TESTOPTS $tst\""
+ cmd="HOME=$tmphome python3.8 $script \"$log\" \"$TESTPYTHON $TESTOPTS $tst\""
else
cmd="HOME=$tmphome $TESTPYTHON $TESTOPTS $tst"
fi
diff --git a/debian/tests/failing-tests-dbg b/debian/tests/failing-tests-dbg
index 8b2247f..1d1ddc2 100755
--- a/debian/tests/failing-tests-dbg
+++ b/debian/tests/failing-tests-dbg
@@ -17,7 +17,7 @@ if [ "$(whoami)" = root ]; then
fi
tmphome=$ADTTMP/home
-mkdir -p $tmphome/.local/lib/python3.7/site-packages
+mkdir -p $tmphome/.local/lib/python3.8/site-packages
if [ -n "$su_user" ]; then
chmod go+rx $ADTTMP
chown $su_user:nogroup $tmphome
@@ -28,7 +28,7 @@ debian_dir=$(dirname $(dirname $0))
# no root access needed after this point
-TESTPYTHON="python3.7dm -W default -bb -E -R -m test"
+TESTPYTHON="python3.8d -W default -bb -E -R -m test"
TESTEXCLUSIONS=""
. $debian_dir/tests/test-common.sh
@@ -44,7 +44,7 @@ echo "Running the failing tests with the debug enabled interpreter:"
progressions=
for tst in $TESTEXCLUSIONS; do
if [ -f "$script" ]; then
- cmd="HOME=$tmphome python3.7 $script \"$log\" \"$TESTPYTHON $TESTOPTS $tst\""
+ cmd="HOME=$tmphome python3.8 $script \"$log\" \"$TESTPYTHON $TESTOPTS $tst\""
else
cmd="HOME=$tmphome $TESTPYTHON $TESTOPTS $tst"
fi
diff --git a/debian/tests/testsuite b/debian/tests/testsuite
index ad6bfa0..2d9f334 100755
--- a/debian/tests/testsuite
+++ b/debian/tests/testsuite
@@ -26,7 +26,7 @@ fi
ls -la $ADTTMP
tmphome=$ADTTMP/home
-mkdir -p $tmphome/.local/lib/python3.7/site-packages
+mkdir -p $tmphome/.local/lib/python3.8/site-packages
if [ -n "$su_user" ]; then
chmod -R go+rx $ADTTMP
chown -R $su_user:nogroup $tmphome
@@ -36,7 +36,7 @@ debian_dir=$(dirname $(dirname $0))
# no root access needed after this point
-TESTPYTHON="python3.7 -W default -bb -E -R -m test"
+TESTPYTHON="python3.8 -W default -bb -E -R -m test"
TESTEXCLUSIONS="-x"
. $debian_dir/tests/test-common.sh
@@ -53,7 +53,7 @@ EXTRAENV="env -u https_proxy -u http_proxy -u no_proxy HOME=$tmphome"
script=$debian_dir/script.py
if [ -f "$script" ]; then
- cmd="$EXTRAENV python3.7 $script \"$log\" \"$TESTPYTHON $TESTOPTS $TESTEXCLUSIONS\""
+ cmd="$EXTRAENV python3.8 $script \"$log\" \"$TESTPYTHON $TESTOPTS $TESTEXCLUSIONS\""
else
cmd="$EXTRAENV $TESTPYTHON $TESTOPTS $TESTEXCLUSIONS"
fi
diff --git a/debian/tests/testsuite-dbg b/debian/tests/testsuite-dbg
index fce9eb9..98104df 100755
--- a/debian/tests/testsuite-dbg
+++ b/debian/tests/testsuite-dbg
@@ -17,7 +17,7 @@ if [ "$(whoami)" = root ]; then
fi
tmphome=$ADTTMP/home
-mkdir -p $tmphome/.local/lib/python3.7/site-packages
+mkdir -p $tmphome/.local/lib/python3.8/site-packages
if [ -n "$su_user" ]; then
chmod -R go+rx $ADTTMP
chown -R $su_user:nogroup $tmphome
@@ -28,7 +28,7 @@ debian_dir=$(dirname $(dirname $0))
# no root access needed after this point
-TESTPYTHON="python3.7dm -W default -bb -E -R -m test"
+TESTPYTHON="python3.8d -W default -bb -E -R -m test"
TESTEXCLUSIONS="-x"
. $debian_dir/tests/test-common.sh
@@ -45,7 +45,7 @@ EXTRAENV="env -u https_proxy -u http_proxy -u no_proxy HOME=$tmphome"
script=$debian_dir/script.py
if [ -f "$script" ]; then
- cmd="$EXTRAENV python3.7 $script \"$log\" \"$TESTPYTHON $TESTOPTS $TESTEXCLUSIONS\""
+ cmd="$EXTRAENV python3.8 $script \"$log\" \"$TESTPYTHON $TESTOPTS $TESTEXCLUSIONS\""
else
cmd="$EXTRAENV $TESTPYTHON $TESTOPTS $TESTEXCLUSIONS"
fi
diff --git a/debian/watch b/debian/watch
index b650dfb..566e236 100644
--- a/debian/watch
+++ b/debian/watch
@@ -1,3 +1,3 @@
version=3
opts=dversionmangle=s/.*\+//,uversionmangle=s/([abcr]+[1-9])$/~$1/ \
- http://www.python.org/ftp/python/3\.7(\.\d)?/Python-(3\.7[.\dabcr]*)\.tgz
+ http://www.python.org/ftp/python/3\.8(\.\d)?/Python-(3\.8[.\dabcr]*)\.tgz