diff --git a/Lib/profiling/sampling/_heatmap_assets/heatmap.js b/Lib/profiling/sampling/_heatmap_assets/heatmap.js
index 53928b7b20fb11..2da1103b82a52a 100644
--- a/Lib/profiling/sampling/_heatmap_assets/heatmap.js
+++ b/Lib/profiling/sampling/_heatmap_assets/heatmap.js
@@ -203,23 +203,6 @@ function applyLineColors() {
// Toggle Controls
// ============================================================================
-function updateToggleUI(toggleId, isOn) {
- const toggle = document.getElementById(toggleId);
- if (toggle) {
- const track = toggle.querySelector('.toggle-track');
- const labels = toggle.querySelectorAll('.toggle-label');
- if (isOn) {
- track.classList.add('on');
- labels[0].classList.remove('active');
- labels[1].classList.add('active');
- } else {
- track.classList.remove('on');
- labels[0].classList.add('active');
- labels[1].classList.remove('active');
- }
- }
-}
-
function toggleColdCode() {
coldCodeHidden = !coldCodeHidden;
applyHotFilter();
diff --git a/Lib/profiling/sampling/_heatmap_assets/heatmap_shared.js b/Lib/profiling/sampling/_heatmap_assets/heatmap_shared.js
index 84b13ca0a9682b..fb761335876b0f 100644
--- a/Lib/profiling/sampling/_heatmap_assets/heatmap_shared.js
+++ b/Lib/profiling/sampling/_heatmap_assets/heatmap_shared.js
@@ -43,33 +43,6 @@ function intensityToColor(intensity) {
// Theme Support
// ============================================================================
-// Get the preferred theme from localStorage or browser preference
-function getPreferredTheme() {
- const saved = localStorage.getItem('heatmap-theme');
- if (saved) return saved;
- return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
-}
-
-// Apply theme and update UI. Returns the applied theme.
-function applyTheme(theme) {
- document.documentElement.setAttribute('data-theme', theme);
- const btn = document.getElementById('theme-btn');
- if (btn) {
- btn.querySelector('.icon-moon').style.display = theme === 'dark' ? 'none' : '';
- btn.querySelector('.icon-sun').style.display = theme === 'dark' ? '' : 'none';
- }
- return theme;
-}
-
-// Toggle theme and save preference. Returns the new theme.
-function toggleAndSaveTheme() {
- const current = document.documentElement.getAttribute('data-theme') || 'light';
- const next = current === 'light' ? 'dark' : 'light';
- applyTheme(next);
- localStorage.setItem('heatmap-theme', next);
- return next;
-}
-
// Restore theme from localStorage, or use browser preference
function restoreUIState() {
applyTheme(getPreferredTheme());
diff --git a/Lib/profiling/sampling/_shared_assets/base.js b/Lib/profiling/sampling/_shared_assets/base.js
new file mode 100644
index 00000000000000..da8b5851c85f62
--- /dev/null
+++ b/Lib/profiling/sampling/_shared_assets/base.js
@@ -0,0 +1,58 @@
+// Tachyon Profiler - Shared JavaScript
+// Common utilities shared between flamegraph and heatmap views
+
+// ============================================================================
+// Theme Support
+// ============================================================================
+
+// Storage key for theme preference
+const THEME_STORAGE_KEY = 'tachyon-theme';
+
+// Get the preferred theme from localStorage or system preference
+function getPreferredTheme() {
+ const saved = localStorage.getItem(THEME_STORAGE_KEY);
+ if (saved) return saved;
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
+}
+
+// Apply theme and update UI
+function applyTheme(theme) {
+ document.documentElement.setAttribute('data-theme', theme);
+ const btn = document.getElementById('theme-btn');
+ if (btn) {
+ const moonIcon = btn.querySelector('.icon-moon');
+ const sunIcon = btn.querySelector('.icon-sun');
+ if (moonIcon) moonIcon.style.display = theme === 'dark' ? 'none' : '';
+ if (sunIcon) sunIcon.style.display = theme === 'dark' ? '' : 'none';
+ }
+}
+
+// Toggle theme and save preference. Returns the new theme.
+function toggleAndSaveTheme() {
+ const current = document.documentElement.getAttribute('data-theme') || 'light';
+ const next = current === 'light' ? 'dark' : 'light';
+ applyTheme(next);
+ localStorage.setItem(THEME_STORAGE_KEY, next);
+ return next;
+}
+
+// ============================================================================
+// Toggle Switch UI
+// ============================================================================
+
+function updateToggleUI(toggleId, isOn) {
+ const toggle = document.getElementById(toggleId);
+ if (toggle) {
+ const track = toggle.querySelector('.toggle-track');
+ const labels = toggle.querySelectorAll('.toggle-label');
+ if (isOn) {
+ track.classList.add('on');
+ labels[0].classList.remove('active');
+ labels[1].classList.add('active');
+ } else {
+ track.classList.remove('on');
+ labels[0].classList.add('active');
+ labels[1].classList.remove('active');
+ }
+ }
+}
diff --git a/Lib/profiling/sampling/heatmap_collector.py b/Lib/profiling/sampling/heatmap_collector.py
index b6d9ff79e8ceec..ea1beec70d39f8 100644
--- a/Lib/profiling/sampling/heatmap_collector.py
+++ b/Lib/profiling/sampling/heatmap_collector.py
@@ -204,7 +204,9 @@ def _load_templates(self):
self.file_css = css_content
# Load JS
- shared_js = (assets_dir / "heatmap_shared.js").read_text(encoding="utf-8")
+ base_js = (template_dir / "_shared_assets" / "base.js").read_text(encoding="utf-8")
+ heatmap_shared_js = (assets_dir / "heatmap_shared.js").read_text(encoding="utf-8")
+ shared_js = f"{base_js}\n{heatmap_shared_js}"
self.index_js = f"{shared_js}\n{(assets_dir / 'heatmap_index.js').read_text(encoding='utf-8')}"
self.file_js = f"{shared_js}\n{(assets_dir / 'heatmap.js').read_text(encoding='utf-8')}"
diff --git a/Lib/profiling/sampling/stack_collector.py b/Lib/profiling/sampling/stack_collector.py
index 5a3497a5408414..931bc2c487b55b 100644
--- a/Lib/profiling/sampling/stack_collector.py
+++ b/Lib/profiling/sampling/stack_collector.py
@@ -377,7 +377,9 @@ def _create_flamegraph_html(self, data):
html_template = (template_dir / "_flamegraph_assets" / "flamegraph_template.html").read_text(encoding="utf-8")
css_content = get_combined_css("flamegraph")
- js_content = (template_dir / "_flamegraph_assets" / "flamegraph.js").read_text(encoding="utf-8")
+ base_js = (template_dir / "_shared_assets" / "base.js").read_text(encoding="utf-8")
+ component_js = (template_dir / "_flamegraph_assets" / "flamegraph.js").read_text(encoding="utf-8")
+ js_content = f"{base_js}\n{component_js}"
# Inline first-party CSS/JS
html_template = html_template.replace(
From 728e4a075e3dae7e04edf90ad137a35073deb141 Mon Sep 17 00:00:00 2001
From: Kumar Aditya
Date: Tue, 10 Mar 2026 17:41:12 +0530
Subject: [PATCH 02/19] gh-142651: use `NonCallableMock._lock` for thread
safety of `call_count` (#142922)
---
Lib/unittest/mock.py | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py
index 34fd49bf56fbb6..64a01a0b713c61 100644
--- a/Lib/unittest/mock.py
+++ b/Lib/unittest/mock.py
@@ -1184,10 +1184,16 @@ def _increment_mock_call(self, /, *args, **kwargs):
# handle call_args
# needs to be set here so assertions on call arguments pass before
# execution in the case of awaited calls
- _call = _Call((args, kwargs), two=True)
- self.call_args = _call
- self.call_args_list.append(_call)
- self.call_count = len(self.call_args_list)
+ with NonCallableMock._lock:
+ # Lock is used here so that call_args_list and call_count are
+ # set atomically otherwise it is possible that by the time call_count
+ # is set another thread may have appended to call_args_list.
+ # The rest of this function relies on list.append being atomic and
+ # skips locking.
+ _call = _Call((args, kwargs), two=True)
+ self.call_args = _call
+ self.call_args_list.append(_call)
+ self.call_count = len(self.call_args_list)
# initial stuff for method_calls:
do_method_calls = self._mock_parent is not None
From 6024d3c6dadf73bcd0b234d2d97365486253f0ee Mon Sep 17 00:00:00 2001
From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
Date: Tue, 10 Mar 2026 14:30:46 +0200
Subject: [PATCH 03/19] Python 3.15.0a7
---
Doc/c-api/arg.rst | 4 +-
Doc/c-api/dict.rst | 2 +-
Doc/c-api/exceptions.rst | 2 +-
Doc/c-api/import.rst | 10 +-
Doc/c-api/object.rst | 2 +-
Doc/library/dataclasses.rst | 2 +-
Doc/library/email.headerregistry.rst | 2 +-
Doc/library/exceptions.rst | 2 +-
Doc/library/functions.rst | 6 +-
Doc/library/importlib.rst | 4 +-
Doc/library/mailbox.rst | 2 +-
Doc/library/marshal.rst | 2 +-
Doc/library/os.rst | 6 +-
Doc/library/re.rst | 6 +-
Doc/library/shutil.rst | 2 +-
Doc/library/stdtypes.rst | 4 +-
Doc/library/sys.rst | 8 +-
Doc/library/types.rst | 2 +-
Doc/library/unicodedata.rst | 2 +-
Doc/library/xml.etree.elementtree.rst | 4 +-
Doc/reference/lexical_analysis.rst | 2 +-
Doc/reference/simple_stmts.rst | 2 +-
Doc/using/cmdline.rst | 8 +-
Include/patchlevel.h | 4 +-
Lib/pydoc_data/module_docs.py | 2 +-
Lib/pydoc_data/topics.py | 410 +++---
Misc/NEWS.d/3.15.0a7.rst | 1212 +++++++++++++++++
...-07-21-00-33-38.gh-issue-136677.Y1_3ec.rst | 1 -
...-02-10-16-59-56.gh-issue-144675.Wrf3Es.rst | 1 -
...-02-10-18-26-04.gh-issue-144679.FIH73W.rst | 2 -
...-02-22-13-35-20.gh-issue-145110.KgWofW.rst | 2 -
...-02-27-18-10-02.gh-issue-144533.21fk9L.rst | 1 -
...-01-27-18-15-15.gh-issue-144175.qHK5Jf.rst | 3 -
...-02-10-14-49-49.gh-issue-121617.57vMqa.rst | 3 -
...-02-12-19-03-31.gh-issue-141510.U_1tjz.rst | 9 -
...-02-18-15-12-34.gh-issue-144981.4ZdM63.rst | 3 -
...-02-24-14-46-05.gh-issue-144748.uhnFtE.rst | 2 -
...-03-03-14-59-57.gh-issue-142417.HiNP5j.rst | 2 -
...3-07-26-00-03-00.gh-issue-80667.N7Dh8B.rst | 2 -
...-02-19-21-06-30.gh-issue-130327.z3TaR8.rst | 2 -
...-09-15-13-28-48.gh-issue-138912.61EYbn.rst | 1 -
...-11-09-15-44-58.gh-issue-141226.KTb_3F.rst | 3 -
...-12-06-15-46-32.gh-issue-142349.IdTuYL.rst | 1 -
...2-06-21-45-52.gh-issue-144438.GI_uB1LR.rst | 2 -
...-02-08-13-14-00.gh-issue-144569.pjlJVe.rst | 1 -
...-02-11-11-28-25.gh-issue-144702.XjFumv.rst | 2 -
...-02-11-13-30-11.gh-issue-143300.yjB63-.rst | 1 -
...-02-12-12-39-50.gh-issue-144681.Ns2OT2.rst | 1 -
...-02-12-19-01-13.gh-issue-141510.KlKjZg.rst | 1 -
...-02-13-12-00-00.gh-issue-144759.d3qYpe.rst | 4 -
...-02-13-18-30-59.gh-issue-144766.JGu3x3.rst | 1 -
...-02-16-12-28-43.gh-issue-144872.k9_Q30.rst | 1 -
...-02-17-18-27-28.gh-issue-144914.DcXO4m.rst | 1 -
...-02-17-21-04-03.gh-issue-100239.LyVabQ.rst | 2 -
...-02-17-22-27-11.gh-issue-141510.-4yYsf.rst | 2 -
...-02-18-21-44-39.gh-issue-141510.7LST2O.rst | 1 -
...-02-19-12-49-15.gh-issue-144995.Ob2oYJ.rst | 2 -
...-02-21-09-47-45.gh-issue-145058.e-RBw-.rst | 2 -
...-02-21-12-16-46.gh-issue-145055.VyT-zI.rst | 2 -
...-02-22-07-51-10.gh-issue-145064.iIMGKA.rst | 1 -
...-02-22-19-05-03.gh-issue-145118.bU6Sic.rst | 1 -
...20-15-00.gh-issue-144015.pystrhex_simd.rst | 5 -
...-02-22-22-05-09.gh-issue-145118.TaKMJE.rst | 1 -
...-02-23-23-18-28.gh-issue-145142.T-XbVe.rst | 2 -
...-02-24-18-30-56.gh-issue-145187.YjPu1Z.rst | 2 -
...-02-25-15-02-08.gh-issue-145197.G6hAUk.rst | 1 -
...-02-26-12-00-00.gh-issue-130555.TMSOIu.rst | 3 -
...-02-26-18-00-00.gh-issue-145241.hL2k9Q.rst | 3 -
...-02-26-20-51-54.gh-issue-145273.B5QcUp.rst | 2 -
...-02-26-21-07-38.gh-issue-145275.qE-3O1.rst | 3 -
...-02-26-21-36-00.gh-issue-145234.w0mQ9n.rst | 5 -
...-02-28-16-46-17.gh-issue-145376.lG5u1a.rst | 1 -
...-03-01-13-37-31.gh-issue-145335.e36kPJ.rst | 2 -
...-03-05-16-16-17.gh-issue-143055.qDUFlY.rst | 2 -
...3-05-19-10-56.gh-issue-145566.H4RupyYN.rst | 2 -
...-03-06-01-36-20.gh-issue-116738.OWVWRx.rst | 2 -
...3-06-21-05-05.gh-issue-145615.NKXXZgDW.rst | 2 -
...-03-09-18-52-03.gh-issue-145701.79KQyO.rst | 3 -
...-08-02-18-59-01.gh-issue-136246.RIK7nE.rst | 3 -
...-01-06-16-04-08.gh-issue-110937.SyO5lk.rst | 1 -
...-03-03-08-18-00.gh-issue-145450.VI7GXj.rst | 1 -
.../2017-12-15-09-32-57.bpo-32234.XaOkhR.rst | 2 -
.../2018-05-11-12-26-16.bpo-3405.CacMw9.rst | 3 -
.../2020-04-07-05-09-34.bpo-40212.oPYeBs.rst | 1 -
.../2020-04-10-14-29-53.bpo-40243.85HRib.rst | 1 -
.../2022-02-05-00-15-03.bpo-42353.0ebVGG.rst | 10 -
...3-02-05-20-02-30.gh-issue-80667.7LmzeA.rst | 1 -
...-09-30-15-31-59.gh-issue-124748.KYzYFp.rst | 2 -
...-06-24-19-07-18.gh-issue-135883.38cePA.rst | 2 -
...-08-04-23-20-43.gh-issue-137335.IIjDJN.rst | 2 -
...-10-10-14-08-58.gh-issue-139899.09leRY.rst | 3 -
...2-06-16-14-18.gh-issue-142352.pW5HLX88.rst | 4 -
...-12-16-13-34-48.gh-issue-142787.wNitJX.rst | 2 -
...-12-18-00-14-16.gh-issue-142781.gcOeYF.rst | 2 -
...-01-01-05-26-00.gh-issue-143304.Kv7x9Q.rst | 1 -
...6-01-10-22-58-30.gh-issue-85809.0eW4wt.rst | 1 -
...-01-11-13-03-32.gh-issue-142516.u7An-s.rst | 2 -
...-01-11-16-59-22.gh-issue-143698.b-Cpeb.rst | 3 -
...-01-11-18-35-52.gh-issue-143698.gXDzsJ.rst | 3 -
...-01-12-19-39-57.gh-issue-140652.HvM9Bl.rst | 1 -
...-01-17-08-44-25.gh-issue-143637.qyPqDo.rst | 1 -
...-02-03-19-57-41.gh-issue-144316.wop870.rst | 1 -
...-02-07-16-31-42.gh-issue-144285.iyH9iL.rst | 3 -
...-02-07-16-37-42.gh-issue-144475.8tFEXw.rst | 3 -
...-02-08-17-09-10.gh-issue-144321.w58PhQ.rst | 3 -
...-02-09-02-16-36.gh-issue-144615.s04x4n.rst | 3 -
...6-02-10-16-56-05.gh-issue-66305.PZ6GN8.rst | 3 -
...-02-10-22-05-51.gh-issue-144156.UbrC7F.rst | 1 -
...-02-12-17-56-17.gh-issue-117865.jE1ema.rst | 1 -
...3-00-00-00.gh-issue-142224.BidiMissing.rst | 2 -
...-02-13-11-14-18.gh-issue-144763.cDwnEE.rst | 2 -
...-02-13-14-20-10.gh-issue-144782.0Y8TKj.rst | 1 -
...-02-14-14-56-44.gh-issue-140715.AbSheM.rst | 1 -
...-02-15-00-00-00.gh-issue-144833.TUelo1.rst | 3 -
...-02-15-12-02-20.gh-issue-144835.w_oS_J.rst | 2 -
...-02-17-11-15-17.gh-issue-141510.ZmqEUb.rst | 2 -
...-02-17-11-28-37.gh-issue-141510.OpAz0M.rst | 2 -
...-02-18-00-00-00.gh-issue-144809.nYpEUx.rst | 1 -
...-02-18-13-45-00.gh-issue-144777.R97q0a.rst | 1 -
...9-00-00-00.gh-issue-144986.atexit-leak.rst | 2 -
...6-02-19-10-57-40.gh-issue-88091.N7qGV-.rst | 1 -
...-02-19-15-42-06.gh-issue-134872.sjYX1-.rst | 1 -
...-02-19-16-26-08.gh-issue-141510.4Qxy8_.rst | 3 -
...-02-19-17-50-47.gh-issue-145006.9gqA0Q.rst | 2 -
...-02-19-18-02-54.gh-issue-141510.qzvYsO.rst | 3 -
...-02-19-20-54-25.gh-issue-145033.X9EBPQ.rst | 2 -
...6-02-20-13-03-10.gh-issue-66802.OYcAi_.rst | 3 -
...-02-21-17-34-53.gh-issue-123853.6RUwWh.rst | 1 -
...-02-23-20-52-55.gh-issue-145158.vWJtxI.rst | 2 -
...6-02-27-18-04-51.gh-issue-76007.17idfK.rst | 2 -
...-02-27-19-00-26.gh-issue-145301.2Wih4b.rst | 2 -
...-02-28-00-55-00.gh-issue-145301.Lk2bRl.rst | 2 -
...-03-02-19-41-39.gh-issue-145376.OOzSOh.rst | 2 -
...-03-02-20-08-09.gh-issue-145335.lVTBvd.rst | 5 -
...-03-03-11-49-44.gh-issue-145417.m_HxIL.rst | 4 -
...-03-05-16-06-09.gh-issue-141510.dFPAQS.rst | 2 -
...-03-05-19-01-28.gh-issue-145551.gItPRl.rst | 1 -
...-03-07-15-00-00.gh-issue-145623.2Y7LzT.rst | 3 -
...-01-31-21-56-54.gh-issue-144370.fp9m8t.rst | 2 -
...-03-04-18-59-17.gh-issue-145506.6hwvEh.rst | 2 -
...-02-12-12-12-00.gh-issue-144739.-fx1tN.rst | 3 -
...-03-04-17-39-15.gh-issue-144741.0RHhBF.rst | 3 -
...-02-13-11-07-51.gh-issue-144551.ENtMYD.rst | 1 -
...-02-27-10-57-20.gh-issue-145307.ueoT7j.rst | 2 -
...-03-10-09-46-44.gh-issue-145731.5uEGgb.rst | 1 -
README.rst | 2 +-
146 files changed, 1513 insertions(+), 454 deletions(-)
create mode 100644 Misc/NEWS.d/3.15.0a7.rst
delete mode 100644 Misc/NEWS.d/next/Build/2025-07-21-00-33-38.gh-issue-136677.Y1_3ec.rst
delete mode 100644 Misc/NEWS.d/next/Build/2026-02-10-16-59-56.gh-issue-144675.Wrf3Es.rst
delete mode 100644 Misc/NEWS.d/next/Build/2026-02-10-18-26-04.gh-issue-144679.FIH73W.rst
delete mode 100644 Misc/NEWS.d/next/Build/2026-02-22-13-35-20.gh-issue-145110.KgWofW.rst
delete mode 100644 Misc/NEWS.d/next/Build/2026-02-27-18-10-02.gh-issue-144533.21fk9L.rst
delete mode 100644 Misc/NEWS.d/next/C_API/2026-01-27-18-15-15.gh-issue-144175.qHK5Jf.rst
delete mode 100644 Misc/NEWS.d/next/C_API/2026-02-10-14-49-49.gh-issue-121617.57vMqa.rst
delete mode 100644 Misc/NEWS.d/next/C_API/2026-02-12-19-03-31.gh-issue-141510.U_1tjz.rst
delete mode 100644 Misc/NEWS.d/next/C_API/2026-02-18-15-12-34.gh-issue-144981.4ZdM63.rst
delete mode 100644 Misc/NEWS.d/next/C_API/2026-02-24-14-46-05.gh-issue-144748.uhnFtE.rst
delete mode 100644 Misc/NEWS.d/next/C_API/2026-03-03-14-59-57.gh-issue-142417.HiNP5j.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2023-07-26-00-03-00.gh-issue-80667.N7Dh8B.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-02-19-21-06-30.gh-issue-130327.z3TaR8.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-28-48.gh-issue-138912.61EYbn.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-11-09-15-44-58.gh-issue-141226.KTb_3F.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-06-15-46-32.gh-issue-142349.IdTuYL.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-06-21-45-52.gh-issue-144438.GI_uB1LR.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-08-13-14-00.gh-issue-144569.pjlJVe.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-11-11-28-25.gh-issue-144702.XjFumv.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-11-13-30-11.gh-issue-143300.yjB63-.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-12-39-50.gh-issue-144681.Ns2OT2.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-19-01-13.gh-issue-141510.KlKjZg.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-13-12-00-00.gh-issue-144759.d3qYpe.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-13-18-30-59.gh-issue-144766.JGu3x3.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-16-12-28-43.gh-issue-144872.k9_Q30.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-18-27-28.gh-issue-144914.DcXO4m.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-21-04-03.gh-issue-100239.LyVabQ.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-22-27-11.gh-issue-141510.-4yYsf.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-18-21-44-39.gh-issue-141510.7LST2O.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-19-12-49-15.gh-issue-144995.Ob2oYJ.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-21-09-47-45.gh-issue-145058.e-RBw-.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-21-12-16-46.gh-issue-145055.VyT-zI.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-07-51-10.gh-issue-145064.iIMGKA.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-19-05-03.gh-issue-145118.bU6Sic.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-20-15-00.gh-issue-144015.pystrhex_simd.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-22-05-09.gh-issue-145118.TaKMJE.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-23-23-18-28.gh-issue-145142.T-XbVe.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-24-18-30-56.gh-issue-145187.YjPu1Z.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-25-15-02-08.gh-issue-145197.G6hAUk.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-12-00-00.gh-issue-130555.TMSOIu.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-18-00-00.gh-issue-145241.hL2k9Q.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-20-51-54.gh-issue-145273.B5QcUp.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-21-07-38.gh-issue-145275.qE-3O1.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-21-36-00.gh-issue-145234.w0mQ9n.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-28-16-46-17.gh-issue-145376.lG5u1a.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-01-13-37-31.gh-issue-145335.e36kPJ.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-05-16-16-17.gh-issue-143055.qDUFlY.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-05-19-10-56.gh-issue-145566.H4RupyYN.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-06-01-36-20.gh-issue-116738.OWVWRx.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-06-21-05-05.gh-issue-145615.NKXXZgDW.rst
delete mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-03-09-18-52-03.gh-issue-145701.79KQyO.rst
delete mode 100644 Misc/NEWS.d/next/Documentation/2025-08-02-18-59-01.gh-issue-136246.RIK7nE.rst
delete mode 100644 Misc/NEWS.d/next/Documentation/2026-01-06-16-04-08.gh-issue-110937.SyO5lk.rst
delete mode 100644 Misc/NEWS.d/next/Documentation/2026-03-03-08-18-00.gh-issue-145450.VI7GXj.rst
delete mode 100644 Misc/NEWS.d/next/Library/2017-12-15-09-32-57.bpo-32234.XaOkhR.rst
delete mode 100644 Misc/NEWS.d/next/Library/2018-05-11-12-26-16.bpo-3405.CacMw9.rst
delete mode 100644 Misc/NEWS.d/next/Library/2020-04-07-05-09-34.bpo-40212.oPYeBs.rst
delete mode 100644 Misc/NEWS.d/next/Library/2020-04-10-14-29-53.bpo-40243.85HRib.rst
delete mode 100644 Misc/NEWS.d/next/Library/2022-02-05-00-15-03.bpo-42353.0ebVGG.rst
delete mode 100644 Misc/NEWS.d/next/Library/2023-02-05-20-02-30.gh-issue-80667.7LmzeA.rst
delete mode 100644 Misc/NEWS.d/next/Library/2024-09-30-15-31-59.gh-issue-124748.KYzYFp.rst
delete mode 100644 Misc/NEWS.d/next/Library/2025-06-24-19-07-18.gh-issue-135883.38cePA.rst
delete mode 100644 Misc/NEWS.d/next/Library/2025-08-04-23-20-43.gh-issue-137335.IIjDJN.rst
delete mode 100644 Misc/NEWS.d/next/Library/2025-10-10-14-08-58.gh-issue-139899.09leRY.rst
delete mode 100644 Misc/NEWS.d/next/Library/2025-12-06-16-14-18.gh-issue-142352.pW5HLX88.rst
delete mode 100644 Misc/NEWS.d/next/Library/2025-12-16-13-34-48.gh-issue-142787.wNitJX.rst
delete mode 100644 Misc/NEWS.d/next/Library/2025-12-18-00-14-16.gh-issue-142781.gcOeYF.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-01-01-05-26-00.gh-issue-143304.Kv7x9Q.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-01-10-22-58-30.gh-issue-85809.0eW4wt.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-01-11-13-03-32.gh-issue-142516.u7An-s.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-01-11-16-59-22.gh-issue-143698.b-Cpeb.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-01-11-18-35-52.gh-issue-143698.gXDzsJ.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-01-12-19-39-57.gh-issue-140652.HvM9Bl.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-01-17-08-44-25.gh-issue-143637.qyPqDo.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-03-19-57-41.gh-issue-144316.wop870.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-07-16-31-42.gh-issue-144285.iyH9iL.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-07-16-37-42.gh-issue-144475.8tFEXw.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-08-17-09-10.gh-issue-144321.w58PhQ.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-09-02-16-36.gh-issue-144615.s04x4n.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-10-16-56-05.gh-issue-66305.PZ6GN8.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-10-22-05-51.gh-issue-144156.UbrC7F.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-12-17-56-17.gh-issue-117865.jE1ema.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-13-00-00-00.gh-issue-142224.BidiMissing.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-13-11-14-18.gh-issue-144763.cDwnEE.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-13-14-20-10.gh-issue-144782.0Y8TKj.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-14-14-56-44.gh-issue-140715.AbSheM.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-15-00-00-00.gh-issue-144833.TUelo1.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-15-12-02-20.gh-issue-144835.w_oS_J.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-17-11-15-17.gh-issue-141510.ZmqEUb.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-17-11-28-37.gh-issue-141510.OpAz0M.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-18-00-00-00.gh-issue-144809.nYpEUx.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-18-13-45-00.gh-issue-144777.R97q0a.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-19-00-00-00.gh-issue-144986.atexit-leak.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-19-10-57-40.gh-issue-88091.N7qGV-.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-19-15-42-06.gh-issue-134872.sjYX1-.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-19-16-26-08.gh-issue-141510.4Qxy8_.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-19-17-50-47.gh-issue-145006.9gqA0Q.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-19-18-02-54.gh-issue-141510.qzvYsO.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-19-20-54-25.gh-issue-145033.X9EBPQ.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-20-13-03-10.gh-issue-66802.OYcAi_.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-21-17-34-53.gh-issue-123853.6RUwWh.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-23-20-52-55.gh-issue-145158.vWJtxI.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-27-18-04-51.gh-issue-76007.17idfK.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-27-19-00-26.gh-issue-145301.2Wih4b.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-02-28-00-55-00.gh-issue-145301.Lk2bRl.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-03-02-19-41-39.gh-issue-145376.OOzSOh.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-03-02-20-08-09.gh-issue-145335.lVTBvd.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-03-03-11-49-44.gh-issue-145417.m_HxIL.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-03-05-16-06-09.gh-issue-141510.dFPAQS.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-03-05-19-01-28.gh-issue-145551.gItPRl.rst
delete mode 100644 Misc/NEWS.d/next/Library/2026-03-07-15-00-00.gh-issue-145623.2Y7LzT.rst
delete mode 100644 Misc/NEWS.d/next/Security/2026-01-31-21-56-54.gh-issue-144370.fp9m8t.rst
delete mode 100644 Misc/NEWS.d/next/Security/2026-03-04-18-59-17.gh-issue-145506.6hwvEh.rst
delete mode 100644 Misc/NEWS.d/next/Tests/2026-02-12-12-12-00.gh-issue-144739.-fx1tN.rst
delete mode 100644 Misc/NEWS.d/next/Tests/2026-03-04-17-39-15.gh-issue-144741.0RHhBF.rst
delete mode 100644 Misc/NEWS.d/next/Windows/2026-02-13-11-07-51.gh-issue-144551.ENtMYD.rst
delete mode 100644 Misc/NEWS.d/next/Windows/2026-02-27-10-57-20.gh-issue-145307.ueoT7j.rst
delete mode 100644 Misc/NEWS.d/next/Windows/2026-03-10-09-46-44.gh-issue-145731.5uEGgb.rst
diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst
index 4a3a6347239c4f..58456a36b96c15 100644
--- a/Doc/c-api/arg.rst
+++ b/Doc/c-api/arg.rst
@@ -524,7 +524,7 @@ API Functions
Returns true on success; on failure, it returns false and raises the
appropriate exception.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. c:function:: int PyArg_ParseArrayAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames, const char *format, const char * const *kwlist, ...)
@@ -535,7 +535,7 @@ API Functions
Returns true on success; on failure, it returns false and raises the
appropriate exception.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. c:function:: int PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)
diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst
index 371761573e97de..d63c26865899cc 100644
--- a/Doc/c-api/dict.rst
+++ b/Doc/c-api/dict.rst
@@ -495,7 +495,7 @@ Dictionary view objects
Frozen dictionary objects
^^^^^^^^^^^^^^^^^^^^^^^^^
-.. versionadded:: next
+.. versionadded:: 3.15
.. c:var:: PyTypeObject PyFrozenDict_Type
diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst
index aef191d3a29ac6..8ecd7c62517104 100644
--- a/Doc/c-api/exceptions.rst
+++ b/Doc/c-api/exceptions.rst
@@ -716,7 +716,7 @@ Signal Handling
This function may now execute a remote debugger script, if remote
debugging is enabled.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
The exception set by :c:func:`PyThreadState_SetAsyncExc` is now raised.
diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst
index 04b5adb9a8f43d..367490732b994f 100644
--- a/Doc/c-api/import.rst
+++ b/Doc/c-api/import.rst
@@ -350,14 +350,14 @@ Importing Modules
Gets the current lazy imports mode.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. c:function:: PyObject* PyImport_GetLazyImportsFilter()
Return a :term:`strong reference` to the current lazy imports filter,
or ``NULL`` if none exists. This function always succeeds.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. c:function:: int PyImport_SetLazyImportsMode(PyImport_LazyImportsMode mode)
@@ -366,7 +366,7 @@ Importing Modules
This function always returns ``0``.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. c:function:: int PyImport_SetLazyImportsFilter(PyObject *filter)
@@ -377,7 +377,7 @@ Importing Modules
Return ``0`` on success and ``-1`` with an exception set otherwise.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. c:type:: PyImport_LazyImportsMode
@@ -396,7 +396,7 @@ Importing Modules
Disable lazy imports entirely. Even explicit ``lazy`` statements become
eager imports.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. c:function:: PyObject* PyImport_CreateModuleFromInitfunc(PyObject *spec, PyObject* (*initfunc)(void))
diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst
index f71bfebdb2a19a..15a4b55eab82f0 100644
--- a/Doc/c-api/object.rst
+++ b/Doc/c-api/object.rst
@@ -817,4 +817,4 @@ Object Protocol
Returns 1 if the object was made immortal and returns 0 if it was not.
This function cannot fail.
- .. versionadded:: next
+ .. versionadded:: 3.15
diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst
index 447f05e67d8418..fd8e0c0bea1cb1 100644
--- a/Doc/library/dataclasses.rst
+++ b/Doc/library/dataclasses.rst
@@ -330,7 +330,7 @@ Module contents
:attr:`!C.t` will be ``20``, and the class attributes :attr:`!C.x` and
:attr:`!C.y` will not be set.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
If *metadata* is ``None``, use an empty :class:`frozendict`, instead
of a :func:`~types.MappingProxyType` of an empty :class:`dict`.
diff --git a/Doc/library/email.headerregistry.rst b/Doc/library/email.headerregistry.rst
index 8dfcd492f0a763..c6924a0ac29c97 100644
--- a/Doc/library/email.headerregistry.rst
+++ b/Doc/library/email.headerregistry.rst
@@ -266,7 +266,7 @@ variant, :attr:`~.BaseHeader.max_count` is set to 1.
A dictionary mapping parameter names to parameter values.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
It is now a :class:`frozendict` instead of a
:class:`types.MappingProxyType`.
diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst
index 33f37bdf1fc1cd..3db3c7a13503f4 100644
--- a/Doc/library/exceptions.rst
+++ b/Doc/library/exceptions.rst
@@ -271,7 +271,7 @@ The following exceptions are the exceptions that are usually raised.
A subclass of :exc:`ImportError` which is raised when a lazy import fails
because it (directly or indirectly) tries to import itself.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. exception:: IndexError
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index af53b57dc9d2a7..1d83cb6f2bb688 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -660,7 +660,7 @@ are always available. They are listed here in alphabetical order.
The semantics of the default *locals* namespace have been adjusted as
described for the :func:`locals` builtin.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
*globals* can now be a :class:`frozendict`.
@@ -741,7 +741,7 @@ are always available. They are listed here in alphabetical order.
The semantics of the default *locals* namespace have been adjusted as
described for the :func:`locals` builtin.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
*globals* can now be a :class:`frozendict`.
@@ -2099,7 +2099,7 @@ are always available. They are listed here in alphabetical order.
Subclasses of :class:`!type` which don't override ``type.__new__`` may no
longer use the one-argument form to get the type of an object.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
*dict* can now be a :class:`frozendict`.
diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst
index d5036a0fe7510b..785f6c614b4391 100644
--- a/Doc/library/importlib.rst
+++ b/Doc/library/importlib.rst
@@ -292,7 +292,7 @@ ABC hierarchy::
instead of a :class:`list` or other
:class:`collection ` type.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. class:: PathEntryFinder
@@ -346,7 +346,7 @@ ABC hierarchy::
instead of a :class:`list` or other
:class:`collection ` type.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. class:: Loader
diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst
index b9a55a03dc8ae7..5b9741bdbcad19 100644
--- a/Doc/library/mailbox.rst
+++ b/Doc/library/mailbox.rst
@@ -80,7 +80,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.
returns the mailbox object as the context object, and at context end calls :meth:`close`,
thereby releasing the lock.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
Support for the :keyword:`with` statement was added.
:class:`!Mailbox` instances have the following methods:
diff --git a/Doc/library/marshal.rst b/Doc/library/marshal.rst
index 25902622b8730b..4fe34f0a3a3f91 100644
--- a/Doc/library/marshal.rst
+++ b/Doc/library/marshal.rst
@@ -72,7 +72,7 @@ this module. The following types are supported:
Added format version 5, which allows marshalling slices.
-.. versionchanged:: next
+.. versionchanged:: 3.15
Added format version 6, which allows marshalling :class:`frozendict`.
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index a22afdec516bb4..940d04ccc925cd 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -2409,7 +2409,7 @@ features:
.. versionchanged:: 3.6
Accepts a :term:`path-like object`.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
``os.listdir(-1)`` now fails with ``OSError(errno.EBADF)`` rather than
listing the current directory.
@@ -2943,7 +2943,7 @@ features:
.. versionchanged:: 3.7
Added support for :ref:`file descriptors ` on Unix.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
``os.scandir(-1)`` now fails with ``OSError(errno.EBADF)`` rather than
listing the current directory.
@@ -4582,7 +4582,7 @@ These functions are all available on Linux only.
.. versionchanged:: 3.6
Accepts a :term:`path-like object`.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
``os.listxattr(-1)`` now fails with ``OSError(errno.EBADF)`` rather than
listing extended attributes of the current directory.
diff --git a/Doc/library/re.rst b/Doc/library/re.rst
index 7edb85ca507722..43fb7295876fe1 100644
--- a/Doc/library/re.rst
+++ b/Doc/library/re.rst
@@ -954,7 +954,7 @@ Functions
:func:`~re.match`. Use that name when you need to retain compatibility with
older Python versions.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
The alternate :func:`~re.prefixmatch` name of this API was added as a
more explicitly descriptive name than :func:`~re.match`. Use it to better
express intent. The norm in other languages and regular expression
@@ -1309,7 +1309,7 @@ Regular Expression Objects
:meth:`~Pattern.match`. Use that name when you need to retain compatibility
with older Python versions.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
The alternate :meth:`~Pattern.prefixmatch` name of this API was added as
a more explicitly descriptive name than :meth:`~Pattern.match`. Use it to
better express intent. The norm in other languages and regular expression
@@ -1781,7 +1781,7 @@ We **do not** plan to deprecate and remove the older *match* name,
as it has been used in code for over 30 years.
Code supporting older versions of Python should continue to use *match*.
-.. versionadded:: next
+.. versionadded:: 3.15
Making a Phonebook
^^^^^^^^^^^^^^^^^^
diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst
index 0666fcfde61e61..d289ba58c24065 100644
--- a/Doc/library/shutil.rst
+++ b/Doc/library/shutil.rst
@@ -669,7 +669,7 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
This function is now made thread-safe during creation of standard
``.zip`` and tar archives.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
Accepts a :term:`path-like object` for *base_name*, *root_dir* and
*base_dir*.
diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
index c930b876b3ccbf..e16954b12a6c2b 100644
--- a/Doc/library/stdtypes.rst
+++ b/Doc/library/stdtypes.rst
@@ -2385,7 +2385,7 @@ expression support in the :mod:`re` module).
the same position in *to*. If there is a third argument, it must be a string,
whose characters will be mapped to ``None`` in the result.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
*dict* can now be a :class:`frozendict`.
@@ -5665,7 +5665,7 @@ Frozen dictionaries
:class:`!frozendict` is not a :class:`!dict` subclass but inherits directly
from ``object``.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. _typecontextmanager:
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index 4c76feafc9b492..b1461b0cbaf528 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -924,7 +924,7 @@ always available. Unless explicitly noted otherwise, all variables are read-only
See also :func:`set_lazy_imports` and :pep:`810`.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. function:: get_lazy_imports_filter()
@@ -937,7 +937,7 @@ always available. Unless explicitly noted otherwise, all variables are read-only
:func:`set_lazy_imports_filter` for details on the filter function
signature.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. function:: getrefcount(object)
@@ -1770,7 +1770,7 @@ always available. Unless explicitly noted otherwise, all variables are read-only
See also :func:`get_lazy_imports` and :pep:`810`.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. function:: set_lazy_imports_filter(filter)
@@ -1800,7 +1800,7 @@ always available. Unless explicitly noted otherwise, all variables are read-only
See also :func:`get_lazy_imports_filter` and :pep:`810`.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. function:: setprofile(profilefunc)
diff --git a/Doc/library/types.rst b/Doc/library/types.rst
index 01f4df3c89091f..74898baa521bd6 100644
--- a/Doc/library/types.rst
+++ b/Doc/library/types.rst
@@ -350,7 +350,7 @@ Standard names are defined for the following types:
actually accessed. This type can be used to detect lazy imports
programmatically.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. seealso:: :pep:`810`
diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst
index d5f0405efbecc6..f5c11fd849f58b 100644
--- a/Doc/library/unicodedata.rst
+++ b/Doc/library/unicodedata.rst
@@ -139,7 +139,7 @@ following functions:
>>> unicodedata.block('S')
'Basic Latin'
- .. versionadded:: next
+ .. versionadded:: 3.15
.. function:: mirrored(chr, /)
diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst
index 45abf5b1e736b3..919d4c595bf793 100644
--- a/Doc/library/xml.etree.elementtree.rst
+++ b/Doc/library/xml.etree.elementtree.rst
@@ -702,7 +702,7 @@ Functions
attributes. *extra* contains additional attributes, given as keyword
arguments. Returns an element instance.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
*attrib* can now be a :class:`frozendict`.
@@ -890,7 +890,7 @@ Element Objects
an optional dictionary, containing element attributes. *extra* contains
additional attributes, given as keyword arguments.
- .. versionchanged:: next
+ .. versionchanged:: 3.15
*attrib* can now be a :class:`frozendict`.
diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst
index 5c931683db100a..ae541680c534d6 100644
--- a/Doc/reference/lexical_analysis.rst
+++ b/Doc/reference/lexical_analysis.rst
@@ -469,7 +469,7 @@ identifier names.
.. versionchanged:: 3.12
``type`` is now a soft keyword.
-.. versionchanged:: next
+.. versionchanged:: 3.15
``lazy`` is now a soft keyword.
.. index::
diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst
index 9ada6f047843b4..9b84c2e9ac7017 100644
--- a/Doc/reference/simple_stmts.rst
+++ b/Doc/reference/simple_stmts.rst
@@ -918,7 +918,7 @@ used, not at the import statement itself.
See :pep:`810` for the full specification of lazy imports.
-.. versionadded:: next
+.. versionadded:: 3.15
.. _future:
diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst
index cc3d2f154ed754..5c3d44395c0039 100644
--- a/Doc/using/cmdline.rst
+++ b/Doc/using/cmdline.rst
@@ -692,7 +692,7 @@ Miscellaneous options
If false (``0``) suppress these warnings. Set to true by default.
See also :envvar:`PYTHON_PATHCONFIG_WARNINGS`.
- .. versionadded:: next
+ .. versionadded:: 3.15
* :samp:`-X tlbc={0,1}` enables (1, the default) or disables (0) thread-local
bytecode in builds configured with :option:`--disable-gil`. When disabled,
@@ -707,7 +707,7 @@ Miscellaneous options
(the default) respects the ``lazy`` keyword in source code.
See also :envvar:`PYTHON_LAZY_IMPORTS`.
- .. versionadded:: next
+ .. versionadded:: 3.15
It also allows passing arbitrary values and retrieving them through the
:data:`sys._xoptions` dictionary.
@@ -1367,7 +1367,7 @@ conflict.
stderr. If false (``0``) suppress these warnings. Set to true by default.
See also :option:`-X pathconfig_warnings<-X>`.
- .. versionadded:: next
+ .. versionadded:: 3.15
.. envvar:: PYTHON_JIT
@@ -1396,7 +1396,7 @@ conflict.
See also the :option:`-X lazy_imports <-X>` command-line option.
- .. versionadded:: next
+ .. versionadded:: 3.15
Debug-mode variables
~~~~~~~~~~~~~~~~~~~~
diff --git a/Include/patchlevel.h b/Include/patchlevel.h
index 50d5ac4a73c1d8..3cc12a2b2d3888 100644
--- a/Include/patchlevel.h
+++ b/Include/patchlevel.h
@@ -24,10 +24,10 @@
#define PY_MINOR_VERSION 15
#define PY_MICRO_VERSION 0
#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_ALPHA
-#define PY_RELEASE_SERIAL 6
+#define PY_RELEASE_SERIAL 7
/* Version as a string */
-#define PY_VERSION "3.15.0a6+"
+#define PY_VERSION "3.15.0a7"
/*--end constants--*/
diff --git a/Lib/pydoc_data/module_docs.py b/Lib/pydoc_data/module_docs.py
index 76a2c18bdb2f0e..314bef547f3052 100644
--- a/Lib/pydoc_data/module_docs.py
+++ b/Lib/pydoc_data/module_docs.py
@@ -1,4 +1,4 @@
-# Autogenerated by Sphinx on Wed Feb 11 14:22:57 2026
+# Autogenerated by Sphinx on Tue Mar 10 14:31:07 2026
# as part of the release process.
module_docs = {
diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py
index dc09c5fd47affe..7dd9cfe2ff5821 100644
--- a/Lib/pydoc_data/topics.py
+++ b/Lib/pydoc_data/topics.py
@@ -1,4 +1,4 @@
-# Autogenerated by Sphinx on Wed Feb 11 14:22:57 2026
+# Autogenerated by Sphinx on Tue Mar 10 14:31:07 2026
# as part of the release process.
topics = {
@@ -361,13 +361,12 @@ async def func(param1, param2):
Is semantically equivalent to:
- iter = (ITER)
- iter = type(iter).__aiter__(iter)
+ iter = (ITER).__aiter__()
running = True
while running:
try:
- TARGET = await type(iter).__anext__(iter)
+ TARGET = await iter.__anext__()
except StopAsyncIteration:
running = False
else:
@@ -375,7 +374,8 @@ async def func(param1, param2):
else:
SUITE2
-See also "__aiter__()" and "__anext__()" for details.
+except that implicit special method lookup is used for "__aiter__()"
+and "__anext__()".
It is a "SyntaxError" to use an "async for" statement outside the body
of a coroutine function.
@@ -397,9 +397,9 @@ async def func(param1, param2):
is semantically equivalent to:
manager = (EXPRESSION)
- aenter = type(manager).__aenter__
- aexit = type(manager).__aexit__
- value = await aenter(manager)
+ aenter = manager.__aenter__
+ aexit = manager.__aexit__
+ value = await aenter()
hit_except = False
try:
@@ -407,13 +407,14 @@ async def func(param1, param2):
SUITE
except:
hit_except = True
- if not await aexit(manager, *sys.exc_info()):
+ if not await aexit(*sys.exc_info()):
raise
finally:
if not hit_except:
- await aexit(manager, None, None, None)
+ await aexit(None, None, None)
-See also "__aenter__()" and "__aexit__()" for details.
+except that implicit special method lookup is used for "__aenter__()"
+and "__aexit__()".
It is a "SyntaxError" to use an "async with" statement outside the
body of a coroutine function.
@@ -481,16 +482,34 @@ async def func(param1, param2):
'atom-literals': r'''Literals
********
-Python supports string and bytes literals and various numeric
-literals:
+A *literal* is a textual representation of a value. Python supports
+numeric, string and bytes literals. Format strings and template
+strings are treated as string literals.
+
+Numeric literals consist of a single "NUMBER" token, which names an
+integer, floating-point number, or an imaginary number. See the
+Numeric literals section in Lexical analysis documentation for
+details.
+
+String and bytes literals may consist of several tokens. See section
+String literal concatenation for details.
+
+Note that negative and complex numbers, like "-3" or "3+4.2j", are
+syntactically not literals, but unary or binary arithmetic operations
+involving the "-" or "+" operator.
+
+Evaluation of a literal yields an object of the given type ("int",
+"float", "complex", "str", "bytes", or "Template") with the given
+value. The value may be approximated in the case of floating-point and
+imaginary literals.
+
+The formal grammar for literals is:
literal: strings | NUMBER
-Evaluation of a literal yields an object of the given type (string,
-bytes, integer, floating-point number, complex number) with the given
-value. The value may be approximated in the case of floating-point
-and imaginary (complex) literals. See section Literals for details.
-See section String literal concatenation for details on "strings".
+
+Literals and object identity
+============================
All literals correspond to immutable data types, and hence the
object’s identity is less important than its value. Multiple
@@ -498,21 +517,53 @@ async def func(param1, param2):
occurrence in the program text or a different occurrence) may obtain
the same object or a different object with the same value.
+CPython implementation detail: For example, in CPython, *small*
+integers with the same value evaluate to the same object:
+
+ >>> x = 7
+ >>> y = 7
+ >>> x is y
+ True
+
+However, large integers evaluate to different objects:
+
+ >>> x = 123456789
+ >>> y = 123456789
+ >>> x is y
+ False
+
+This behavior may change in future versions of CPython. In particular,
+the boundary between “small” and “large” integers has already changed
+in the past.CPython will emit a "SyntaxWarning" when you compare
+literals using "is":
+
+ >>> x = 7
+ >>> x is 7
+ :1: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?
+ True
+
+See When can I rely on identity tests with the is operator? for more
+information.
+
+Template strings are immutable but may reference mutable objects as
+"Interpolation" values. For the purposes of this section, two
+t-strings have the “same value” if both their structure and the
+*identity* of the values match.
+
+**CPython implementation detail:** Currently, each evaluation of a
+template string results in a different object.
+
String literal concatenation
============================
-Multiple adjacent string or bytes literals (delimited by whitespace),
-possibly using different quoting conventions, are allowed, and their
-meaning is the same as their concatenation:
+Multiple adjacent string or bytes literals, possibly using different
+quoting conventions, are allowed, and their meaning is the same as
+their concatenation:
>>> "hello" 'world'
"helloworld"
-Formally:
-
- strings: ( STRING | fstring)+ | tstring+
-
This feature is defined at the syntactical level, so it only works
with literals. To concatenate string expressions at run time, the ‘+’
operator may be used:
@@ -543,6 +594,10 @@ async def func(param1, param2):
>>> t"Hello" t"{name}!"
Template(strings=('Hello', '!'), interpolations=(...))
+
+Formally:
+
+ strings: (STRING | fstring)+ | tstring+
''',
'attribute-access': r'''Customizing attribute access
****************************
@@ -1007,7 +1062,7 @@ class and instance attributes applies as for regular assignments.
The "%" (modulo) operator yields the remainder from the division of
the first argument by the second. The numeric arguments are first
-converted to a common type. A zero right argument raises the
+converted to a common type. A zero right argument raises the
"ZeroDivisionError" exception. The arguments may be floating-point
numbers, e.g., "3.14%0.7" equals "0.34" (since "3.14" equals "4*0.7 +
0.34".) The modulo operator always yields a result with the same sign
@@ -2229,9 +2284,9 @@ def foo():
is semantically equivalent to:
manager = (EXPRESSION)
- enter = type(manager).__enter__
- exit = type(manager).__exit__
- value = enter(manager)
+ enter = manager.__enter__
+ exit = manager.__exit__
+ value = enter()
hit_except = False
try:
@@ -2239,11 +2294,14 @@ def foo():
SUITE
except:
hit_except = True
- if not exit(manager, *sys.exc_info()):
+ if not exit(*sys.exc_info()):
raise
finally:
if not hit_except:
- exit(manager, None, None, None)
+ exit(None, None, None)
+
+except that implicit special method lookup is used for "__enter__()"
+and "__exit__()".
With more than one item, the context managers are processed as if
multiple "with" statements were nested:
@@ -3287,13 +3345,12 @@ async def func(param1, param2):
Is semantically equivalent to:
- iter = (ITER)
- iter = type(iter).__aiter__(iter)
+ iter = (ITER).__aiter__()
running = True
while running:
try:
- TARGET = await type(iter).__anext__(iter)
+ TARGET = await iter.__anext__()
except StopAsyncIteration:
running = False
else:
@@ -3301,7 +3358,8 @@ async def func(param1, param2):
else:
SUITE2
-See also "__aiter__()" and "__anext__()" for details.
+except that implicit special method lookup is used for "__aiter__()"
+and "__anext__()".
It is a "SyntaxError" to use an "async for" statement outside the body
of a coroutine function.
@@ -3323,9 +3381,9 @@ async def func(param1, param2):
is semantically equivalent to:
manager = (EXPRESSION)
- aenter = type(manager).__aenter__
- aexit = type(manager).__aexit__
- value = await aenter(manager)
+ aenter = manager.__aenter__
+ aexit = manager.__aexit__
+ value = await aenter()
hit_except = False
try:
@@ -3333,13 +3391,14 @@ async def func(param1, param2):
SUITE
except:
hit_except = True
- if not await aexit(manager, *sys.exc_info()):
+ if not await aexit(*sys.exc_info()):
raise
finally:
if not hit_except:
- await aexit(manager, None, None, None)
+ await aexit(None, None, None)
-See also "__aenter__()" and "__aexit__()" for details.
+except that implicit special method lookup is used for "__aenter__()"
+and "__aexit__()".
It is a "SyntaxError" to use an "async with" statement outside the
body of a coroutine function.
@@ -3676,8 +3735,8 @@ def f() -> annotation: ...
* a class that inherits from any of the above
- The standard library classes "dict", "frozendict"
- and "types.MappingProxyType" are mappings.
+ The standard library classes "dict" and "types.MappingProxyType"
+ are mappings.
[4] A string literal appearing as the first statement in the function
body is transformed into the function’s "__doc__" attribute and
@@ -3750,19 +3809,13 @@ def f() -> annotation: ...
When a description of an arithmetic operator below uses the phrase
“the numeric arguments are converted to a common real type”, this
-means that the operator implementation for built-in types works as
-follows:
-
-* If both arguments are complex numbers, no conversion is performed;
+means that the operator implementation for built-in numeric types
+works as described in the Numeric Types section of the standard
+library documentation.
-* if either argument is a complex or a floating-point number, the
- other is converted to a floating-point number;
-
-* otherwise, both must be integers and no conversion is necessary.
-
-Some additional rules apply for certain operators (e.g., a string as a
-left argument to the ‘%’ operator). Extensions must define their own
-conversion behavior.
+Some additional rules apply for certain operators and non-numeric
+operands (for example, a string as a left argument to the "%"
+operator). Extensions must define their own conversion behavior.
''',
'customization': r'''Basic customization
*******************
@@ -4056,7 +4109,7 @@ def __hash__(self):
intended to provide protection against a denial-of-service caused
by carefully chosen inputs that exploit the worst case
performance of a dict insertion, *O*(*n*^2) complexity. See
- http://ocert.org/advisories/ocert-2011-003.html for
+ https://ocert.org/advisories/ocert-2011-003.html for
details.Changing hash values affects the iteration order of sets.
Python has never made guarantees about this ordering (and it
typically varies between 32-bit and 64-bit builds).See also
@@ -4971,8 +5024,8 @@ def inner(x):
CPython, the value was evaluated before the key. Starting with 3.8,
the key is evaluated before the value, as proposed by **PEP 572**.
-Changed in version 3.15.0a5 (unreleased): Unpacking with the "**"
-operator is now allowed in dictionary comprehensions.
+Changed in version 3.15: Unpacking with the "**" operator is now
+allowed in dictionary comprehensions.
''',
'dynamic-features': r'''Interaction with dynamic features
*********************************
@@ -6552,6 +6605,8 @@ def whats_on_the_telly(penguin=None):
* "type", when used in the "type" statement.
+* "lazy", when used before an "import" statement.
+
These syntactically act as keywords in their specific contexts, but
this distinction is done at the parser level, not when tokenizing.
@@ -6561,6 +6616,9 @@ def whats_on_the_telly(penguin=None):
Changed in version 3.12: "type" is now a soft keyword.
+Changed in version 3.15.0a6 (unreleased): "lazy" is now a soft
+keyword.
+
Reserved classes of identifiers
===============================
@@ -6770,10 +6828,10 @@ def whats_on_the_telly(penguin=None):
'import': r'''The "import" statement
**********************
- import_stmt: "import" module ["as" identifier] ("," module ["as" identifier])*
- | "from" relative_module "import" identifier ["as" identifier]
+ import_stmt: ["lazy"] "import" module ["as" identifier] ("," module ["as" identifier])*
+ | ["lazy"] "from" relative_module "import" identifier ["as" identifier]
("," identifier ["as" identifier])*
- | "from" relative_module "import" "(" identifier ["as" identifier]
+ | ["lazy"] "from" relative_module "import" "(" identifier ["as" identifier]
("," identifier ["as" identifier])* [","] ")"
| "from" relative_module "import" "*"
module: (identifier ".")* identifier
@@ -6885,6 +6943,48 @@ def whats_on_the_telly(penguin=None):
"sys.path", "sys.meta_path", "sys.path_hooks".
+Lazy imports
+============
+
+The "lazy" keyword is a soft keyword that only has special meaning
+when it appears immediately before an "import" or "from" statement.
+When an import statement is preceded by the "lazy" keyword, the import
+becomes *lazy*: the module is not loaded immediately at the import
+statement. Instead, a lazy proxy object is created and bound to the
+name. The actual module is loaded on first use of that name.
+
+Lazy imports are only permitted at module scope. Using "lazy" inside a
+function, class body, or "try"/"except"/"finally" block raises a
+"SyntaxError". Star imports cannot be lazy ("lazy from module import
+*" is a syntax error), and future statements cannot be lazy.
+
+When using "lazy from ... import", each imported name is bound to a
+lazy proxy object. The first access to any of these names triggers
+loading of the entire module and resolves only that specific name to
+its actual value. Other names remain as lazy proxies until they are
+accessed.
+
+Example:
+
+ lazy import json
+ import sys
+
+ print('json' in sys.modules) # False - json module not yet loaded
+
+ # First use triggers loading
+ result = json.dumps({"hello": "world"})
+
+ print('json' in sys.modules) # True - now loaded
+
+If an error occurs during module loading (such as "ImportError" or
+"SyntaxError"), it is raised at the point where the lazy import is
+first used, not at the import statement itself.
+
+See **PEP 810** for the full specification of lazy imports.
+
+Added in version 3.15.0a6 (unreleased).
+
+
Future statements
=================
@@ -7975,8 +8075,8 @@ class C: pass # a class with no methods (yet)
The power operator has the same semantics as the built-in "pow()"
function, when called with two arguments: it yields its left argument
-raised to the power of its right argument. The numeric arguments are
-first converted to a common type, and the result is of that type.
+raised to the power of its right argument. Numeric arguments are first
+converted to a common type, and the result is of that type.
For int operands, the result has the same type as the operands unless
the second argument is negative; in that case, all arguments are
@@ -8701,7 +8801,7 @@ def __hash__(self):
intended to provide protection against a denial-of-service caused
by carefully chosen inputs that exploit the worst case
performance of a dict insertion, *O*(*n*^2) complexity. See
- http://ocert.org/advisories/ocert-2011-003.html for
+ https://ocert.org/advisories/ocert-2011-003.html for
details.Changing hash values affects the iteration order of sets.
Python has never made guarantees about this ordering (and it
typically varies between 32-bit and 64-bit builds).See also
@@ -10312,16 +10412,14 @@ class is used in a class pattern with positional arguments, each
"c.isalpha()", "c.isdecimal()", "c.isdigit()", or "c.isnumeric()".
For example:
- .. doctest::
-
- >>> 'abc123'.isalnum()
- True
- >>> 'abc123!@#'.isalnum()
- False
- >>> ''.isalnum()
- False
- >>> ' '.isalnum()
- False
+ >>> 'abc123'.isalnum()
+ True
+ >>> 'abc123!@#'.isalnum()
+ False
+ >>> ''.isalnum()
+ False
+ >>> ' '.isalnum()
+ False
str.isalpha()
@@ -10575,6 +10673,9 @@ class is used in a class pattern with positional arguments, each
a third argument, it must be a string, whose characters will be
mapped to "None" in the result.
+ Changed in version 3.15.0a6 (unreleased): *dict* can now be a
+ "frozendict".
+
str.partition(sep, /)
Split the string at the first occurrence of *sep*, and return a
@@ -10676,6 +10777,17 @@ class is used in a class pattern with positional arguments, each
space). The original string is returned if *width* is less than or
equal to "len(s)".
+ For example:
+
+ >>> 'Python'.rjust(10)
+ ' Python'
+ >>> 'Python'.rjust(10, '.')
+ '....Python'
+ >>> 'Monty Python'.rjust(10, '.')
+ 'Monty Python'
+
+ See also "ljust()" and "zfill()".
+
str.rpartition(sep, /)
Split the string at the last occurrence of *sep*, and return a
@@ -10982,6 +11094,8 @@ class is used in a class pattern with positional arguments, each
'00042'
>>> "-42".zfill(5)
'-0042'
+
+ See also "rjust()".
''',
'strings': '''String and Bytes literals
*************************
@@ -13338,13 +13452,13 @@ class instance has a namespace implemented as a dictionary which is
See Function definitions for more information.
''',
- 'typesmapping': r'''Mapping Types — "dict"
-**********************
+ 'typesmapping': r'''Mapping types — "dict", "frozendict"
+************************************
-A *mapping* object maps *hashable* values to arbitrary objects.
-Mappings are mutable objects. There is currently only one standard
-mapping type, the *dictionary*. (For other containers see the built-
-in "list", "set", and "tuple" classes, and the "collections" module.)
+A *mapping* object maps *hashable* values to arbitrary objects. There
+are currently two standard mapping types, the *dictionary* and
+"frozendict". (For other containers see the built-in "list", "set",
+and "tuple" classes, and the "collections" module.)
A dictionary’s keys are *almost* arbitrary values. Values that are
not *hashable*, that is, values containing lists, dictionaries or
@@ -13618,10 +13732,15 @@ class dict(iterable, /, **kwargs)
Changed in version 3.8: Dictionaries are now reversible.
+ See also:
+
+ "frozendict" and "types.MappingProxyType" can be used to create a
+ read-only view of a "dict".
+
See also:
- "frozendict" and "types.MappingProxyType" can be used to create a read-only
- view of a "dict".
+ For detailed information on thread-safety guarantees for "dict"
+ objects, see Thread safety for dict objects.
Dictionary view objects
@@ -13726,6 +13845,47 @@ class dict(iterable, /, **kwargs)
mappingproxy({'bacon': 1, 'spam': 500})
>>> values.mapping['spam']
500
+
+
+Frozen dictionaries
+===================
+
+class frozendict(**kwargs)
+class frozendict(mapping, /, **kwargs)
+class frozendict(iterable, /, **kwargs)
+
+ Return a new frozen dictionary initialized from an optional
+ positional argument and a possibly empty set of keyword arguments.
+
+ A "frozendict" has a similar API to the "dict" API, with the
+ following differences:
+
+ * "dict" has more methods than "frozendict":
+
+ * "__delitem__()"
+
+ * "__setitem__()"
+
+ * "clear()"
+
+ * "pop()"
+
+ * "popitem()"
+
+ * "setdefault()"
+
+ * "update()"
+
+ * A "frozendict" can be hashed with "hash(frozendict)" if all keys
+ and values can be hashed.
+
+ * "frozendict |= other" does not modify the "frozendict" in-place
+ but creates a new frozen dictionary.
+
+ "frozendict" is not a "dict" subclass but inherits directly from
+ "object".
+
+ Added in version 3.15.0a6 (unreleased).
''',
'typesmethods': r'''Methods
*******
@@ -14175,75 +14335,10 @@ class list(iterable=(), /)
empty for the duration, and raises "ValueError" if it can detect
that the list has been mutated during a sort.
-Thread safety: Reading a single element from a "list" is *atomic*:
-
- lst[i] # list.__getitem__
-
-The following methods traverse the list and use *atomic* reads of each
-item to perform their function. That means that they may return
-results affected by concurrent modifications:
-
- item in lst
- lst.index(item)
- lst.count(item)
-
-All of the above methods/operations are also lock-free. They do not
-block concurrent modifications. Other operations that hold a lock will
-not block these from observing intermediate states.All other
-operations from here on block using the per-object lock.Writing a
-single item via "lst[i] = x" is safe to call from multiple threads and
-will not corrupt the list.The following operations return new objects
-and appear *atomic* to other threads:
-
- lst1 + lst2 # concatenates two lists into a new list
- x * lst # repeats lst x times into a new list
- lst.copy() # returns a shallow copy of the list
-
-Methods that only operate on a single elements with no shifting
-required are *atomic*:
-
- lst.append(x) # append to the end of the list, no shifting required
- lst.pop() # pop element from the end of the list, no shifting required
-
-The "clear()" method is also *atomic*. Other threads cannot observe
-elements being removed.The "sort()" method is not *atomic*. Other
-threads cannot observe intermediate states during sorting, but the
-list appears empty for the duration of the sort.The following
-operations may allow lock-free operations to observe intermediate
-states since they modify multiple elements in place:
-
- lst.insert(idx, item) # shifts elements
- lst.pop(idx) # idx not at the end of the list, shifts elements
- lst *= x # copies elements in place
-
-The "remove()" method may allow concurrent modifications since element
-comparison may execute arbitrary Python code (via
-"__eq__()")."extend()" is safe to call from multiple threads.
-However, its guarantees depend on the iterable passed to it. If it is
-a "list", a "tuple", a "set", a "frozenset", a "dict" or a dictionary
-view object (but not their subclasses), the "extend" operation is safe
-from concurrent modifications to the iterable. Otherwise, an iterator
-is created which can be concurrently modified by another thread. The
-same applies to inplace concatenation of a list with other iterables
-when using "lst += iterable".Similarly, assigning to a list slice with
-"lst[i:j] = iterable" is safe to call from multiple threads, but
-"iterable" is only locked when it is also a "list" (but not its
-subclasses).Operations that involve multiple accesses, as well as
-iteration, are never atomic. For example:
-
- # NOT atomic: read-modify-write
- lst[i] = lst[i] + 1
-
- # NOT atomic: check-then-act
- if lst:
- item = lst.pop()
-
- # NOT thread-safe: iteration while modifying
- for item in lst:
- process(item) # another thread may modify lst
-
-Consider external synchronization when sharing "list" instances across
-threads. See Python support for free threading for more information.
+See also:
+
+ For detailed information on thread-safety guarantees for "list"
+ objects, see Thread safety for list objects.
Tuples
@@ -14615,9 +14710,9 @@ class range(start, stop, step=1, /)
is semantically equivalent to:
manager = (EXPRESSION)
- enter = type(manager).__enter__
- exit = type(manager).__exit__
- value = enter(manager)
+ enter = manager.__enter__
+ exit = manager.__exit__
+ value = enter()
hit_except = False
try:
@@ -14625,11 +14720,14 @@ class range(start, stop, step=1, /)
SUITE
except:
hit_except = True
- if not exit(manager, *sys.exc_info()):
+ if not exit(*sys.exc_info()):
raise
finally:
if not hit_except:
- exit(manager, None, None, None)
+ exit(None, None, None)
+
+except that implicit special method lookup is used for "__enter__()"
+and "__exit__()".
With more than one item, the context managers are processed as if
multiple "with" statements were nested:
diff --git a/Misc/NEWS.d/3.15.0a7.rst b/Misc/NEWS.d/3.15.0a7.rst
new file mode 100644
index 00000000000000..7d9681cbcbef00
--- /dev/null
+++ b/Misc/NEWS.d/3.15.0a7.rst
@@ -0,0 +1,1212 @@
+.. date: 2026-03-10-09-46-44
+.. gh-issue: 145731
+.. nonce: 5uEGgb
+.. release date: 2026-03-10
+.. section: Windows
+
+Fix negative timestamp during DST on Windows. Patch by Hugo van Kemenade.
+
+..
+
+.. date: 2026-02-27-10-57-20
+.. gh-issue: 145307
+.. nonce: ueoT7j
+.. section: Windows
+
+Defers loading of the ``psapi.dll`` module until it is used by
+:func:`ctypes.util.dllist`.
+
+..
+
+.. date: 2026-02-13-11-07-51
+.. gh-issue: 144551
+.. nonce: ENtMYD
+.. section: Windows
+
+Updated bundled version of OpenSSL to 3.5.5.
+
+..
+
+.. date: 2026-03-04-17-39-15
+.. gh-issue: 144741
+.. nonce: 0RHhBF
+.. section: Tests
+
+Fix ``test_frame_pointer_unwind`` when Python is built with
+:option:`--enable-shared`. Classify also libpython frames as ``"python"``.
+Patch by Victor Stinner.
+
+..
+
+.. date: 2026-02-12-12-12-00
+.. gh-issue: 144739
+.. nonce: -fx1tN
+.. section: Tests
+
+When Python was compiled with system expat older then 2.7.2 but tests run
+with newer expat, still skip
+:class:`!test.test_pyexpat.MemoryProtectionTest`.
+
+..
+
+.. date: 2026-03-04-18-59-17
+.. gh-issue: 145506
+.. nonce: 6hwvEh
+.. section: Security
+
+Fixes :cve:`2026-2297` by ensuring that ``SourcelessFileLoader`` uses
+:func:`io.open_code` when opening ``.pyc`` files.
+
+..
+
+.. date: 2026-01-31-21-56-54
+.. gh-issue: 144370
+.. nonce: fp9m8t
+.. section: Security
+
+Disallow usage of control characters in status in :mod:`wsgiref.handlers` to
+prevent HTTP header injections. Patch by Benedikt Johannes.
+
+..
+
+.. date: 2026-03-07-15-00-00
+.. gh-issue: 145623
+.. nonce: 2Y7LzT
+.. section: Library
+
+Fix crash in :mod:`struct` when calling :func:`repr` or ``__sizeof__()`` on
+an uninitialized :class:`struct.Struct` object created via
+``Struct.__new__()`` without calling ``__init__()``.
+
+..
+
+.. date: 2026-03-05-19-01-28
+.. gh-issue: 145551
+.. nonce: gItPRl
+.. section: Library
+
+Fix InvalidStateError when cancelling process created by
+:func:`asyncio.create_subprocess_exec` or
+:func:`asyncio.create_subprocess_shell`. Patch by Daan De Meyer.
+
+..
+
+.. date: 2026-03-05-16-06-09
+.. gh-issue: 141510
+.. nonce: dFPAQS
+.. section: Library
+
+:mod:`marshal` now supports :class:`frozendict` objects. The marshal format
+version was increased to 6. Patch by Victor Stinner.
+
+..
+
+.. date: 2026-03-03-11-49-44
+.. gh-issue: 145417
+.. nonce: m_HxIL
+.. section: Library
+
+:mod:`venv`: Prevent incorrect preservation of SELinux context when copying
+the ``Activate.ps1`` script. The script inherited the SELinux security
+context of the system template directory, rather than the destination
+project directory.
+
+..
+
+.. date: 2026-03-02-20-08-09
+.. gh-issue: 145335
+.. nonce: lVTBvd
+.. section: Library
+
+``os.listdir(-1)`` and ``os.scandir(-1)`` now fail with
+``OSError(errno.EBADF)`` rather than listing the current directory.
+``os.listxattr(-1)`` now fails with ``OSError(errno.EBADF)`` rather than
+listing extended attributes of the current directory. Patch by Victor
+Stinner.
+
+..
+
+.. date: 2026-03-02-19-41-39
+.. gh-issue: 145376
+.. nonce: OOzSOh
+.. section: Library
+
+Fix double free and null pointer dereference in unusual error scenarios in
+:mod:`hashlib` and :mod:`hmac` modules.
+
+..
+
+.. date: 2026-02-28-00-55-00
+.. gh-issue: 145301
+.. nonce: Lk2bRl
+.. section: Library
+
+:mod:`hmac`: fix a crash when the initialization of the underlying C
+extension module fails.
+
+..
+
+.. date: 2026-02-27-19-00-26
+.. gh-issue: 145301
+.. nonce: 2Wih4b
+.. section: Library
+
+:mod:`hashlib`: fix a crash when the initialization of the underlying C
+extension module fails.
+
+..
+
+.. date: 2026-02-27-18-04-51
+.. gh-issue: 76007
+.. nonce: 17idfK
+.. section: Library
+
+The ``version`` attribute of the :mod:`tarfile` module is deprecated and
+slated for removal in Python 3.20.
+
+..
+
+.. date: 2026-02-23-20-52-55
+.. gh-issue: 145158
+.. nonce: vWJtxI
+.. section: Library
+
+Avoid undefined behaviour from signed integer overflow when parsing format
+strings in the :mod:`struct` module.
+
+..
+
+.. date: 2026-02-21-17-34-53
+.. gh-issue: 123853
+.. nonce: 6RUwWh
+.. section: Library
+
+Removed Windows 95 compatibility for :func:`locale.getdefaultlocale`.
+
+..
+
+.. date: 2026-02-20-13-03-10
+.. gh-issue: 66802
+.. nonce: OYcAi_
+.. section: Library
+
+Add :func:`unicodedata.block` function to return the `Unicode block
+`_
+of a character.
+
+..
+
+.. date: 2026-02-19-20-54-25
+.. gh-issue: 145033
+.. nonce: X9EBPQ
+.. section: Library
+
+Add :data:`typing.TypeForm`, implementing :pep:`747`. Patch by Jelle
+Zijlstra.
+
+..
+
+.. date: 2026-02-19-18-02-54
+.. gh-issue: 141510
+.. nonce: qzvYsO
+.. section: Library
+
+:func:`dataclasses.field`: if *metadata* is ``None``, use an empty
+:class:`frozendict`, instead of a :func:`~types.MappingProxyType` of an
+empty :class:`dict`. Patch by Victor Stinner.
+
+..
+
+.. date: 2026-02-19-17-50-47
+.. gh-issue: 145006
+.. nonce: 9gqA0Q
+.. section: Library
+
+Add :exc:`ModuleNotFoundError` hints when a module for a different ABI
+exists.
+
+..
+
+.. date: 2026-02-19-16-26-08
+.. gh-issue: 141510
+.. nonce: 4Qxy8_
+.. section: Library
+
+``ParameterizedMIMEHeader.params`` of :mod:`email.headerregistry` is now a
+:class:`frozendict` instead of a :class:`types.MappingProxyType`. Patch by
+Victor Stinner.
+
+..
+
+.. date: 2026-02-19-15-42-06
+.. gh-issue: 134872
+.. nonce: sjYX1-
+.. section: Library
+
+Add valid import name suggestions on :exc:`ModuleNotFoundError`.
+
+..
+
+.. date: 2026-02-19-10-57-40
+.. gh-issue: 88091
+.. nonce: N7qGV-
+.. section: Library
+
+Fix :func:`unicodedata.decomposition` for Hangul characters.
+
+..
+
+.. date: 2026-02-19-00-00-00
+.. gh-issue: 144986
+.. nonce: atexit-leak
+.. section: Library
+
+Fix a memory leak in :func:`atexit.register`. Patch by Shamil Abdulaev.
+
+..
+
+.. date: 2026-02-18-13-45-00
+.. gh-issue: 144777
+.. nonce: R97q0a
+.. section: Library
+
+Fix data races in :class:`io.IncrementalNewlineDecoder` in the
+:term:`free-threaded build`.
+
+..
+
+.. date: 2026-02-18-00-00-00
+.. gh-issue: 144809
+.. nonce: nYpEUx
+.. section: Library
+
+Make :class:`collections.deque` copy atomic in the :term:`free-threaded
+build`.
+
+..
+
+.. date: 2026-02-17-11-28-37
+.. gh-issue: 141510
+.. nonce: OpAz0M
+.. section: Library
+
+The :mod:`copy` module now supports the :class:`frozendict` type. Patch by
+Pieter Eendebak based on work by Victor Stinner.
+
+..
+
+.. date: 2026-02-17-11-15-17
+.. gh-issue: 141510
+.. nonce: ZmqEUb
+.. section: Library
+
+The :mod:`json` module now supports the :class:`frozendict` type. Patch by
+Victor Stinner.
+
+..
+
+.. date: 2026-02-15-12-02-20
+.. gh-issue: 144835
+.. nonce: w_oS_J
+.. section: Library
+
+Added missing explanations for some parameters in :func:`glob.glob` and
+:func:`glob.iglob`.
+
+..
+
+.. date: 2026-02-15-00-00-00
+.. gh-issue: 144833
+.. nonce: TUelo1
+.. section: Library
+
+Fixed a use-after-free in :mod:`ssl` when ``SSL_new()`` returns NULL in
+``newPySSLSocket()``. The error was reported via a dangling pointer after
+the object had already been freed.
+
+..
+
+.. date: 2026-02-14-14-56-44
+.. gh-issue: 140715
+.. nonce: AbSheM
+.. section: Library
+
+Add ``'%D'`` support to :meth:`~datetime.datetime.strptime`.
+
+..
+
+.. date: 2026-02-13-14-20-10
+.. gh-issue: 144782
+.. nonce: 0Y8TKj
+.. section: Library
+
+Fix :class:`argparse.ArgumentParser` to be :mod:`pickleable `.
+
+..
+
+.. date: 2026-02-13-11-14-18
+.. gh-issue: 144763
+.. nonce: cDwnEE
+.. section: Library
+
+Fix a race condition in :mod:`tracemalloc`: it no longer detaches the
+attached thread state to acquire its internal lock. Patch by Victor Stinner.
+
+..
+
+.. date: 2026-02-13-00-00-00
+.. gh-issue: 142224
+.. nonce: BidiMissing
+.. section: Library
+
+:func:`unicodedata.bidirectional` now return the correct default bidi class
+for unassigned code points.
+
+..
+
+.. date: 2026-02-12-17-56-17
+.. gh-issue: 117865
+.. nonce: jE1ema
+.. section: Library
+
+Reduce the import time of :mod:`inspect` module by ~20%.
+
+..
+
+.. date: 2026-02-10-22-05-51
+.. gh-issue: 144156
+.. nonce: UbrC7F
+.. section: Library
+
+Fix the folding of headers by the :mod:`email` library when :rfc:`2047`
+encoded words are used. Now whitespace is correctly preserved and also
+correctly added between adjacent encoded words. The latter property was
+broken by the fix for gh-92081, which mostly fixed previous failures to
+preserve whitespace.
+
+..
+
+.. date: 2026-02-10-16-56-05
+.. gh-issue: 66305
+.. nonce: PZ6GN8
+.. section: Library
+
+Fixed a hang on Windows in the :mod:`tempfile` module when trying to create
+a temporary file or subdirectory in a non-writable directory.
+
+..
+
+.. date: 2026-02-09-02-16-36
+.. gh-issue: 144615
+.. nonce: s04x4n
+.. section: Library
+
+Methods directly decorated with :deco:`functools.singledispatchmethod` now
+dispatch on the second argument when called after being accessed as class
+attributes. Patch by Bartosz Sławecki.
+
+..
+
+.. date: 2026-02-08-17-09-10
+.. gh-issue: 144321
+.. nonce: w58PhQ
+.. section: Library
+
+The functional syntax for creating :class:`typing.NamedTuple` classes now
+supports passing any :term:`iterable` of fields and types. Previously, only
+sequences were supported.
+
+..
+
+.. date: 2026-02-07-16-37-42
+.. gh-issue: 144475
+.. nonce: 8tFEXw
+.. section: Library
+
+Calling :func:`repr` on :func:`functools.partial` is now safer when the
+partial object's internal attributes are replaced while the string
+representation is being generated.
+
+..
+
+.. date: 2026-02-07-16-31-42
+.. gh-issue: 144285
+.. nonce: iyH9iL
+.. section: Library
+
+Attribute suggestions in :exc:`AttributeError` tracebacks are now formatted
+differently to make them easier to understand, for example: ``Did you mean
+'.datetime.now' instead of '.now'``. Contributed by Bartosz Sławecki.
+
+..
+
+.. date: 2026-02-03-19-57-41
+.. gh-issue: 144316
+.. nonce: wop870
+.. section: Library
+
+Fix crash in ``_remote_debugging`` that caused ``test_external_inspection``
+to intermittently fail. Patch by Taegyun Kim.
+
+..
+
+.. date: 2026-01-17-08-44-25
+.. gh-issue: 143637
+.. nonce: qyPqDo
+.. section: Library
+
+Fixed a crash in socket.sendmsg() that could occur if ancillary data is
+mutated re-entrantly during argument parsing.
+
+..
+
+.. date: 2026-01-12-19-39-57
+.. gh-issue: 140652
+.. nonce: HvM9Bl
+.. section: Library
+
+Fix a crash in :func:`!_interpchannels.list_all` after closing a channel.
+
+..
+
+.. date: 2026-01-11-18-35-52
+.. gh-issue: 143698
+.. nonce: gXDzsJ
+.. section: Library
+
+Allow *scheduler* and *setpgroup* arguments to be explicitly :const:`None`
+when calling :func:`os.posix_spawn` or :func:`os.posix_spawnp`. Patch by
+Bénédikt Tran.
+
+..
+
+.. date: 2026-01-11-16-59-22
+.. gh-issue: 143698
+.. nonce: b-Cpeb
+.. section: Library
+
+Raise :exc:`TypeError` instead of :exc:`SystemError` when the *scheduler* in
+:func:`os.posix_spawn` or :func:`os.posix_spawnp` is not a tuple. Patch by
+Bénédikt Tran.
+
+..
+
+.. date: 2026-01-11-13-03-32
+.. gh-issue: 142516
+.. nonce: u7An-s
+.. section: Library
+
+:mod:`ssl`: fix reference leaks in :class:`ssl.SSLContext` objects. Patch by
+Bénédikt Tran.
+
+..
+
+.. date: 2026-01-10-22-58-30
+.. gh-issue: 85809
+.. nonce: 0eW4wt
+.. section: Library
+
+Added :term:`path-like object` support for :func:`shutil.make_archive`.
+
+..
+
+.. date: 2026-01-01-05-26-00
+.. gh-issue: 143304
+.. nonce: Kv7x9Q
+.. section: Library
+
+Fix :class:`ctypes.CDLL` to honor the ``handle`` parameter on POSIX systems.
+
+..
+
+.. date: 2025-12-18-00-14-16
+.. gh-issue: 142781
+.. nonce: gcOeYF
+.. section: Library
+
+:mod:`zoneinfo`: fix a crash when instantiating :class:`~zoneinfo.ZoneInfo`
+objects for which the internal class-level cache is inconsistent.
+
+..
+
+.. date: 2025-12-16-13-34-48
+.. gh-issue: 142787
+.. nonce: wNitJX
+.. section: Library
+
+Fix assertion failure in :mod:`sqlite3` blob subscript when slicing with
+indices that result in an empty slice.
+
+..
+
+.. date: 2025-12-06-16-14-18
+.. gh-issue: 142352
+.. nonce: pW5HLX88
+.. section: Library
+
+Fix :meth:`asyncio.StreamWriter.start_tls` to transfer buffered data from
+:class:`~asyncio.StreamReader` to the SSL layer, preventing data loss when
+upgrading a connection to TLS mid-stream (e.g., when implementing PROXY
+protocol support).
+
+..
+
+.. date: 2025-10-10-14-08-58
+.. gh-issue: 139899
+.. nonce: 09leRY
+.. section: Library
+
+Introduced :meth:`importlib.abc.MetaPathFinder.discover` and
+:meth:`importlib.abc.PathEntryFinder.discover` to allow module and submodule
+name discovery without assuming the use of traditional filesystem based
+imports.
+
+..
+
+.. date: 2025-08-04-23-20-43
+.. gh-issue: 137335
+.. nonce: IIjDJN
+.. section: Library
+
+Get rid of any possibility of a name conflict for named pipes in
+:mod:`multiprocessing` and :mod:`asyncio` on Windows, no matter how small.
+
+..
+
+.. date: 2025-06-24-19-07-18
+.. gh-issue: 135883
+.. nonce: 38cePA
+.. section: Library
+
+Fix :mod:`sqlite3`'s :ref:`interactive shell ` keeping part of
+previous commands when scrolling history.
+
+..
+
+.. date: 2024-09-30-15-31-59
+.. gh-issue: 124748
+.. nonce: KYzYFp
+.. section: Library
+
+Improve :exc:`TypeError` error message when
+:meth:`!weakref.WeakKeyDictionary.update` is used with keyword-only
+parameters.
+
+..
+
+.. date: 2023-02-05-20-02-30
+.. gh-issue: 80667
+.. nonce: 7LmzeA
+.. section: Library
+
+Add support for Tangut Ideographs names in :mod:`unicodedata`.
+
+..
+
+.. bpo: 42353
+.. date: 2022-02-05-00-15-03
+.. nonce: 0ebVGG
+.. section: Library
+
+The :mod:`re` module gains a new :func:`re.prefixmatch` function as an
+explicit spelling of what has to date always been known as :func:`re.match`.
+:class:`re.Pattern` similary gains a :meth:`re.Pattern.prefixmatch` method.
+
+Why? Explicit is better than implicit. Other widely used languages all use
+the term "match" to mean what Python uses the term "search" for. The
+unadorened "match" name in Python has been a frequent case of confusion and
+coding bugs due to the inconsistency with the rest if the software industry.
+
+We do not plan to deprecate and remove the older ``match`` name.
+
+..
+
+.. bpo: 40243
+.. date: 2020-04-10-14-29-53
+.. nonce: 85HRib
+.. section: Library
+
+Fix :meth:`!unicodedata.ucd_3_2_0.numeric` for non-decimal values.
+
+..
+
+.. bpo: 40212
+.. date: 2020-04-07-05-09-34
+.. nonce: oPYeBs
+.. section: Library
+
+Re-enable :func:`os.posix_fallocate` and :func:`os.posix_fadvise` on AIX.
+
+..
+
+.. bpo: 3405
+.. date: 2018-05-11-12-26-16
+.. nonce: CacMw9
+.. section: Library
+
+Add support for user data of Tk virtual events and detail for ``Enter``,
+``Leave``, ``FocusIn``, ``FocusOut``, and ``ConfigureRequest`` events to
+:mod:`tkinter`.
+
+..
+
+.. bpo: 32234
+.. date: 2017-12-15-09-32-57
+.. nonce: XaOkhR
+.. section: Library
+
+:class:`mailbox.Mailbox` instances can now be used as a context manager. The
+Mailbox is locked on context entry and unlocked and closed at context exit.
+
+..
+
+.. date: 2026-03-03-08-18-00
+.. gh-issue: 145450
+.. nonce: VI7GXj
+.. section: Documentation
+
+Document missing public :class:`wave.Wave_write` getter methods.
+
+..
+
+.. date: 2026-01-06-16-04-08
+.. gh-issue: 110937
+.. nonce: SyO5lk
+.. section: Documentation
+
+Document rest of full public :class:`importlib.metadata.Distribution` API.
+Also add the (already documented) :class:`~importlib.metadata.PackagePath`
+to ``__all__``.
+
+..
+
+.. date: 2025-08-02-18-59-01
+.. gh-issue: 136246
+.. nonce: RIK7nE
+.. section: Documentation
+
+A new "Improve this page" link is available in the left-hand sidebar of the
+docs, offering links to create GitHub issues, discussion forum posts, or
+pull requests.
+
+..
+
+.. date: 2026-03-09-18-52-03
+.. gh-issue: 145701
+.. nonce: 79KQyO
+.. section: Core and Builtins
+
+Fix :exc:`SystemError` when ``__classdict__`` or
+``__conditional_annotations__`` is in a class-scope inlined comprehension.
+Found by OSS Fuzz in :oss-fuzz:`491105000`.
+
+..
+
+.. date: 2026-03-06-21-05-05
+.. gh-issue: 145615
+.. nonce: NKXXZgDW
+.. section: Core and Builtins
+
+Fixed a memory leak in the :term:`free-threaded build` where mimalloc pages
+could become permanently unreclaimable until the owning thread exited.
+
+..
+
+.. date: 2026-03-06-01-36-20
+.. gh-issue: 116738
+.. nonce: OWVWRx
+.. section: Core and Builtins
+
+Make :meth:`!mmap.mmap.set_name` thread-safe on the :term:`free threaded
+` build.
+
+..
+
+.. date: 2026-03-05-19-10-56
+.. gh-issue: 145566
+.. nonce: H4RupyYN
+.. section: Core and Builtins
+
+In the free threading build, skip the stop-the-world pause when reassigning
+``__class__`` on a newly created object.
+
+..
+
+.. date: 2026-03-05-16-16-17
+.. gh-issue: 143055
+.. nonce: qDUFlY
+.. section: Core and Builtins
+
+Fix crash in AST unparser when unparsing dict comprehension unpacking. Found
+by OSS Fuzz in :oss-fuzz:`489790200`.
+
+..
+
+.. date: 2026-03-01-13-37-31
+.. gh-issue: 145335
+.. nonce: e36kPJ
+.. section: Core and Builtins
+
+Fix a crash in :func:`os.pathconf` when called with ``-1`` as the path
+argument.
+
+..
+
+.. date: 2026-02-28-16-46-17
+.. gh-issue: 145376
+.. nonce: lG5u1a
+.. section: Core and Builtins
+
+Fix reference leaks in various unusual error scenarios.
+
+..
+
+.. date: 2026-02-26-21-36-00
+.. gh-issue: 145234
+.. nonce: w0mQ9n
+.. section: Core and Builtins
+
+Fixed a ``SystemError`` in the parser when an encoding cookie (for example,
+UTF-7) decodes to carriage returns (``\r``). Newlines are now normalized
+after decoding in the string tokenizer.
+
+Patch by Pablo Galindo.
+
+..
+
+.. date: 2026-02-26-21-07-38
+.. gh-issue: 145275
+.. nonce: qE-3O1
+.. section: Core and Builtins
+
+Added the :option:`-X pathconfig_warnings<-X>` and
+:envvar:`PYTHON_PATHCONFIG_WARNINGS` options, allowing to disable warnings
+from :ref:`sys-path-init`.
+
+..
+
+.. date: 2026-02-26-20-51-54
+.. gh-issue: 145273
+.. nonce: B5QcUp
+.. section: Core and Builtins
+
+A warning is now shown during :ref:`sys-path-init` if it can't find a valid
+standard library.
+
+..
+
+.. date: 2026-02-26-18-00-00
+.. gh-issue: 145241
+.. nonce: hL2k9Q
+.. section: Core and Builtins
+
+Specialized the parser error for when ``with`` items are followed by a
+trailing comma (for example, ``with item,:``), raising a clearer
+:exc:`SyntaxError` message. Patch by Pablo Galindo and Bartosz Sławecki.
+
+..
+
+.. date: 2026-02-26-12-00-00
+.. gh-issue: 130555
+.. nonce: TMSOIu
+.. section: Core and Builtins
+
+Fix use-after-free in :meth:`dict.clear` when the dictionary values are
+embedded in an object and a destructor causes re-entrant mutation of the
+dictionary.
+
+..
+
+.. date: 2026-02-25-15-02-08
+.. gh-issue: 145197
+.. nonce: G6hAUk
+.. section: Core and Builtins
+
+Fix JIT trace crash when recording function from cleared generator frame.
+
+..
+
+.. date: 2026-02-24-18-30-56
+.. gh-issue: 145187
+.. nonce: YjPu1Z
+.. section: Core and Builtins
+
+Fix compiler assertion fail when a type parameter bound contains an invalid
+expression in a conditional block.
+
+..
+
+.. date: 2026-02-23-23-18-28
+.. gh-issue: 145142
+.. nonce: T-XbVe
+.. section: Core and Builtins
+
+Fix a crash in the free-threaded build when the dictionary argument to
+:meth:`str.maketrans` is concurrently modified.
+
+..
+
+.. date: 2026-02-22-22-05-09
+.. gh-issue: 145118
+.. nonce: TaKMJE
+.. section: Core and Builtins
+
+:meth:`str.maketrans` now accepts :class:`frozendict`.
+
+..
+
+.. date: 2026-02-22-20-15-00
+.. gh-issue: 144015
+.. nonce: pystrhex_simd
+.. section: Core and Builtins
+
+Speed up :meth:`bytes.hex`, :meth:`bytearray.hex`, :func:`binascii.hexlify`,
+and :mod:`hashlib` ``.hexdigest()`` operations with SIMD on x86-64, ARM64,
+and ARM32 with NEON when built with gcc (version 12 or higher) or clang
+(version 3 or higher) compilers. Around 1.1-3x faster for common 16-64 byte
+inputs such as hashlib hex digests, and up to 8x faster for larger data.
+
+..
+
+.. date: 2026-02-22-19-05-03
+.. gh-issue: 145118
+.. nonce: bU6Sic
+.. section: Core and Builtins
+
+:func:`type` now accepts :class:`frozendict` as an argument.
+
+..
+
+.. date: 2026-02-22-07-51-10
+.. gh-issue: 145064
+.. nonce: iIMGKA
+.. section: Core and Builtins
+
+Fix JIT optimizer assertion failure during ``CALL_ALLOC_AND_ENTER_INIT``
+side exit.
+
+..
+
+.. date: 2026-02-21-12-16-46
+.. gh-issue: 145055
+.. nonce: VyT-zI
+.. section: Core and Builtins
+
+:func:`exec` and :func:`eval` now accept :class:`frozendict` for *globals*.
+Patch by Victor Stinner.
+
+..
+
+.. date: 2026-02-21-09-47-45
+.. gh-issue: 145058
+.. nonce: e-RBw-
+.. section: Core and Builtins
+
+Fix a crash when :func:`!__lazy_import__` is passed a non-string argument,
+by raising an :exc:`TypeError` instead.
+
+..
+
+.. date: 2026-02-19-12-49-15
+.. gh-issue: 144995
+.. nonce: Ob2oYJ
+.. section: Core and Builtins
+
+Optimize :class:`memoryview` comparison: a :class:`memoryview` is equal to
+itself, there is no need to compare values. Patch by Victor Stinner.
+
+..
+
+.. date: 2026-02-18-21-44-39
+.. gh-issue: 141510
+.. nonce: 7LST2O
+.. section: Core and Builtins
+
+Update specializer to support frozendict. Patch by Donghee Na.
+
+..
+
+.. date: 2026-02-17-22-27-11
+.. gh-issue: 141510
+.. nonce: -4yYsf
+.. section: Core and Builtins
+
+Optimize :meth:`!frozendict.fromkeys` to avoid unnecessary thread-safety
+operations in frozendict cases. Patch by Donghee Na.
+
+..
+
+.. date: 2026-02-17-21-04-03
+.. gh-issue: 100239
+.. nonce: LyVabQ
+.. section: Core and Builtins
+
+Speedup ``BINARY_OP_EXTEND`` for exact floats and medium-size integers by up
+to 15%. Patch by Chris Eibl.
+
+..
+
+.. date: 2026-02-17-18-27-28
+.. gh-issue: 144914
+.. nonce: DcXO4m
+.. section: Core and Builtins
+
+Use ``mimalloc`` for raw memory allocations such as via
+:c:func:`PyMem_RawMalloc` for better performance on :term:`free-threaded
+builds `. Patch by Kumar Aditya.
+
+..
+
+.. date: 2026-02-16-12-28-43
+.. gh-issue: 144872
+.. nonce: k9_Q30
+.. section: Core and Builtins
+
+Fix heap buffer overflow in the parser found by OSS-Fuzz.
+
+..
+
+.. date: 2026-02-13-18-30-59
+.. gh-issue: 144766
+.. nonce: JGu3x3
+.. section: Core and Builtins
+
+Fix a crash in fork child process when perf support is enabled.
+
+..
+
+.. date: 2026-02-13-12-00-00
+.. gh-issue: 144759
+.. nonce: d3qYpe
+.. section: Core and Builtins
+
+Fix undefined behavior in the lexer when ``start`` and ``multi_line_start``
+pointers are ``NULL`` in ``_PyLexer_remember_fstring_buffers()`` and
+``_PyLexer_restore_fstring_buffers()``. The ``NULL`` pointer arithmetic
+(``NULL - valid_pointer``) is now guarded with explicit ``NULL`` checks.
+
+..
+
+.. date: 2026-02-12-19-01-13
+.. gh-issue: 141510
+.. nonce: KlKjZg
+.. section: Core and Builtins
+
+Add built-in :class:`frozendict` type. Patch by Victor Stinner.
+
+..
+
+.. date: 2026-02-12-12-39-50
+.. gh-issue: 144681
+.. nonce: Ns2OT2
+.. section: Core and Builtins
+
+Fix a JIT assertion failure when a conditional branch jumps to the same
+target as the fallthrough path.
+
+..
+
+.. date: 2026-02-11-13-30-11
+.. gh-issue: 143300
+.. nonce: yjB63-
+.. section: Core and Builtins
+
+Add :c:func:`PyUnstable_SetImmortal` C-API function to mark objects as
+:term:`immortal`.
+
+..
+
+.. date: 2026-02-11-11-28-25
+.. gh-issue: 144702
+.. nonce: XjFumv
+.. section: Core and Builtins
+
+Clarify the error message raised when a class pattern is used to match on a
+non-class object.
+
+..
+
+.. date: 2026-02-08-13-14-00
+.. gh-issue: 144569
+.. nonce: pjlJVe
+.. section: Core and Builtins
+
+Optimize ``BINARY_SLICE`` for list, tuple, and unicode by avoiding temporary
+``slice`` object creation.
+
+..
+
+.. date: 2026-02-06-21-45-52
+.. gh-issue: 144438
+.. nonce: GI_uB1LR
+.. section: Core and Builtins
+
+Align the QSBR thread state array to a 64-byte cache line boundary to avoid
+false sharing in the :term:`free-threaded build`.
+
+..
+
+.. date: 2025-12-06-15-46-32
+.. gh-issue: 142349
+.. nonce: IdTuYL
+.. section: Core and Builtins
+
+Implement :pep:`810`. Patch by Pablo Galindo and Dino Viehland.
+
+..
+
+.. date: 2025-11-09-15-44-58
+.. gh-issue: 141226
+.. nonce: KTb_3F
+.. section: Core and Builtins
+
+Deprecate :pep:`456` support for providing an external definition of the
+string hashing scheme. Removal is scheduled for Python 3.19. Patch by
+Bénédikt Tran.
+
+..
+
+.. date: 2025-09-15-13-28-48
+.. gh-issue: 138912
+.. nonce: 61EYbn
+.. section: Core and Builtins
+
+Improve :opcode:`MATCH_CLASS` performance by up to 52% in certain cases.
+Patch by Marc Mueller.
+
+..
+
+.. date: 2025-02-19-21-06-30
+.. gh-issue: 130327
+.. nonce: z3TaR8
+.. section: Core and Builtins
+
+Fix erroneous clearing of an object's :attr:`~object.__dict__` if
+overwritten at runtime.
+
+..
+
+.. date: 2023-07-26-00-03-00
+.. gh-issue: 80667
+.. nonce: N7Dh8B
+.. section: Core and Builtins
+
+Literals using the ``\N{name}`` escape syntax can now construct CJK
+ideographs and Hangul syllables using case-insensitive names.
+
+..
+
+.. date: 2026-03-03-14-59-57
+.. gh-issue: 142417
+.. nonce: HiNP5j
+.. section: C API
+
+Restore private provisional ``_Py_InitializeMain()`` function removed in
+Python 3.14. Patch by Victor Stinner.
+
+..
+
+.. date: 2026-02-24-14-46-05
+.. gh-issue: 144748
+.. nonce: uhnFtE
+.. section: C API
+
+:c:func:`PyErr_CheckSignals` now raises the exception scheduled by
+:c:func:`PyThreadState_SetAsyncExc`, if any.
+
+..
+
+.. date: 2026-02-18-15-12-34
+.. gh-issue: 144981
+.. nonce: 4ZdM63
+.. section: C API
+
+Made :c:func:`PyUnstable_Code_SetExtra`, :c:func:`PyUnstable_Code_GetExtra`,
+and :c:func:`PyUnstable_Eval_RequestCodeExtraIndex` thread-safe on the
+:term:`free threaded ` build.
+
+..
+
+.. date: 2026-02-12-19-03-31
+.. gh-issue: 141510
+.. nonce: U_1tjz
+.. section: C API
+
+Add the following functions for the new :class:`frozendict` type:
+
+* :c:func:`PyAnyDict_Check`
+* :c:func:`PyAnyDict_CheckExact`
+* :c:func:`PyFrozenDict_Check`
+* :c:func:`PyFrozenDict_CheckExact`
+* :c:func:`PyFrozenDict_New`
+
+Patch by Victor Stinner.
+
+..
+
+.. date: 2026-02-10-14-49-49
+.. gh-issue: 121617
+.. nonce: 57vMqa
+.. section: C API
+
+``Python.h`` now also includes ```` in the limited C API version
+3.11 and newer to fix the :c:macro:`Py_CLEAR` macro which uses ``memcpy()``.
+Patch by Victor Stinner.
+
+..
+
+.. date: 2026-01-27-18-15-15
+.. gh-issue: 144175
+.. nonce: qHK5Jf
+.. section: C API
+
+Add :c:func:`PyArg_ParseArray` and :c:func:`PyArg_ParseArrayAndKeywords`
+functions to parse arguments of functions using the :c:macro:`METH_FASTCALL`
+calling convention. Patch by Victor Stinner.
+
+..
+
+.. date: 2026-02-27-18-10-02
+.. gh-issue: 144533
+.. nonce: 21fk9L
+.. section: Build
+
+Use wasmtime's ``--argv0`` to auto-discover sysconfig in WASI builds
+
+..
+
+.. date: 2026-02-22-13-35-20
+.. gh-issue: 145110
+.. nonce: KgWofW
+.. section: Build
+
+Fix targets "Clean" and "CLeanAll" in case of PGO builds on Windows. Patch
+by Chris Eibl.
+
+..
+
+.. date: 2026-02-10-18-26-04
+.. gh-issue: 144679
+.. nonce: FIH73W
+.. section: Build
+
+When building with Visual Studio 2026 (Version 18), use PlatformToolSet v145
+by default. Patch by Chris Eibl.
+
+..
+
+.. date: 2026-02-10-16-59-56
+.. gh-issue: 144675
+.. nonce: Wrf3Es
+.. section: Build
+
+Update to WASI SDK 30.
+
+..
+
+.. date: 2025-07-21-00-33-38
+.. gh-issue: 136677
+.. nonce: Y1_3ec
+.. section: Build
+
+Introduce executable specific linker flags to ``./configure``.
diff --git a/Misc/NEWS.d/next/Build/2025-07-21-00-33-38.gh-issue-136677.Y1_3ec.rst b/Misc/NEWS.d/next/Build/2025-07-21-00-33-38.gh-issue-136677.Y1_3ec.rst
deleted file mode 100644
index 30addc4bf64d4b..00000000000000
--- a/Misc/NEWS.d/next/Build/2025-07-21-00-33-38.gh-issue-136677.Y1_3ec.rst
+++ /dev/null
@@ -1 +0,0 @@
-Introduce executable specific linker flags to ``./configure``.
diff --git a/Misc/NEWS.d/next/Build/2026-02-10-16-59-56.gh-issue-144675.Wrf3Es.rst b/Misc/NEWS.d/next/Build/2026-02-10-16-59-56.gh-issue-144675.Wrf3Es.rst
deleted file mode 100644
index 1018ed95a2af77..00000000000000
--- a/Misc/NEWS.d/next/Build/2026-02-10-16-59-56.gh-issue-144675.Wrf3Es.rst
+++ /dev/null
@@ -1 +0,0 @@
-Update to WASI SDK 30.
diff --git a/Misc/NEWS.d/next/Build/2026-02-10-18-26-04.gh-issue-144679.FIH73W.rst b/Misc/NEWS.d/next/Build/2026-02-10-18-26-04.gh-issue-144679.FIH73W.rst
deleted file mode 100644
index ebcfda54da39a7..00000000000000
--- a/Misc/NEWS.d/next/Build/2026-02-10-18-26-04.gh-issue-144679.FIH73W.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-When building with Visual Studio 2026 (Version 18), use PlatformToolSet v145
-by default. Patch by Chris Eibl.
diff --git a/Misc/NEWS.d/next/Build/2026-02-22-13-35-20.gh-issue-145110.KgWofW.rst b/Misc/NEWS.d/next/Build/2026-02-22-13-35-20.gh-issue-145110.KgWofW.rst
deleted file mode 100644
index 035d0c141d36ed..00000000000000
--- a/Misc/NEWS.d/next/Build/2026-02-22-13-35-20.gh-issue-145110.KgWofW.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix targets "Clean" and "CLeanAll" in case of PGO builds on Windows. Patch by
-Chris Eibl.
diff --git a/Misc/NEWS.d/next/Build/2026-02-27-18-10-02.gh-issue-144533.21fk9L.rst b/Misc/NEWS.d/next/Build/2026-02-27-18-10-02.gh-issue-144533.21fk9L.rst
deleted file mode 100644
index d6e0201b90c550..00000000000000
--- a/Misc/NEWS.d/next/Build/2026-02-27-18-10-02.gh-issue-144533.21fk9L.rst
+++ /dev/null
@@ -1 +0,0 @@
-Use wasmtime's ``--argv0`` to auto-discover sysconfig in WASI builds
diff --git a/Misc/NEWS.d/next/C_API/2026-01-27-18-15-15.gh-issue-144175.qHK5Jf.rst b/Misc/NEWS.d/next/C_API/2026-01-27-18-15-15.gh-issue-144175.qHK5Jf.rst
deleted file mode 100644
index da1e489bb3d2e5..00000000000000
--- a/Misc/NEWS.d/next/C_API/2026-01-27-18-15-15.gh-issue-144175.qHK5Jf.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Add :c:func:`PyArg_ParseArray` and :c:func:`PyArg_ParseArrayAndKeywords`
-functions to parse arguments of functions using the :c:macro:`METH_FASTCALL`
-calling convention. Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/C_API/2026-02-10-14-49-49.gh-issue-121617.57vMqa.rst b/Misc/NEWS.d/next/C_API/2026-02-10-14-49-49.gh-issue-121617.57vMqa.rst
deleted file mode 100644
index cf84f8b1b0d36b..00000000000000
--- a/Misc/NEWS.d/next/C_API/2026-02-10-14-49-49.gh-issue-121617.57vMqa.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-``Python.h`` now also includes ```` in the limited C API version 3.11
-and newer to fix the :c:macro:`Py_CLEAR` macro which uses ``memcpy()``. Patch
-by Victor Stinner.
diff --git a/Misc/NEWS.d/next/C_API/2026-02-12-19-03-31.gh-issue-141510.U_1tjz.rst b/Misc/NEWS.d/next/C_API/2026-02-12-19-03-31.gh-issue-141510.U_1tjz.rst
deleted file mode 100644
index 57a25fe045f04c..00000000000000
--- a/Misc/NEWS.d/next/C_API/2026-02-12-19-03-31.gh-issue-141510.U_1tjz.rst
+++ /dev/null
@@ -1,9 +0,0 @@
-Add the following functions for the new :class:`frozendict` type:
-
-* :c:func:`PyAnyDict_Check`
-* :c:func:`PyAnyDict_CheckExact`
-* :c:func:`PyFrozenDict_Check`
-* :c:func:`PyFrozenDict_CheckExact`
-* :c:func:`PyFrozenDict_New`
-
-Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/C_API/2026-02-18-15-12-34.gh-issue-144981.4ZdM63.rst b/Misc/NEWS.d/next/C_API/2026-02-18-15-12-34.gh-issue-144981.4ZdM63.rst
deleted file mode 100644
index d86886ab09704a..00000000000000
--- a/Misc/NEWS.d/next/C_API/2026-02-18-15-12-34.gh-issue-144981.4ZdM63.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Made :c:func:`PyUnstable_Code_SetExtra`, :c:func:`PyUnstable_Code_GetExtra`,
-and :c:func:`PyUnstable_Eval_RequestCodeExtraIndex` thread-safe on the
-:term:`free threaded ` build.
diff --git a/Misc/NEWS.d/next/C_API/2026-02-24-14-46-05.gh-issue-144748.uhnFtE.rst b/Misc/NEWS.d/next/C_API/2026-02-24-14-46-05.gh-issue-144748.uhnFtE.rst
deleted file mode 100644
index bda7003be94e54..00000000000000
--- a/Misc/NEWS.d/next/C_API/2026-02-24-14-46-05.gh-issue-144748.uhnFtE.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-:c:func:`PyErr_CheckSignals` now raises the exception scheduled by
-:c:func:`PyThreadState_SetAsyncExc`, if any.
diff --git a/Misc/NEWS.d/next/C_API/2026-03-03-14-59-57.gh-issue-142417.HiNP5j.rst b/Misc/NEWS.d/next/C_API/2026-03-03-14-59-57.gh-issue-142417.HiNP5j.rst
deleted file mode 100644
index 943be5b4533d9e..00000000000000
--- a/Misc/NEWS.d/next/C_API/2026-03-03-14-59-57.gh-issue-142417.HiNP5j.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Restore private provisional ``_Py_InitializeMain()`` function removed in
-Python 3.14. Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2023-07-26-00-03-00.gh-issue-80667.N7Dh8B.rst b/Misc/NEWS.d/next/Core_and_Builtins/2023-07-26-00-03-00.gh-issue-80667.N7Dh8B.rst
deleted file mode 100644
index db87a5ed9c7fc2..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2023-07-26-00-03-00.gh-issue-80667.N7Dh8B.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Literals using the ``\N{name}`` escape syntax can now construct CJK
-ideographs and Hangul syllables using case-insensitive names.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-02-19-21-06-30.gh-issue-130327.z3TaR8.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-19-21-06-30.gh-issue-130327.z3TaR8.rst
deleted file mode 100644
index 9b9a282b5ab414..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2025-02-19-21-06-30.gh-issue-130327.z3TaR8.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix erroneous clearing of an object's :attr:`~object.__dict__` if
-overwritten at runtime.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-28-48.gh-issue-138912.61EYbn.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-28-48.gh-issue-138912.61EYbn.rst
deleted file mode 100644
index f5d312a289fe21..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-15-13-28-48.gh-issue-138912.61EYbn.rst
+++ /dev/null
@@ -1 +0,0 @@
-Improve :opcode:`MATCH_CLASS` performance by up to 52% in certain cases. Patch by Marc Mueller.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-09-15-44-58.gh-issue-141226.KTb_3F.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-09-15-44-58.gh-issue-141226.KTb_3F.rst
deleted file mode 100644
index 3f7ce7326187d4..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-09-15-44-58.gh-issue-141226.KTb_3F.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Deprecate :pep:`456` support for providing an external definition
-of the string hashing scheme. Removal is scheduled for Python 3.19.
-Patch by Bénédikt Tran.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-06-15-46-32.gh-issue-142349.IdTuYL.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-06-15-46-32.gh-issue-142349.IdTuYL.rst
deleted file mode 100644
index 73cc167fd04013..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-06-15-46-32.gh-issue-142349.IdTuYL.rst
+++ /dev/null
@@ -1 +0,0 @@
-Implement :pep:`810`. Patch by Pablo Galindo and Dino Viehland.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-06-21-45-52.gh-issue-144438.GI_uB1LR.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-06-21-45-52.gh-issue-144438.GI_uB1LR.rst
deleted file mode 100644
index 3e33e461ae8b5a..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-06-21-45-52.gh-issue-144438.GI_uB1LR.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Align the QSBR thread state array to a 64-byte cache line boundary to
-avoid false sharing in the :term:`free-threaded build`.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-08-13-14-00.gh-issue-144569.pjlJVe.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-08-13-14-00.gh-issue-144569.pjlJVe.rst
deleted file mode 100644
index bdd0d6c2f7b944..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-08-13-14-00.gh-issue-144569.pjlJVe.rst
+++ /dev/null
@@ -1 +0,0 @@
-Optimize ``BINARY_SLICE`` for list, tuple, and unicode by avoiding temporary ``slice`` object creation.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-11-11-28-25.gh-issue-144702.XjFumv.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-11-11-28-25.gh-issue-144702.XjFumv.rst
deleted file mode 100644
index 01d2b6570ded96..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-11-11-28-25.gh-issue-144702.XjFumv.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Clarify the error message raised when a class pattern is used to match on a
-non-class object.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-11-13-30-11.gh-issue-143300.yjB63-.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-11-13-30-11.gh-issue-143300.yjB63-.rst
deleted file mode 100644
index 85c75a224e42fc..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-11-13-30-11.gh-issue-143300.yjB63-.rst
+++ /dev/null
@@ -1 +0,0 @@
-Add :c:func:`PyUnstable_SetImmortal` C-API function to mark objects as :term:`immortal`.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-12-39-50.gh-issue-144681.Ns2OT2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-12-39-50.gh-issue-144681.Ns2OT2.rst
deleted file mode 100644
index c8ca7a7fa194ee..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-12-39-50.gh-issue-144681.Ns2OT2.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix a JIT assertion failure when a conditional branch jumps to the same target as the fallthrough path.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-19-01-13.gh-issue-141510.KlKjZg.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-19-01-13.gh-issue-141510.KlKjZg.rst
deleted file mode 100644
index 4596e273fc6118..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-12-19-01-13.gh-issue-141510.KlKjZg.rst
+++ /dev/null
@@ -1 +0,0 @@
-Add built-in :class:`frozendict` type. Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-13-12-00-00.gh-issue-144759.d3qYpe.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-13-12-00-00.gh-issue-144759.d3qYpe.rst
deleted file mode 100644
index 46786d0672b0a8..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-13-12-00-00.gh-issue-144759.d3qYpe.rst
+++ /dev/null
@@ -1,4 +0,0 @@
-Fix undefined behavior in the lexer when ``start`` and ``multi_line_start``
-pointers are ``NULL`` in ``_PyLexer_remember_fstring_buffers()`` and
-``_PyLexer_restore_fstring_buffers()``. The ``NULL`` pointer arithmetic
-(``NULL - valid_pointer``) is now guarded with explicit ``NULL`` checks.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-13-18-30-59.gh-issue-144766.JGu3x3.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-13-18-30-59.gh-issue-144766.JGu3x3.rst
deleted file mode 100644
index d9613c95af1915..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-13-18-30-59.gh-issue-144766.JGu3x3.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix a crash in fork child process when perf support is enabled.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-16-12-28-43.gh-issue-144872.k9_Q30.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-16-12-28-43.gh-issue-144872.k9_Q30.rst
deleted file mode 100644
index c06bf01baee6fd..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-16-12-28-43.gh-issue-144872.k9_Q30.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix heap buffer overflow in the parser found by OSS-Fuzz.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-18-27-28.gh-issue-144914.DcXO4m.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-18-27-28.gh-issue-144914.DcXO4m.rst
deleted file mode 100644
index f13b8541a0ebe2..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-18-27-28.gh-issue-144914.DcXO4m.rst
+++ /dev/null
@@ -1 +0,0 @@
-Use ``mimalloc`` for raw memory allocations such as via :c:func:`PyMem_RawMalloc` for better performance on :term:`free-threaded builds `. Patch by Kumar Aditya.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-21-04-03.gh-issue-100239.LyVabQ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-21-04-03.gh-issue-100239.LyVabQ.rst
deleted file mode 100644
index 3cfc3e930d1e9d..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-21-04-03.gh-issue-100239.LyVabQ.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Speedup ``BINARY_OP_EXTEND`` for exact floats and medium-size integers by up
-to 15%. Patch by Chris Eibl.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-22-27-11.gh-issue-141510.-4yYsf.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-22-27-11.gh-issue-141510.-4yYsf.rst
deleted file mode 100644
index b031fb3c75dea7..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-17-22-27-11.gh-issue-141510.-4yYsf.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Optimize :meth:`!frozendict.fromkeys` to avoid unnecessary thread-safety operations
-in frozendict cases. Patch by Donghee Na.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-18-21-44-39.gh-issue-141510.7LST2O.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-18-21-44-39.gh-issue-141510.7LST2O.rst
deleted file mode 100644
index 87d6a2a6df96a1..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-18-21-44-39.gh-issue-141510.7LST2O.rst
+++ /dev/null
@@ -1 +0,0 @@
-Update specializer to support frozendict. Patch by Donghee Na.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-19-12-49-15.gh-issue-144995.Ob2oYJ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-19-12-49-15.gh-issue-144995.Ob2oYJ.rst
deleted file mode 100644
index 83d84b9505c5a5..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-19-12-49-15.gh-issue-144995.Ob2oYJ.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Optimize :class:`memoryview` comparison: a :class:`memoryview` is equal to
-itself, there is no need to compare values. Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-21-09-47-45.gh-issue-145058.e-RBw-.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-21-09-47-45.gh-issue-145058.e-RBw-.rst
deleted file mode 100644
index 05eb296f96ec6d..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-21-09-47-45.gh-issue-145058.e-RBw-.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix a crash when :func:`!__lazy_import__` is passed a non-string argument,
-by raising an :exc:`TypeError` instead.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-21-12-16-46.gh-issue-145055.VyT-zI.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-21-12-16-46.gh-issue-145055.VyT-zI.rst
deleted file mode 100644
index c9daaa27717ed0..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-21-12-16-46.gh-issue-145055.VyT-zI.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-:func:`exec` and :func:`eval` now accept :class:`frozendict` for *globals*.
-Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-07-51-10.gh-issue-145064.iIMGKA.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-07-51-10.gh-issue-145064.iIMGKA.rst
deleted file mode 100644
index 1f298e164f4488..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-07-51-10.gh-issue-145064.iIMGKA.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix JIT optimizer assertion failure during ``CALL_ALLOC_AND_ENTER_INIT`` side exit.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-19-05-03.gh-issue-145118.bU6Sic.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-19-05-03.gh-issue-145118.bU6Sic.rst
deleted file mode 100644
index 24507d4a411f85..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-19-05-03.gh-issue-145118.bU6Sic.rst
+++ /dev/null
@@ -1 +0,0 @@
-:func:`type` now accepts :class:`frozendict` as an argument.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-20-15-00.gh-issue-144015.pystrhex_simd.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-20-15-00.gh-issue-144015.pystrhex_simd.rst
deleted file mode 100644
index 122315e031bc87..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-20-15-00.gh-issue-144015.pystrhex_simd.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-Speed up :meth:`bytes.hex`, :meth:`bytearray.hex`, :func:`binascii.hexlify`,
-and :mod:`hashlib` ``.hexdigest()`` operations with SIMD on x86-64, ARM64,
-and ARM32 with NEON when built with gcc (version 12 or higher) or clang
-(version 3 or higher) compilers. Around 1.1-3x faster for common 16-64 byte
-inputs such as hashlib hex digests, and up to 8x faster for larger data.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-22-05-09.gh-issue-145118.TaKMJE.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-22-05-09.gh-issue-145118.TaKMJE.rst
deleted file mode 100644
index fccc3bc2a1804e..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-22-22-05-09.gh-issue-145118.TaKMJE.rst
+++ /dev/null
@@ -1 +0,0 @@
-:meth:`str.maketrans` now accepts :class:`frozendict`.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-23-23-18-28.gh-issue-145142.T-XbVe.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-23-23-18-28.gh-issue-145142.T-XbVe.rst
deleted file mode 100644
index 5f6043cc3d9660..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-23-23-18-28.gh-issue-145142.T-XbVe.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix a crash in the free-threaded build when the dictionary argument to
-:meth:`str.maketrans` is concurrently modified.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-24-18-30-56.gh-issue-145187.YjPu1Z.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-24-18-30-56.gh-issue-145187.YjPu1Z.rst
deleted file mode 100644
index 08c6b44164ebc3..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-24-18-30-56.gh-issue-145187.YjPu1Z.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix compiler assertion fail when a type parameter bound contains an invalid
-expression in a conditional block.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-25-15-02-08.gh-issue-145197.G6hAUk.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-25-15-02-08.gh-issue-145197.G6hAUk.rst
deleted file mode 100644
index 6d6afe5abfea9c..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-25-15-02-08.gh-issue-145197.G6hAUk.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix JIT trace crash when recording function from cleared generator frame.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-12-00-00.gh-issue-130555.TMSOIu.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-12-00-00.gh-issue-130555.TMSOIu.rst
deleted file mode 100644
index 5a2106480fb843..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-12-00-00.gh-issue-130555.TMSOIu.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Fix use-after-free in :meth:`dict.clear` when the dictionary values are
-embedded in an object and a destructor causes re-entrant mutation of the
-dictionary.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-18-00-00.gh-issue-145241.hL2k9Q.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-18-00-00.gh-issue-145241.hL2k9Q.rst
deleted file mode 100644
index a3253132a577ba..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-18-00-00.gh-issue-145241.hL2k9Q.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Specialized the parser error for when ``with`` items are followed
-by a trailing comma (for example, ``with item,:``), raising a clearer
-:exc:`SyntaxError` message. Patch by Pablo Galindo and Bartosz Sławecki.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-20-51-54.gh-issue-145273.B5QcUp.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-20-51-54.gh-issue-145273.B5QcUp.rst
deleted file mode 100644
index 8d9e4a872d0d7a..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-20-51-54.gh-issue-145273.B5QcUp.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-A warning is now shown during :ref:`sys-path-init` if it can't find a valid
-standard library.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-21-07-38.gh-issue-145275.qE-3O1.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-21-07-38.gh-issue-145275.qE-3O1.rst
deleted file mode 100644
index 1723a7c8c10717..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-21-07-38.gh-issue-145275.qE-3O1.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Added the :option:`-X pathconfig_warnings<-X>` and
-:envvar:`PYTHON_PATHCONFIG_WARNINGS` options, allowing to disable warnings
-from :ref:`sys-path-init`.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-21-36-00.gh-issue-145234.w0mQ9n.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-21-36-00.gh-issue-145234.w0mQ9n.rst
deleted file mode 100644
index caeffff0be8a85..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-26-21-36-00.gh-issue-145234.w0mQ9n.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-Fixed a ``SystemError`` in the parser when an encoding cookie (for example,
-UTF-7) decodes to carriage returns (``\r``). Newlines are now normalized after
-decoding in the string tokenizer.
-
-Patch by Pablo Galindo.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-28-16-46-17.gh-issue-145376.lG5u1a.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-28-16-46-17.gh-issue-145376.lG5u1a.rst
deleted file mode 100644
index a5a6908757e458..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-28-16-46-17.gh-issue-145376.lG5u1a.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix reference leaks in various unusual error scenarios.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-01-13-37-31.gh-issue-145335.e36kPJ.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-01-13-37-31.gh-issue-145335.e36kPJ.rst
deleted file mode 100644
index 42ed85c7da31ac..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-01-13-37-31.gh-issue-145335.e36kPJ.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix a crash in :func:`os.pathconf` when called with ``-1`` as the path
-argument.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-05-16-16-17.gh-issue-143055.qDUFlY.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-05-16-16-17.gh-issue-143055.qDUFlY.rst
deleted file mode 100644
index 9b55459bffdea8..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-05-16-16-17.gh-issue-143055.qDUFlY.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix crash in AST unparser when unparsing dict comprehension unpacking.
-Found by OSS Fuzz in :oss-fuzz:`489790200`.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-05-19-10-56.gh-issue-145566.H4RupyYN.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-05-19-10-56.gh-issue-145566.H4RupyYN.rst
deleted file mode 100644
index 723b81ddc5f897..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-05-19-10-56.gh-issue-145566.H4RupyYN.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-In the free threading build, skip the stop-the-world pause when reassigning
-``__class__`` on a newly created object.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-06-01-36-20.gh-issue-116738.OWVWRx.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-06-01-36-20.gh-issue-116738.OWVWRx.rst
deleted file mode 100644
index 212fd7b02902e9..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-06-01-36-20.gh-issue-116738.OWVWRx.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Make :meth:`!mmap.mmap.set_name` thread-safe on the :term:`free threaded ` build.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-06-21-05-05.gh-issue-145615.NKXXZgDW.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-06-21-05-05.gh-issue-145615.NKXXZgDW.rst
deleted file mode 100644
index 2183eef618daae..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-06-21-05-05.gh-issue-145615.NKXXZgDW.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fixed a memory leak in the :term:`free-threaded build` where mimalloc pages
-could become permanently unreclaimable until the owning thread exited.
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-09-18-52-03.gh-issue-145701.79KQyO.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-03-09-18-52-03.gh-issue-145701.79KQyO.rst
deleted file mode 100644
index 23796082fb616f..00000000000000
--- a/Misc/NEWS.d/next/Core_and_Builtins/2026-03-09-18-52-03.gh-issue-145701.79KQyO.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Fix :exc:`SystemError` when ``__classdict__`` or
-``__conditional_annotations__`` is in a class-scope inlined comprehension.
-Found by OSS Fuzz in :oss-fuzz:`491105000`.
diff --git a/Misc/NEWS.d/next/Documentation/2025-08-02-18-59-01.gh-issue-136246.RIK7nE.rst b/Misc/NEWS.d/next/Documentation/2025-08-02-18-59-01.gh-issue-136246.RIK7nE.rst
deleted file mode 100644
index 5f83785df13209..00000000000000
--- a/Misc/NEWS.d/next/Documentation/2025-08-02-18-59-01.gh-issue-136246.RIK7nE.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-A new "Improve this page" link is available in the left-hand sidebar of the
-docs, offering links to create GitHub issues, discussion forum posts, or
-pull requests.
diff --git a/Misc/NEWS.d/next/Documentation/2026-01-06-16-04-08.gh-issue-110937.SyO5lk.rst b/Misc/NEWS.d/next/Documentation/2026-01-06-16-04-08.gh-issue-110937.SyO5lk.rst
deleted file mode 100644
index d29bde5ca690c6..00000000000000
--- a/Misc/NEWS.d/next/Documentation/2026-01-06-16-04-08.gh-issue-110937.SyO5lk.rst
+++ /dev/null
@@ -1 +0,0 @@
-Document rest of full public :class:`importlib.metadata.Distribution` API. Also add the (already documented) :class:`~importlib.metadata.PackagePath` to ``__all__``.
diff --git a/Misc/NEWS.d/next/Documentation/2026-03-03-08-18-00.gh-issue-145450.VI7GXj.rst b/Misc/NEWS.d/next/Documentation/2026-03-03-08-18-00.gh-issue-145450.VI7GXj.rst
deleted file mode 100644
index 681c932b34a05d..00000000000000
--- a/Misc/NEWS.d/next/Documentation/2026-03-03-08-18-00.gh-issue-145450.VI7GXj.rst
+++ /dev/null
@@ -1 +0,0 @@
-Document missing public :class:`wave.Wave_write` getter methods.
diff --git a/Misc/NEWS.d/next/Library/2017-12-15-09-32-57.bpo-32234.XaOkhR.rst b/Misc/NEWS.d/next/Library/2017-12-15-09-32-57.bpo-32234.XaOkhR.rst
deleted file mode 100644
index b22289835620df..00000000000000
--- a/Misc/NEWS.d/next/Library/2017-12-15-09-32-57.bpo-32234.XaOkhR.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-:class:`mailbox.Mailbox` instances can now be used as a context manager.
-The Mailbox is locked on context entry and unlocked and closed at context exit.
diff --git a/Misc/NEWS.d/next/Library/2018-05-11-12-26-16.bpo-3405.CacMw9.rst b/Misc/NEWS.d/next/Library/2018-05-11-12-26-16.bpo-3405.CacMw9.rst
deleted file mode 100644
index bf97bf0231fc0a..00000000000000
--- a/Misc/NEWS.d/next/Library/2018-05-11-12-26-16.bpo-3405.CacMw9.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Add support for user data of Tk virtual events and detail for
-``Enter``, ``Leave``, ``FocusIn``, ``FocusOut``, and
-``ConfigureRequest`` events to :mod:`tkinter`.
diff --git a/Misc/NEWS.d/next/Library/2020-04-07-05-09-34.bpo-40212.oPYeBs.rst b/Misc/NEWS.d/next/Library/2020-04-07-05-09-34.bpo-40212.oPYeBs.rst
deleted file mode 100644
index 2e9c3d81180e6a..00000000000000
--- a/Misc/NEWS.d/next/Library/2020-04-07-05-09-34.bpo-40212.oPYeBs.rst
+++ /dev/null
@@ -1 +0,0 @@
-Re-enable :func:`os.posix_fallocate` and :func:`os.posix_fadvise` on AIX.
diff --git a/Misc/NEWS.d/next/Library/2020-04-10-14-29-53.bpo-40243.85HRib.rst b/Misc/NEWS.d/next/Library/2020-04-10-14-29-53.bpo-40243.85HRib.rst
deleted file mode 100644
index 1f48525cdbecd0..00000000000000
--- a/Misc/NEWS.d/next/Library/2020-04-10-14-29-53.bpo-40243.85HRib.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix :meth:`!unicodedata.ucd_3_2_0.numeric` for non-decimal values.
diff --git a/Misc/NEWS.d/next/Library/2022-02-05-00-15-03.bpo-42353.0ebVGG.rst b/Misc/NEWS.d/next/Library/2022-02-05-00-15-03.bpo-42353.0ebVGG.rst
deleted file mode 100644
index a3e0a3e14af1fa..00000000000000
--- a/Misc/NEWS.d/next/Library/2022-02-05-00-15-03.bpo-42353.0ebVGG.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-The :mod:`re` module gains a new :func:`re.prefixmatch` function as an
-explicit spelling of what has to date always been known as :func:`re.match`.
-:class:`re.Pattern` similary gains a :meth:`re.Pattern.prefixmatch` method.
-
-Why? Explicit is better than implicit. Other widely used languages all use
-the term "match" to mean what Python uses the term "search" for. The
-unadorened "match" name in Python has been a frequent case of confusion and
-coding bugs due to the inconsistency with the rest if the software industry.
-
-We do not plan to deprecate and remove the older ``match`` name.
diff --git a/Misc/NEWS.d/next/Library/2023-02-05-20-02-30.gh-issue-80667.7LmzeA.rst b/Misc/NEWS.d/next/Library/2023-02-05-20-02-30.gh-issue-80667.7LmzeA.rst
deleted file mode 100644
index f82f1eeb0589c6..00000000000000
--- a/Misc/NEWS.d/next/Library/2023-02-05-20-02-30.gh-issue-80667.7LmzeA.rst
+++ /dev/null
@@ -1 +0,0 @@
-Add support for Tangut Ideographs names in :mod:`unicodedata`.
diff --git a/Misc/NEWS.d/next/Library/2024-09-30-15-31-59.gh-issue-124748.KYzYFp.rst b/Misc/NEWS.d/next/Library/2024-09-30-15-31-59.gh-issue-124748.KYzYFp.rst
deleted file mode 100644
index 5067db357fc577..00000000000000
--- a/Misc/NEWS.d/next/Library/2024-09-30-15-31-59.gh-issue-124748.KYzYFp.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Improve :exc:`TypeError` error message when :meth:`!weakref.WeakKeyDictionary.update`
-is used with keyword-only parameters.
diff --git a/Misc/NEWS.d/next/Library/2025-06-24-19-07-18.gh-issue-135883.38cePA.rst b/Misc/NEWS.d/next/Library/2025-06-24-19-07-18.gh-issue-135883.38cePA.rst
deleted file mode 100644
index 8f3efceaae1d91..00000000000000
--- a/Misc/NEWS.d/next/Library/2025-06-24-19-07-18.gh-issue-135883.38cePA.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix :mod:`sqlite3`'s :ref:`interactive shell ` keeping part of
-previous commands when scrolling history.
diff --git a/Misc/NEWS.d/next/Library/2025-08-04-23-20-43.gh-issue-137335.IIjDJN.rst b/Misc/NEWS.d/next/Library/2025-08-04-23-20-43.gh-issue-137335.IIjDJN.rst
deleted file mode 100644
index 2311ace10e411d..00000000000000
--- a/Misc/NEWS.d/next/Library/2025-08-04-23-20-43.gh-issue-137335.IIjDJN.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Get rid of any possibility of a name conflict for named pipes in
-:mod:`multiprocessing` and :mod:`asyncio` on Windows, no matter how small.
diff --git a/Misc/NEWS.d/next/Library/2025-10-10-14-08-58.gh-issue-139899.09leRY.rst b/Misc/NEWS.d/next/Library/2025-10-10-14-08-58.gh-issue-139899.09leRY.rst
deleted file mode 100644
index fe5e7d17ab6c8c..00000000000000
--- a/Misc/NEWS.d/next/Library/2025-10-10-14-08-58.gh-issue-139899.09leRY.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Introduced :meth:`importlib.abc.MetaPathFinder.discover`
-and :meth:`importlib.abc.PathEntryFinder.discover` to allow module and submodule
-name discovery without assuming the use of traditional filesystem based imports.
diff --git a/Misc/NEWS.d/next/Library/2025-12-06-16-14-18.gh-issue-142352.pW5HLX88.rst b/Misc/NEWS.d/next/Library/2025-12-06-16-14-18.gh-issue-142352.pW5HLX88.rst
deleted file mode 100644
index 13e38b118175b4..00000000000000
--- a/Misc/NEWS.d/next/Library/2025-12-06-16-14-18.gh-issue-142352.pW5HLX88.rst
+++ /dev/null
@@ -1,4 +0,0 @@
-Fix :meth:`asyncio.StreamWriter.start_tls` to transfer buffered data from
-:class:`~asyncio.StreamReader` to the SSL layer, preventing data loss when
-upgrading a connection to TLS mid-stream (e.g., when implementing PROXY
-protocol support).
diff --git a/Misc/NEWS.d/next/Library/2025-12-16-13-34-48.gh-issue-142787.wNitJX.rst b/Misc/NEWS.d/next/Library/2025-12-16-13-34-48.gh-issue-142787.wNitJX.rst
deleted file mode 100644
index e928bd2cac72a8..00000000000000
--- a/Misc/NEWS.d/next/Library/2025-12-16-13-34-48.gh-issue-142787.wNitJX.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix assertion failure in :mod:`sqlite3` blob subscript when slicing with
-indices that result in an empty slice.
diff --git a/Misc/NEWS.d/next/Library/2025-12-18-00-14-16.gh-issue-142781.gcOeYF.rst b/Misc/NEWS.d/next/Library/2025-12-18-00-14-16.gh-issue-142781.gcOeYF.rst
deleted file mode 100644
index 772e05766c5c69..00000000000000
--- a/Misc/NEWS.d/next/Library/2025-12-18-00-14-16.gh-issue-142781.gcOeYF.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-:mod:`zoneinfo`: fix a crash when instantiating :class:`~zoneinfo.ZoneInfo`
-objects for which the internal class-level cache is inconsistent.
diff --git a/Misc/NEWS.d/next/Library/2026-01-01-05-26-00.gh-issue-143304.Kv7x9Q.rst b/Misc/NEWS.d/next/Library/2026-01-01-05-26-00.gh-issue-143304.Kv7x9Q.rst
deleted file mode 100644
index 826b2e9a126d36..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-01-01-05-26-00.gh-issue-143304.Kv7x9Q.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix :class:`ctypes.CDLL` to honor the ``handle`` parameter on POSIX systems.
diff --git a/Misc/NEWS.d/next/Library/2026-01-10-22-58-30.gh-issue-85809.0eW4wt.rst b/Misc/NEWS.d/next/Library/2026-01-10-22-58-30.gh-issue-85809.0eW4wt.rst
deleted file mode 100644
index 3993c7a91da138..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-01-10-22-58-30.gh-issue-85809.0eW4wt.rst
+++ /dev/null
@@ -1 +0,0 @@
-Added :term:`path-like object` support for :func:`shutil.make_archive`.
diff --git a/Misc/NEWS.d/next/Library/2026-01-11-13-03-32.gh-issue-142516.u7An-s.rst b/Misc/NEWS.d/next/Library/2026-01-11-13-03-32.gh-issue-142516.u7An-s.rst
deleted file mode 100644
index efa7c8a1f62692..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-01-11-13-03-32.gh-issue-142516.u7An-s.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-:mod:`ssl`: fix reference leaks in :class:`ssl.SSLContext` objects. Patch by
-Bénédikt Tran.
diff --git a/Misc/NEWS.d/next/Library/2026-01-11-16-59-22.gh-issue-143698.b-Cpeb.rst b/Misc/NEWS.d/next/Library/2026-01-11-16-59-22.gh-issue-143698.b-Cpeb.rst
deleted file mode 100644
index 05dc4941c98a83..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-01-11-16-59-22.gh-issue-143698.b-Cpeb.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Raise :exc:`TypeError` instead of :exc:`SystemError` when the *scheduler*
-in :func:`os.posix_spawn` or :func:`os.posix_spawnp` is not a tuple.
-Patch by Bénédikt Tran.
diff --git a/Misc/NEWS.d/next/Library/2026-01-11-18-35-52.gh-issue-143698.gXDzsJ.rst b/Misc/NEWS.d/next/Library/2026-01-11-18-35-52.gh-issue-143698.gXDzsJ.rst
deleted file mode 100644
index 5f95b0de7d8895..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-01-11-18-35-52.gh-issue-143698.gXDzsJ.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Allow *scheduler* and *setpgroup* arguments to be explicitly :const:`None`
-when calling :func:`os.posix_spawn` or :func:`os.posix_spawnp`. Patch by
-Bénédikt Tran.
diff --git a/Misc/NEWS.d/next/Library/2026-01-12-19-39-57.gh-issue-140652.HvM9Bl.rst b/Misc/NEWS.d/next/Library/2026-01-12-19-39-57.gh-issue-140652.HvM9Bl.rst
deleted file mode 100644
index bed126f02f8714..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-01-12-19-39-57.gh-issue-140652.HvM9Bl.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix a crash in :func:`!_interpchannels.list_all` after closing a channel.
diff --git a/Misc/NEWS.d/next/Library/2026-01-17-08-44-25.gh-issue-143637.qyPqDo.rst b/Misc/NEWS.d/next/Library/2026-01-17-08-44-25.gh-issue-143637.qyPqDo.rst
deleted file mode 100644
index cbb21194d5b387..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-01-17-08-44-25.gh-issue-143637.qyPqDo.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fixed a crash in socket.sendmsg() that could occur if ancillary data is mutated re-entrantly during argument parsing.
diff --git a/Misc/NEWS.d/next/Library/2026-02-03-19-57-41.gh-issue-144316.wop870.rst b/Misc/NEWS.d/next/Library/2026-02-03-19-57-41.gh-issue-144316.wop870.rst
deleted file mode 100644
index b9d0749f56ba6a..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-03-19-57-41.gh-issue-144316.wop870.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix crash in ``_remote_debugging`` that caused ``test_external_inspection`` to intermittently fail. Patch by Taegyun Kim.
diff --git a/Misc/NEWS.d/next/Library/2026-02-07-16-31-42.gh-issue-144285.iyH9iL.rst b/Misc/NEWS.d/next/Library/2026-02-07-16-31-42.gh-issue-144285.iyH9iL.rst
deleted file mode 100644
index e1119a85e9c1f3..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-07-16-31-42.gh-issue-144285.iyH9iL.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Attribute suggestions in :exc:`AttributeError` tracebacks are now formatted differently
-to make them easier to understand, for example: ``Did you mean '.datetime.now' instead of '.now'``.
-Contributed by Bartosz Sławecki.
diff --git a/Misc/NEWS.d/next/Library/2026-02-07-16-37-42.gh-issue-144475.8tFEXw.rst b/Misc/NEWS.d/next/Library/2026-02-07-16-37-42.gh-issue-144475.8tFEXw.rst
deleted file mode 100644
index b458399bb40640..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-07-16-37-42.gh-issue-144475.8tFEXw.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Calling :func:`repr` on :func:`functools.partial` is now safer
-when the partial object's internal attributes are replaced while
-the string representation is being generated.
diff --git a/Misc/NEWS.d/next/Library/2026-02-08-17-09-10.gh-issue-144321.w58PhQ.rst b/Misc/NEWS.d/next/Library/2026-02-08-17-09-10.gh-issue-144321.w58PhQ.rst
deleted file mode 100644
index 45561898e2e1e9..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-08-17-09-10.gh-issue-144321.w58PhQ.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-The functional syntax for creating :class:`typing.NamedTuple`
-classes now supports passing any :term:`iterable` of fields and types.
-Previously, only sequences were supported.
diff --git a/Misc/NEWS.d/next/Library/2026-02-09-02-16-36.gh-issue-144615.s04x4n.rst b/Misc/NEWS.d/next/Library/2026-02-09-02-16-36.gh-issue-144615.s04x4n.rst
deleted file mode 100644
index 1db257ae312e84..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-09-02-16-36.gh-issue-144615.s04x4n.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Methods directly decorated with :deco:`functools.singledispatchmethod` now
-dispatch on the second argument when called after being accessed as class
-attributes. Patch by Bartosz Sławecki.
diff --git a/Misc/NEWS.d/next/Library/2026-02-10-16-56-05.gh-issue-66305.PZ6GN8.rst b/Misc/NEWS.d/next/Library/2026-02-10-16-56-05.gh-issue-66305.PZ6GN8.rst
deleted file mode 100644
index 276711e6ba3900..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-10-16-56-05.gh-issue-66305.PZ6GN8.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Fixed a hang on Windows in the :mod:`tempfile` module when
-trying to create a temporary file or subdirectory in a non-writable
-directory.
diff --git a/Misc/NEWS.d/next/Library/2026-02-10-22-05-51.gh-issue-144156.UbrC7F.rst b/Misc/NEWS.d/next/Library/2026-02-10-22-05-51.gh-issue-144156.UbrC7F.rst
deleted file mode 100644
index 68e59a6276c092..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-10-22-05-51.gh-issue-144156.UbrC7F.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix the folding of headers by the :mod:`email` library when :rfc:`2047` encoded words are used. Now whitespace is correctly preserved and also correctly added between adjacent encoded words. The latter property was broken by the fix for gh-92081, which mostly fixed previous failures to preserve whitespace.
diff --git a/Misc/NEWS.d/next/Library/2026-02-12-17-56-17.gh-issue-117865.jE1ema.rst b/Misc/NEWS.d/next/Library/2026-02-12-17-56-17.gh-issue-117865.jE1ema.rst
deleted file mode 100644
index f45f6682869eb1..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-12-17-56-17.gh-issue-117865.jE1ema.rst
+++ /dev/null
@@ -1 +0,0 @@
-Reduce the import time of :mod:`inspect` module by ~20%.
diff --git a/Misc/NEWS.d/next/Library/2026-02-13-00-00-00.gh-issue-142224.BidiMissing.rst b/Misc/NEWS.d/next/Library/2026-02-13-00-00-00.gh-issue-142224.BidiMissing.rst
deleted file mode 100644
index 29fa908d739fc3..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-13-00-00-00.gh-issue-142224.BidiMissing.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-:func:`unicodedata.bidirectional` now return the correct default bidi class
-for unassigned code points.
diff --git a/Misc/NEWS.d/next/Library/2026-02-13-11-14-18.gh-issue-144763.cDwnEE.rst b/Misc/NEWS.d/next/Library/2026-02-13-11-14-18.gh-issue-144763.cDwnEE.rst
deleted file mode 100644
index 14eb4f49c8ad3c..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-13-11-14-18.gh-issue-144763.cDwnEE.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix a race condition in :mod:`tracemalloc`: it no longer detaches the attached
-thread state to acquire its internal lock. Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Library/2026-02-13-14-20-10.gh-issue-144782.0Y8TKj.rst b/Misc/NEWS.d/next/Library/2026-02-13-14-20-10.gh-issue-144782.0Y8TKj.rst
deleted file mode 100644
index 871005fd7d986c..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-13-14-20-10.gh-issue-144782.0Y8TKj.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix :class:`argparse.ArgumentParser` to be :mod:`pickleable `.
diff --git a/Misc/NEWS.d/next/Library/2026-02-14-14-56-44.gh-issue-140715.AbSheM.rst b/Misc/NEWS.d/next/Library/2026-02-14-14-56-44.gh-issue-140715.AbSheM.rst
deleted file mode 100644
index f7782f2fa4f23b..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-14-14-56-44.gh-issue-140715.AbSheM.rst
+++ /dev/null
@@ -1 +0,0 @@
-Add ``'%D'`` support to :meth:`~datetime.datetime.strptime`.
diff --git a/Misc/NEWS.d/next/Library/2026-02-15-00-00-00.gh-issue-144833.TUelo1.rst b/Misc/NEWS.d/next/Library/2026-02-15-00-00-00.gh-issue-144833.TUelo1.rst
deleted file mode 100644
index 6d5b18f59ee7ea..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-15-00-00-00.gh-issue-144833.TUelo1.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Fixed a use-after-free in :mod:`ssl` when ``SSL_new()`` returns NULL in
-``newPySSLSocket()``. The error was reported via a dangling pointer after the
-object had already been freed.
diff --git a/Misc/NEWS.d/next/Library/2026-02-15-12-02-20.gh-issue-144835.w_oS_J.rst b/Misc/NEWS.d/next/Library/2026-02-15-12-02-20.gh-issue-144835.w_oS_J.rst
deleted file mode 100644
index 9d603b51c48a93..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-15-12-02-20.gh-issue-144835.w_oS_J.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Added missing explanations for some parameters in :func:`glob.glob` and
-:func:`glob.iglob`.
diff --git a/Misc/NEWS.d/next/Library/2026-02-17-11-15-17.gh-issue-141510.ZmqEUb.rst b/Misc/NEWS.d/next/Library/2026-02-17-11-15-17.gh-issue-141510.ZmqEUb.rst
deleted file mode 100644
index 59a8b4165cdd15..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-17-11-15-17.gh-issue-141510.ZmqEUb.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-The :mod:`json` module now supports the :class:`frozendict` type. Patch by
-Victor Stinner.
diff --git a/Misc/NEWS.d/next/Library/2026-02-17-11-28-37.gh-issue-141510.OpAz0M.rst b/Misc/NEWS.d/next/Library/2026-02-17-11-28-37.gh-issue-141510.OpAz0M.rst
deleted file mode 100644
index 5b604124c6d7cc..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-17-11-28-37.gh-issue-141510.OpAz0M.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-The :mod:`copy` module now supports the :class:`frozendict` type. Patch by
-Pieter Eendebak based on work by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Library/2026-02-18-00-00-00.gh-issue-144809.nYpEUx.rst b/Misc/NEWS.d/next/Library/2026-02-18-00-00-00.gh-issue-144809.nYpEUx.rst
deleted file mode 100644
index 62c20b7fa06d94..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-18-00-00-00.gh-issue-144809.nYpEUx.rst
+++ /dev/null
@@ -1 +0,0 @@
-Make :class:`collections.deque` copy atomic in the :term:`free-threaded build`.
diff --git a/Misc/NEWS.d/next/Library/2026-02-18-13-45-00.gh-issue-144777.R97q0a.rst b/Misc/NEWS.d/next/Library/2026-02-18-13-45-00.gh-issue-144777.R97q0a.rst
deleted file mode 100644
index fd720bfd3f3da6..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-18-13-45-00.gh-issue-144777.R97q0a.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix data races in :class:`io.IncrementalNewlineDecoder` in the :term:`free-threaded build`.
diff --git a/Misc/NEWS.d/next/Library/2026-02-19-00-00-00.gh-issue-144986.atexit-leak.rst b/Misc/NEWS.d/next/Library/2026-02-19-00-00-00.gh-issue-144986.atexit-leak.rst
deleted file mode 100644
index 841c3758ec4df1..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-19-00-00-00.gh-issue-144986.atexit-leak.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix a memory leak in :func:`atexit.register`.
-Patch by Shamil Abdulaev.
diff --git a/Misc/NEWS.d/next/Library/2026-02-19-10-57-40.gh-issue-88091.N7qGV-.rst b/Misc/NEWS.d/next/Library/2026-02-19-10-57-40.gh-issue-88091.N7qGV-.rst
deleted file mode 100644
index 15cf25052bbb46..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-19-10-57-40.gh-issue-88091.N7qGV-.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix :func:`unicodedata.decomposition` for Hangul characters.
diff --git a/Misc/NEWS.d/next/Library/2026-02-19-15-42-06.gh-issue-134872.sjYX1-.rst b/Misc/NEWS.d/next/Library/2026-02-19-15-42-06.gh-issue-134872.sjYX1-.rst
deleted file mode 100644
index 4654dd060a6b78..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-19-15-42-06.gh-issue-134872.sjYX1-.rst
+++ /dev/null
@@ -1 +0,0 @@
-Add valid import name suggestions on :exc:`ModuleNotFoundError`.
diff --git a/Misc/NEWS.d/next/Library/2026-02-19-16-26-08.gh-issue-141510.4Qxy8_.rst b/Misc/NEWS.d/next/Library/2026-02-19-16-26-08.gh-issue-141510.4Qxy8_.rst
deleted file mode 100644
index cf22e82b8415b8..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-19-16-26-08.gh-issue-141510.4Qxy8_.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-``ParameterizedMIMEHeader.params`` of :mod:`email.headerregistry` is now a
-:class:`frozendict` instead of a :class:`types.MappingProxyType`. Patch by
-Victor Stinner.
diff --git a/Misc/NEWS.d/next/Library/2026-02-19-17-50-47.gh-issue-145006.9gqA0Q.rst b/Misc/NEWS.d/next/Library/2026-02-19-17-50-47.gh-issue-145006.9gqA0Q.rst
deleted file mode 100644
index 69052c7ca92c8a..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-19-17-50-47.gh-issue-145006.9gqA0Q.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Add :exc:`ModuleNotFoundError` hints when a module for a different ABI
-exists.
diff --git a/Misc/NEWS.d/next/Library/2026-02-19-18-02-54.gh-issue-141510.qzvYsO.rst b/Misc/NEWS.d/next/Library/2026-02-19-18-02-54.gh-issue-141510.qzvYsO.rst
deleted file mode 100644
index ae46ff0cbdd8b1..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-19-18-02-54.gh-issue-141510.qzvYsO.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-:func:`dataclasses.field`: if *metadata* is ``None``, use an empty
-:class:`frozendict`, instead of a :func:`~types.MappingProxyType` of an
-empty :class:`dict`. Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Library/2026-02-19-20-54-25.gh-issue-145033.X9EBPQ.rst b/Misc/NEWS.d/next/Library/2026-02-19-20-54-25.gh-issue-145033.X9EBPQ.rst
deleted file mode 100644
index 6f496bb30e1686..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-19-20-54-25.gh-issue-145033.X9EBPQ.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Add :data:`typing.TypeForm`, implementing :pep:`747`. Patch by Jelle
-Zijlstra.
diff --git a/Misc/NEWS.d/next/Library/2026-02-20-13-03-10.gh-issue-66802.OYcAi_.rst b/Misc/NEWS.d/next/Library/2026-02-20-13-03-10.gh-issue-66802.OYcAi_.rst
deleted file mode 100644
index 68a25262c7d7f7..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-20-13-03-10.gh-issue-66802.OYcAi_.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Add :func:`unicodedata.block` function to return the `Unicode block
-`_ of a
-character.
diff --git a/Misc/NEWS.d/next/Library/2026-02-21-17-34-53.gh-issue-123853.6RUwWh.rst b/Misc/NEWS.d/next/Library/2026-02-21-17-34-53.gh-issue-123853.6RUwWh.rst
deleted file mode 100644
index 1babcbfd8e678a..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-21-17-34-53.gh-issue-123853.6RUwWh.rst
+++ /dev/null
@@ -1 +0,0 @@
-Removed Windows 95 compatibility for :func:`locale.getdefaultlocale`.
diff --git a/Misc/NEWS.d/next/Library/2026-02-23-20-52-55.gh-issue-145158.vWJtxI.rst b/Misc/NEWS.d/next/Library/2026-02-23-20-52-55.gh-issue-145158.vWJtxI.rst
deleted file mode 100644
index 60a5e4ad1f0ca4..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-23-20-52-55.gh-issue-145158.vWJtxI.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Avoid undefined behaviour from signed integer overflow when parsing format
-strings in the :mod:`struct` module.
diff --git a/Misc/NEWS.d/next/Library/2026-02-27-18-04-51.gh-issue-76007.17idfK.rst b/Misc/NEWS.d/next/Library/2026-02-27-18-04-51.gh-issue-76007.17idfK.rst
deleted file mode 100644
index 4bb230dcb8473f..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-27-18-04-51.gh-issue-76007.17idfK.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-The ``version`` attribute of the :mod:`tarfile` module is deprecated and
-slated for removal in Python 3.20.
diff --git a/Misc/NEWS.d/next/Library/2026-02-27-19-00-26.gh-issue-145301.2Wih4b.rst b/Misc/NEWS.d/next/Library/2026-02-27-19-00-26.gh-issue-145301.2Wih4b.rst
deleted file mode 100644
index 7aeb6a1145ab4c..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-27-19-00-26.gh-issue-145301.2Wih4b.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-:mod:`hashlib`: fix a crash when the initialization of the underlying C
-extension module fails.
diff --git a/Misc/NEWS.d/next/Library/2026-02-28-00-55-00.gh-issue-145301.Lk2bRl.rst b/Misc/NEWS.d/next/Library/2026-02-28-00-55-00.gh-issue-145301.Lk2bRl.rst
deleted file mode 100644
index 436ff316b2c327..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-02-28-00-55-00.gh-issue-145301.Lk2bRl.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-:mod:`hmac`: fix a crash when the initialization of the underlying C
-extension module fails.
diff --git a/Misc/NEWS.d/next/Library/2026-03-02-19-41-39.gh-issue-145376.OOzSOh.rst b/Misc/NEWS.d/next/Library/2026-03-02-19-41-39.gh-issue-145376.OOzSOh.rst
deleted file mode 100644
index b6dbda0427181d..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-03-02-19-41-39.gh-issue-145376.OOzSOh.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix double free and null pointer dereference in unusual error scenarios
-in :mod:`hashlib` and :mod:`hmac` modules.
diff --git a/Misc/NEWS.d/next/Library/2026-03-02-20-08-09.gh-issue-145335.lVTBvd.rst b/Misc/NEWS.d/next/Library/2026-03-02-20-08-09.gh-issue-145335.lVTBvd.rst
deleted file mode 100644
index 53033b06c2fae0..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-03-02-20-08-09.gh-issue-145335.lVTBvd.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-``os.listdir(-1)`` and ``os.scandir(-1)`` now fail with
-``OSError(errno.EBADF)`` rather than listing the current directory.
-``os.listxattr(-1)`` now fails with ``OSError(errno.EBADF)`` rather than
-listing extended attributes of the current directory. Patch by Victor
-Stinner.
diff --git a/Misc/NEWS.d/next/Library/2026-03-03-11-49-44.gh-issue-145417.m_HxIL.rst b/Misc/NEWS.d/next/Library/2026-03-03-11-49-44.gh-issue-145417.m_HxIL.rst
deleted file mode 100644
index 17d62df72ce1ae..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-03-03-11-49-44.gh-issue-145417.m_HxIL.rst
+++ /dev/null
@@ -1,4 +0,0 @@
-:mod:`venv`: Prevent incorrect preservation of SELinux context
-when copying the ``Activate.ps1`` script. The script inherited
-the SELinux security context of the system template directory,
-rather than the destination project directory.
diff --git a/Misc/NEWS.d/next/Library/2026-03-05-16-06-09.gh-issue-141510.dFPAQS.rst b/Misc/NEWS.d/next/Library/2026-03-05-16-06-09.gh-issue-141510.dFPAQS.rst
deleted file mode 100644
index 280a7b3632ddae..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-03-05-16-06-09.gh-issue-141510.dFPAQS.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-:mod:`marshal` now supports :class:`frozendict` objects. The marshal format
-version was increased to 6. Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Library/2026-03-05-19-01-28.gh-issue-145551.gItPRl.rst b/Misc/NEWS.d/next/Library/2026-03-05-19-01-28.gh-issue-145551.gItPRl.rst
deleted file mode 100644
index 15b70d734ca3b9..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-03-05-19-01-28.gh-issue-145551.gItPRl.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix InvalidStateError when cancelling process created by :func:`asyncio.create_subprocess_exec` or :func:`asyncio.create_subprocess_shell`. Patch by Daan De Meyer.
diff --git a/Misc/NEWS.d/next/Library/2026-03-07-15-00-00.gh-issue-145623.2Y7LzT.rst b/Misc/NEWS.d/next/Library/2026-03-07-15-00-00.gh-issue-145623.2Y7LzT.rst
deleted file mode 100644
index 77b43e79e35860..00000000000000
--- a/Misc/NEWS.d/next/Library/2026-03-07-15-00-00.gh-issue-145623.2Y7LzT.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Fix crash in :mod:`struct` when calling :func:`repr` or
-``__sizeof__()`` on an uninitialized :class:`struct.Struct`
-object created via ``Struct.__new__()`` without calling ``__init__()``.
diff --git a/Misc/NEWS.d/next/Security/2026-01-31-21-56-54.gh-issue-144370.fp9m8t.rst b/Misc/NEWS.d/next/Security/2026-01-31-21-56-54.gh-issue-144370.fp9m8t.rst
deleted file mode 100644
index 2d13a0611322c5..00000000000000
--- a/Misc/NEWS.d/next/Security/2026-01-31-21-56-54.gh-issue-144370.fp9m8t.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Disallow usage of control characters in status in :mod:`wsgiref.handlers` to prevent HTTP header injections.
-Patch by Benedikt Johannes.
diff --git a/Misc/NEWS.d/next/Security/2026-03-04-18-59-17.gh-issue-145506.6hwvEh.rst b/Misc/NEWS.d/next/Security/2026-03-04-18-59-17.gh-issue-145506.6hwvEh.rst
deleted file mode 100644
index dcdb44d4fae4e5..00000000000000
--- a/Misc/NEWS.d/next/Security/2026-03-04-18-59-17.gh-issue-145506.6hwvEh.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Fixes :cve:`2026-2297` by ensuring that ``SourcelessFileLoader`` uses
-:func:`io.open_code` when opening ``.pyc`` files.
diff --git a/Misc/NEWS.d/next/Tests/2026-02-12-12-12-00.gh-issue-144739.-fx1tN.rst b/Misc/NEWS.d/next/Tests/2026-02-12-12-12-00.gh-issue-144739.-fx1tN.rst
deleted file mode 100644
index 8c46ff133f9433..00000000000000
--- a/Misc/NEWS.d/next/Tests/2026-02-12-12-12-00.gh-issue-144739.-fx1tN.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-When Python was compiled with system expat older then 2.7.2 but tests run
-with newer expat, still skip
-:class:`!test.test_pyexpat.MemoryProtectionTest`.
diff --git a/Misc/NEWS.d/next/Tests/2026-03-04-17-39-15.gh-issue-144741.0RHhBF.rst b/Misc/NEWS.d/next/Tests/2026-03-04-17-39-15.gh-issue-144741.0RHhBF.rst
deleted file mode 100644
index be3092f1c2592a..00000000000000
--- a/Misc/NEWS.d/next/Tests/2026-03-04-17-39-15.gh-issue-144741.0RHhBF.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-Fix ``test_frame_pointer_unwind`` when Python is built with
-:option:`--enable-shared`. Classify also libpython frames as ``"python"``.
-Patch by Victor Stinner.
diff --git a/Misc/NEWS.d/next/Windows/2026-02-13-11-07-51.gh-issue-144551.ENtMYD.rst b/Misc/NEWS.d/next/Windows/2026-02-13-11-07-51.gh-issue-144551.ENtMYD.rst
deleted file mode 100644
index 810985a352baeb..00000000000000
--- a/Misc/NEWS.d/next/Windows/2026-02-13-11-07-51.gh-issue-144551.ENtMYD.rst
+++ /dev/null
@@ -1 +0,0 @@
-Updated bundled version of OpenSSL to 3.5.5.
diff --git a/Misc/NEWS.d/next/Windows/2026-02-27-10-57-20.gh-issue-145307.ueoT7j.rst b/Misc/NEWS.d/next/Windows/2026-02-27-10-57-20.gh-issue-145307.ueoT7j.rst
deleted file mode 100644
index 6f039197962e10..00000000000000
--- a/Misc/NEWS.d/next/Windows/2026-02-27-10-57-20.gh-issue-145307.ueoT7j.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-Defers loading of the ``psapi.dll`` module until it is used by
-:func:`ctypes.util.dllist`.
diff --git a/Misc/NEWS.d/next/Windows/2026-03-10-09-46-44.gh-issue-145731.5uEGgb.rst b/Misc/NEWS.d/next/Windows/2026-03-10-09-46-44.gh-issue-145731.5uEGgb.rst
deleted file mode 100644
index 676a68e5a912f5..00000000000000
--- a/Misc/NEWS.d/next/Windows/2026-03-10-09-46-44.gh-issue-145731.5uEGgb.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix negative timestamp during DST on Windows. Patch by Hugo van Kemenade.
diff --git a/README.rst b/README.rst
index 68e114e66abe43..1d2874e9ca4fdc 100644
--- a/README.rst
+++ b/README.rst
@@ -1,4 +1,4 @@
-This is Python version 3.15.0 alpha 6
+This is Python version 3.15.0 alpha 7
=====================================
.. image:: https://github.com/python/cpython/actions/workflows/build.yml/badge.svg?branch=main&event=push
From 2d35f9bc1cf61b27639ed992dfbf363ab436fd8b Mon Sep 17 00:00:00 2001
From: Matt Van Horn
Date: Tue, 10 Mar 2026 06:20:42 -0700
Subject: [PATCH 04/19] gh-145492: Fix defaultdict __repr__ infinite recursion
(GH-145659)
Co-Authored-By: Thomas Kowalski
---
Lib/test/test_defaultdict.py | 15 +++++++++++++++
...2026-03-09-00-00-00.gh-issue-145492.457Afc.rst | 3 +++
Modules/_collectionsmodule.c | 5 +++--
3 files changed, 21 insertions(+), 2 deletions(-)
create mode 100644 Misc/NEWS.d/next/Library/2026-03-09-00-00-00.gh-issue-145492.457Afc.rst
diff --git a/Lib/test/test_defaultdict.py b/Lib/test/test_defaultdict.py
index fbd7354a915a0a..732e9a876ca8ad 100644
--- a/Lib/test/test_defaultdict.py
+++ b/Lib/test/test_defaultdict.py
@@ -204,5 +204,20 @@ def default_factory():
self.assertEqual(test_dict[key], 2)
self.assertEqual(count, 2)
+ def test_repr_recursive_factory(self):
+ # gh-145492: defaultdict.__repr__ should not cause infinite recursion
+ # when the factory's __repr__ calls repr() on the defaultdict.
+ class ProblematicFactory:
+ def __call__(self):
+ return {}
+ def __repr__(self):
+ repr(dd)
+ return "ProblematicFactory()"
+
+ dd = defaultdict(ProblematicFactory())
+ # Should not raise RecursionError
+ r = repr(dd)
+ self.assertIn('ProblematicFactory()', r)
+
if __name__ == "__main__":
unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2026-03-09-00-00-00.gh-issue-145492.457Afc.rst b/Misc/NEWS.d/next/Library/2026-03-09-00-00-00.gh-issue-145492.457Afc.rst
new file mode 100644
index 00000000000000..297ee4099f12c5
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-03-09-00-00-00.gh-issue-145492.457Afc.rst
@@ -0,0 +1,3 @@
+Fix infinite recursion in :class:`collections.defaultdict` ``__repr__``
+when a ``defaultdict`` contains itself. Based on analysis by KowalskiThomas
+in :gh:`145492`.
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index c3d63c8aab4b47..15c9aa41911822 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -2385,9 +2385,10 @@ defdict_repr(PyObject *op)
}
defrepr = PyUnicode_FromString("...");
}
- else
+ else {
defrepr = PyObject_Repr(dd->default_factory);
- Py_ReprLeave(dd->default_factory);
+ Py_ReprLeave(dd->default_factory);
+ }
}
if (defrepr == NULL) {
Py_DECREF(baserepr);
From ae0d2875bcfa111383e39d9ba0d24c1c317ee597 Mon Sep 17 00:00:00 2001
From: Steve Dower
Date: Tue, 10 Mar 2026 13:58:32 +0000
Subject: [PATCH 05/19] gh-145035: Allows removing the _pyrepl module to
completely disable the modern REPL (GH-145159)
---
Lib/_sitebuiltins.py | 12 ++++-
Lib/asyncio/__main__.py | 14 ++++--
Lib/pdb.py | 8 ++-
Lib/pydoc.py | 49 +++++++++++++------
Lib/site.py | 2 +
Lib/test/support/__init__.py | 7 +++
Lib/test/test_pyclbr.py | 3 +-
Lib/test/test_pyrepl/__init__.py | 3 ++
Lib/test/test_repl.py | 7 +++
...-02-23-21-28-12.gh-issue-145035.J5UjS6.rst | 3 ++
Modules/main.c | 48 +++++++++++++-----
11 files changed, 121 insertions(+), 35 deletions(-)
create mode 100644 Misc/NEWS.d/next/Library/2026-02-23-21-28-12.gh-issue-145035.J5UjS6.rst
diff --git a/Lib/_sitebuiltins.py b/Lib/_sitebuiltins.py
index 81b36efc6c285f..84551e3546eb6e 100644
--- a/Lib/_sitebuiltins.py
+++ b/Lib/_sitebuiltins.py
@@ -65,7 +65,17 @@ def __repr__(self):
return "Type %s() to see the full %s text" % ((self.__name,)*2)
def __call__(self):
- from _pyrepl.pager import get_pager
+ try:
+ from _pyrepl.pager import get_pager
+ except ModuleNotFoundError:
+ try:
+ from pydoc import get_pager
+ except ModuleNotFoundError:
+ def get_pager():
+ def _print(text, title=None):
+ print(text)
+ return _print
+
self.__setup()
pager = get_pager()
diff --git a/Lib/asyncio/__main__.py b/Lib/asyncio/__main__.py
index 44667efc522556..0bf3bdded40200 100644
--- a/Lib/asyncio/__main__.py
+++ b/Lib/asyncio/__main__.py
@@ -12,13 +12,16 @@
import types
import warnings
-from _colorize import get_theme
-from _pyrepl.console import InteractiveColoredConsole
+try:
+ from _colorize import get_theme
+ from _pyrepl.console import InteractiveColoredConsole as InteractiveConsole
+except ModuleNotFoundError:
+ from code import InteractiveConsole
from . import futures
-class AsyncIOInteractiveConsole(InteractiveColoredConsole):
+class AsyncIOInteractiveConsole(InteractiveConsole):
def __init__(self, locals, loop):
super().__init__(locals, filename="")
@@ -185,7 +188,10 @@ def interrupt(self) -> None:
if os.getenv('PYTHON_BASIC_REPL'):
CAN_USE_PYREPL = False
else:
- from _pyrepl.main import CAN_USE_PYREPL
+ try:
+ from _pyrepl.main import CAN_USE_PYREPL
+ except ModuleNotFoundError:
+ CAN_USE_PYREPL = False
return_code = 0
loop = asyncio.new_event_loop()
diff --git a/Lib/pdb.py b/Lib/pdb.py
index b5d8f827827415..7b08d2bb70183d 100644
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -97,12 +97,16 @@
import selectors
import threading
import _colorize
-import _pyrepl.utils
from contextlib import ExitStack, closing, contextmanager
from types import CodeType
from warnings import deprecated
+try:
+ import _pyrepl.utils
+except ModuleNotFoundError:
+ _pyrepl = None
+
class Restart(Exception):
"""Causes a debugger to be restarted for the debugged python program."""
@@ -1097,7 +1101,7 @@ def handle_command_def(self, line):
return False
def _colorize_code(self, code):
- if self.colorize:
+ if self.colorize and _pyrepl:
colors = list(_pyrepl.utils.gen_colors(code))
chars, _ = _pyrepl.utils.disp_str(code, colors=colors, force_color=True)
code = "".join(chars)
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 69c83e085113c9..a1a6aad434ddf4 100644
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -78,20 +78,41 @@ class or function within a module or module in a package. If the
from reprlib import Repr
from traceback import format_exception_only
-from _pyrepl.pager import (get_pager, pipe_pager,
- plain_pager, tempfile_pager, tty_pager)
-
-# Expose plain() as pydoc.plain()
-from _pyrepl.pager import plain # noqa: F401
-
-
-# --------------------------------------------------------- old names
-
-getpager = get_pager
-pipepager = pipe_pager
-plainpager = plain_pager
-tempfilepager = tempfile_pager
-ttypager = tty_pager
+try:
+ from _pyrepl.pager import (get_pager, pipe_pager,
+ plain_pager, tempfile_pager, tty_pager)
+
+ # Expose plain() as pydoc.plain()
+ from _pyrepl.pager import plain # noqa: F401
+
+ # --------------------------------------------------------- old names
+ getpager = get_pager
+ pipepager = pipe_pager
+ plainpager = plain_pager
+ tempfilepager = tempfile_pager
+ ttypager = tty_pager
+
+except ModuleNotFoundError:
+ # Minimal alternatives for cases where _pyrepl is absent.
+
+ def plain(text: str) -> str:
+ """Remove boldface formatting from text."""
+ return re.sub('.\b', '', text)
+
+ def plain_pager(text: str, title: str = '') -> None:
+ """Simply print unformatted text. This is the ultimate fallback."""
+ encoding = getattr(sys.stdout, 'encoding', None) or 'utf-8'
+ text = text.encode(encoding, 'backslashreplace').decode(encoding)
+ text = plain(text)
+ sys.stdout.write(text)
+
+ def get_pager():
+ """Unconditionally return the plain pager, since _pyrepl is absent."""
+ return plain_pager
+
+ # --------------------------------------------------------- old names
+ getpager = get_pager
+ plainpager = plain_pager
# --------------------------------------------------------- common routines
diff --git a/Lib/site.py b/Lib/site.py
index 5f09a7dd8c91c0..30015b3f26b4b3 100644
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -529,6 +529,8 @@ def register_readline():
import _pyrepl.unix_console
console_errors = _pyrepl.unix_console._error
from _pyrepl.main import CAN_USE_PYREPL
+ except ModuleNotFoundError:
+ CAN_USE_PYREPL = False
finally:
sys.path = original_path
except ImportError:
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index d4d3c7f1aefa66..3da662b0c4d50a 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -3023,6 +3023,13 @@ def force_color(color: bool):
import _colorize
from .os_helper import EnvironmentVarGuard
+ if color:
+ try:
+ import _pyrepl # noqa: F401
+ except ModuleNotFoundError:
+ # Can't force enable color without _pyrepl, so just skip.
+ raise unittest.SkipTest("_pyrepl is missing")
+
with (
swap_attr(_colorize, "can_colorize", lambda *, file=None: color),
EnvironmentVarGuard() as env,
diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py
index 79ef178f3807f4..b5ec41b17f793b 100644
--- a/Lib/test/test_pyclbr.py
+++ b/Lib/test/test_pyclbr.py
@@ -252,7 +252,8 @@ def test_others(self):
ignore=('Union', '_ModuleTarget', '_ScriptTarget', '_ZipTarget', 'curframe_locals',
'_InteractState', 'rlcompleter'),
)
- cm('pydoc', ignore=('input', 'output',)) # properties
+ cm('pydoc', ignore=('input', 'output', # properties
+ 'getpager', 'plainpager', )) # aliases
# Tests for modules inside packages
cm('email.parser')
diff --git a/Lib/test/test_pyrepl/__init__.py b/Lib/test/test_pyrepl/__init__.py
index 2f37bff6df8b4a..1534d63352cc55 100644
--- a/Lib/test/test_pyrepl/__init__.py
+++ b/Lib/test/test_pyrepl/__init__.py
@@ -3,6 +3,9 @@
from test.support import import_helper, load_package_tests
+import_helper.import_module("_pyrepl")
+
+
if sys.platform != "win32":
import_helper.import_module("termios")
diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py
index 40965835bcec00..27cd125078ea69 100644
--- a/Lib/test/test_repl.py
+++ b/Lib/test/test_repl.py
@@ -426,6 +426,13 @@ def test_toplevel_contextvars_async(self):
p = spawn_asyncio_repl()
p.stdin.write(user_input)
user_input2 = "async def set_var(): var.set('ok')\n"
+ try:
+ import _pyrepl # noqa: F401
+ except ModuleNotFoundError:
+ # If we're going to be forced into the regular REPL, then we need an
+ # extra newline here. Omit it by default to catch any breakage to
+ # the new REPL's behavior.
+ user_input2 += "\n"
p.stdin.write(user_input2)
user_input3 = "await set_var()\n"
p.stdin.write(user_input3)
diff --git a/Misc/NEWS.d/next/Library/2026-02-23-21-28-12.gh-issue-145035.J5UjS6.rst b/Misc/NEWS.d/next/Library/2026-02-23-21-28-12.gh-issue-145035.J5UjS6.rst
new file mode 100644
index 00000000000000..b20da3b54c0415
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-02-23-21-28-12.gh-issue-145035.J5UjS6.rst
@@ -0,0 +1,3 @@
+Allows omitting the internal library ``_pyrepl`` with limited loss of
+functionality. This allows complete removal of the modern REPL, which is an
+unsupported configuration, but still desirable for some distributions.
diff --git a/Modules/main.c b/Modules/main.c
index 95ba541d98c2e8..7731fa0c7c6717 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -562,13 +562,25 @@ pymain_run_stdin(PyConfig *config)
return pymain_exit_err_print();
}
- if (!isatty(fileno(stdin))
- || _Py_GetEnv(config->use_environment, "PYTHON_BASIC_REPL")) {
- PyCompilerFlags cf = _PyCompilerFlags_INIT;
- int run = PyRun_AnyFileExFlags(stdin, "", 0, &cf);
- return (run != 0);
+ int run;
+ if (isatty(fileno(stdin))
+ && !_Py_GetEnv(config->use_environment, "PYTHON_BASIC_REPL")) {
+ PyObject *pyrepl = PyImport_ImportModule("_pyrepl");
+ if (pyrepl != NULL) {
+ run = pymain_start_pyrepl(0);
+ Py_DECREF(pyrepl);
+ return run;
+ }
+ if (!PyErr_ExceptionMatches(PyExc_ModuleNotFoundError)) {
+ fprintf(stderr, "Could not import _pyrepl.main\n");
+ return pymain_exit_err_print();
+ }
+ PyErr_Clear();
}
- return pymain_start_pyrepl(0);
+
+ PyCompilerFlags cf = _PyCompilerFlags_INIT;
+ run = PyRun_AnyFileExFlags(stdin, "", 0, &cf);
+ return (run != 0);
}
@@ -594,14 +606,24 @@ pymain_repl(PyConfig *config, int *exitcode)
return;
}
- if (!isatty(fileno(stdin))
- || _Py_GetEnv(config->use_environment, "PYTHON_BASIC_REPL")) {
- PyCompilerFlags cf = _PyCompilerFlags_INIT;
- int run = PyRun_AnyFileExFlags(stdin, "", 0, &cf);
- *exitcode = (run != 0);
- return;
+ if (isatty(fileno(stdin))
+ && !_Py_GetEnv(config->use_environment, "PYTHON_BASIC_REPL")) {
+ PyObject *pyrepl = PyImport_ImportModule("_pyrepl");
+ if (pyrepl != NULL) {
+ int run = pymain_start_pyrepl(1);
+ *exitcode = (run != 0);
+ Py_DECREF(pyrepl);
+ return;
+ }
+ if (!PyErr_ExceptionMatches(PyExc_ModuleNotFoundError)) {
+ PyErr_Clear();
+ fprintf(stderr, "Could not import _pyrepl.main\n");
+ return;
+ }
+ PyErr_Clear();
}
- int run = pymain_start_pyrepl(1);
+ PyCompilerFlags cf = _PyCompilerFlags_INIT;
+ int run = PyRun_AnyFileExFlags(stdin, "", 0, &cf);
*exitcode = (run != 0);
return;
}
From 9585f509d796cc3f89e85d4cb9e52e4f10604a01 Mon Sep 17 00:00:00 2001
From: Adorilson Bezerra
Date: Tue, 10 Mar 2026 14:19:24 +0000
Subject: [PATCH 06/19] gh-106318: Add examples for str.isspace() docs
(#145399)
---
Doc/library/stdtypes.rst | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
index c930b876b3ccbf..bfa49b62ec5778 100644
--- a/Doc/library/stdtypes.rst
+++ b/Doc/library/stdtypes.rst
@@ -2247,17 +2247,34 @@ expression support in the :mod:`re` module).
>>> '\t'.isprintable(), '\n'.isprintable()
(False, False)
+ See also :meth:`isspace`.
+
.. method:: str.isspace()
Return ``True`` if there are only whitespace characters in the string and there is
at least one character, ``False`` otherwise.
+ For example:
+
+ .. doctest::
+
+ >>> ''.isspace()
+ False
+ >>> ' '.isspace()
+ True
+ >>> '\t\n'.isspace() # TAB and BREAK LINE
+ True
+ >>> '\u3000'.isspace() # IDEOGRAPHIC SPACE
+ True
+
A character is *whitespace* if in the Unicode character database
(see :mod:`unicodedata`), either its general category is ``Zs``
("Separator, space"), or its bidirectional class is one of ``WS``,
``B``, or ``S``.
+ See also :meth:`isprintable`.
+
.. method:: str.istitle()
From 1900aa9d36f49cc3fc6c6e6d50ddc8c64b01f978 Mon Sep 17 00:00:00 2001
From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com>
Date: Tue, 10 Mar 2026 16:40:10 +0200
Subject: [PATCH 07/19] Post 3.15.0a7
---
Include/patchlevel.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Include/patchlevel.h b/Include/patchlevel.h
index 3cc12a2b2d3888..7cffd74125f1b4 100644
--- a/Include/patchlevel.h
+++ b/Include/patchlevel.h
@@ -27,7 +27,7 @@
#define PY_RELEASE_SERIAL 7
/* Version as a string */
-#define PY_VERSION "3.15.0a7"
+#define PY_VERSION "3.15.0a7+"
/*--end constants--*/
From 7990313afa3234d5145b32ead3ef3f6278735f4f Mon Sep 17 00:00:00 2001
From: Peter Bierma
Date: Tue, 10 Mar 2026 10:57:13 -0400
Subject: [PATCH 08/19] Docs: Improve the C API documentation involving threads
(GH-145520)
Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com>
---
Doc/c-api/threads.rst | 210 +++++++++++++++++++++++++-----------------
1 file changed, 125 insertions(+), 85 deletions(-)
diff --git a/Doc/c-api/threads.rst b/Doc/c-api/threads.rst
index 41c7fbda2302cf..3b761d0c657cbd 100644
--- a/Doc/c-api/threads.rst
+++ b/Doc/c-api/threads.rst
@@ -10,43 +10,63 @@ Thread states and the global interpreter lock
single: interpreter lock
single: lock, interpreter
-Unless on a :term:`free-threaded ` build of :term:`CPython`,
-the Python interpreter is not fully thread-safe. In order to support
+Unless on a :term:`free-threaded build` of :term:`CPython`,
+the Python interpreter is generally not thread-safe. In order to support
multi-threaded Python programs, there's a global lock, called the :term:`global
-interpreter lock` or :term:`GIL`, that must be held by the current thread before
-it can safely access Python objects. Without the lock, even the simplest
-operations could cause problems in a multi-threaded program: for example, when
+interpreter lock` or :term:`GIL`, that must be held by a thread before
+accessing Python objects. Without the lock, even the simplest operations
+could cause problems in a multi-threaded program: for example, when
two threads simultaneously increment the reference count of the same object, the
reference count could end up being incremented only once instead of twice.
+As such, only a thread that holds the GIL may operate on Python objects or
+invoke Python's C API.
+
.. index:: single: setswitchinterval (in module sys)
-Therefore, the rule exists that only the thread that has acquired the
-:term:`GIL` may operate on Python objects or call Python/C API functions.
-In order to emulate concurrency of execution, the interpreter regularly
-tries to switch threads (see :func:`sys.setswitchinterval`). The lock is also
-released around potentially blocking I/O operations like reading or writing
-a file, so that other Python threads can run in the meantime.
+In order to emulate concurrency, the interpreter regularly tries to switch
+threads between bytecode instructions (see :func:`sys.setswitchinterval`).
+This is why locks are also necessary for thread-safety in pure-Python code.
+
+Additionally, the global interpreter lock is released around blocking I/O
+operations, such as reading or writing to a file. From the C API, this is done
+by :ref:`detaching the thread state `.
+
.. index::
single: PyThreadState (C type)
-The Python interpreter keeps some thread-specific bookkeeping information
-inside a data structure called :c:type:`PyThreadState`, known as a :term:`thread state`.
-Each OS thread has a thread-local pointer to a :c:type:`PyThreadState`; a thread state
+The Python interpreter keeps some thread-local information inside
+a data structure called :c:type:`PyThreadState`, known as a :term:`thread state`.
+Each thread has a thread-local pointer to a :c:type:`PyThreadState`; a thread state
referenced by this pointer is considered to be :term:`attached `.
A thread can only have one :term:`attached thread state` at a time. An attached
-thread state is typically analogous with holding the :term:`GIL`, except on
-:term:`free-threaded ` builds. On builds with the :term:`GIL` enabled,
-:term:`attaching ` a thread state will block until the :term:`GIL`
-can be acquired. However, even on builds with the :term:`GIL` disabled, it is still required
-to have an attached thread state to call most of the C API.
+thread state is typically analogous with holding the GIL, except on
+free-threaded builds. On builds with the GIL enabled, attaching a thread state
+will block until the GIL can be acquired. However, even on builds with the GIL
+disabled, it is still required to have an attached thread state, as the interpreter
+needs to keep track of which threads may access Python objects.
+
+.. note::
+
+ Even on the free-threaded build, attaching a thread state may block, as the
+ GIL can be re-enabled or threads might be temporarily suspended (such as during
+ a garbage collection).
+
+Generally, there will always be an attached thread state when using Python's
+C API, including during embedding and when implementing methods, so it's uncommon
+to need to set up a thread state on your own. Only in some specific cases, such
+as in a :c:macro:`Py_BEGIN_ALLOW_THREADS` block or in a fresh thread, will the
+thread not have an attached thread state.
+If uncertain, check if :c:func:`PyThreadState_GetUnchecked` returns ``NULL``.
-In general, there will always be an :term:`attached thread state` when using Python's C API.
-Only in some specific cases (such as in a :c:macro:`Py_BEGIN_ALLOW_THREADS` block) will the
-thread not have an attached thread state. If uncertain, check if :c:func:`PyThreadState_GetUnchecked` returns
-``NULL``.
+If it turns out that you do need to create a thread state, call :c:func:`PyThreadState_New`
+followed by :c:func:`PyThreadState_Swap`, or use the dangerous
+:c:func:`PyGILState_Ensure` function.
+
+
+.. _detaching-thread-state:
Detaching the thread state from extension code
----------------------------------------------
@@ -86,28 +106,37 @@ The block above expands to the following code::
Here is how these functions work:
-The :term:`attached thread state` holds the :term:`GIL` for the entire interpreter. When detaching
-the :term:`attached thread state`, the :term:`GIL` is released, allowing other threads to attach
-a thread state to their own thread, thus getting the :term:`GIL` and can start executing.
-The pointer to the prior :term:`attached thread state` is stored as a local variable.
-Upon reaching :c:macro:`Py_END_ALLOW_THREADS`, the thread state that was
-previously :term:`attached ` is passed to :c:func:`PyEval_RestoreThread`.
-This function will block until another releases its :term:`thread state `,
-thus allowing the old :term:`thread state ` to get re-attached and the
-C API can be called again.
-
-For :term:`free-threaded ` builds, the :term:`GIL` is normally
-out of the question, but detaching the :term:`thread state ` is still required
-for blocking I/O and long operations. The difference is that threads don't have to wait for the :term:`GIL`
-to be released to attach their thread state, allowing true multi-core parallelism.
+The attached thread state implies that the GIL is held for the interpreter.
+To detach it, :c:func:`PyEval_SaveThread` is called and the result is stored
+in a local variable.
+
+By detaching the thread state, the GIL is released, which allows other threads
+to attach to the interpreter and execute while the current thread performs
+blocking I/O. When the I/O operation is complete, the old thread state is
+reattached by calling :c:func:`PyEval_RestoreThread`, which will wait until
+the GIL can be acquired.
.. note::
- Calling system I/O functions is the most common use case for detaching
- the :term:`thread state `, but it can also be useful before calling
- long-running computations which don't need access to Python objects, such
- as compression or cryptographic functions operating over memory buffers.
+ Performing blocking I/O is the most common use case for detaching
+ the thread state, but it is also useful to call it over long-running
+ native code that doesn't need access to Python objects or Python's C API.
For example, the standard :mod:`zlib` and :mod:`hashlib` modules detach the
- :term:`thread state ` when compressing or hashing data.
+ :term:`thread state ` when compressing or hashing
+ data.
+
+On a :term:`free-threaded build`, the :term:`GIL` is usually out of the question,
+but **detaching the thread state is still required**, because the interpreter
+periodically needs to block all threads to get a consistent view of Python objects
+without the risk of race conditions.
+For example, CPython currently suspends all threads for a short period of time
+while running the garbage collector.
+
+.. warning::
+
+ Detaching the thread state can lead to unexpected behavior during interpreter
+ finalization. See :ref:`cautions-regarding-runtime-finalization` for more
+ details.
+
APIs
^^^^
@@ -149,73 +178,84 @@ example usage in the Python source distribution.
declaration.
-.. _gilstate:
-
Non-Python created threads
--------------------------
When threads are created using the dedicated Python APIs (such as the
-:mod:`threading` module), a thread state is automatically associated to them
-and the code shown above is therefore correct. However, when threads are
-created from C (for example by a third-party library with its own thread
-management), they don't hold the :term:`GIL`, because they don't have an
-:term:`attached thread state`.
+:mod:`threading` module), a thread state is automatically associated with them,
+However, when a thread is created from native code (for example, by a
+third-party library with its own thread management), it doesn't hold an
+attached thread state.
If you need to call Python code from these threads (often this will be part
of a callback API provided by the aforementioned third-party library),
you must first register these threads with the interpreter by
-creating an :term:`attached thread state` before you can start using the Python/C
-API. When you are done, you should detach the :term:`thread state `, and
-finally free it.
+creating a new thread state and attaching it.
-The :c:func:`PyGILState_Ensure` and :c:func:`PyGILState_Release` functions do
-all of the above automatically. The typical idiom for calling into Python
-from a C thread is::
+The most robust way to do this is through :c:func:`PyThreadState_New` followed
+by :c:func:`PyThreadState_Swap`.
- PyGILState_STATE gstate;
- gstate = PyGILState_Ensure();
+.. note::
+ ``PyThreadState_New`` requires an argument pointing to the desired
+ interpreter; such a pointer can be acquired via a call to
+ :c:func:`PyInterpreterState_Get` from the code where the thread was
+ created.
+
+For example::
+
+ /* The return value of PyInterpreterState_Get() from the
+ function that created this thread. */
+ PyInterpreterState *interp = thread_data->interp;
+
+ /* Create a new thread state for the interpreter. It does not start out
+ attached. */
+ PyThreadState *tstate = PyThreadState_New(interp);
+
+ /* Attach the thread state, which will acquire the GIL. */
+ PyThreadState_Swap(tstate);
/* Perform Python actions here. */
result = CallSomeFunction();
/* evaluate result or handle exception */
- /* Release the thread. No Python API allowed beyond this point. */
- PyGILState_Release(gstate);
+ /* Destroy the thread state. No Python API allowed beyond this point. */
+ PyThreadState_Clear(tstate);
+ PyThreadState_DeleteCurrent();
-Note that the ``PyGILState_*`` functions assume there is only one global
-interpreter (created automatically by :c:func:`Py_Initialize`). Python
-supports the creation of additional interpreters (using
-:c:func:`Py_NewInterpreter`), but mixing multiple interpreters and the
-``PyGILState_*`` API is unsupported. This is because :c:func:`PyGILState_Ensure`
-and similar functions default to :term:`attaching ` a
-:term:`thread state` for the main interpreter, meaning that the thread can't safely
-interact with the calling subinterpreter.
+.. warning::
-Supporting subinterpreters in non-Python threads
-------------------------------------------------
+ If the interpreter finalized before ``PyThreadState_Swap`` was called, then
+ ``interp`` will be a dangling pointer!
-If you would like to support subinterpreters with non-Python created threads, you
-must use the ``PyThreadState_*`` API instead of the traditional ``PyGILState_*``
-API.
+.. _gilstate:
-In particular, you must store the interpreter state from the calling
-function and pass it to :c:func:`PyThreadState_New`, which will ensure that
-the :term:`thread state` is targeting the correct interpreter::
+Legacy API
+----------
- /* The return value of PyInterpreterState_Get() from the
- function that created this thread. */
- PyInterpreterState *interp = ThreadData->interp;
- PyThreadState *tstate = PyThreadState_New(interp);
- PyThreadState_Swap(tstate);
+Another common pattern to call Python code from a non-Python thread is to use
+:c:func:`PyGILState_Ensure` followed by a call to :c:func:`PyGILState_Release`.
- /* GIL of the subinterpreter is now held.
- Perform Python actions here. */
+These functions do not work well when multiple interpreters exist in the Python
+process. If no Python interpreter has ever been used in the current thread (which
+is common for threads created outside Python), ``PyGILState_Ensure`` will create
+and attach a thread state for the "main" interpreter (the first interpreter in
+the Python process).
+
+Additionally, these functions have thread-safety issues during interpreter
+finalization. Using ``PyGILState_Ensure`` during finalization will likely
+crash the process.
+
+Usage of these functions look like such::
+
+ PyGILState_STATE gstate;
+ gstate = PyGILState_Ensure();
+
+ /* Perform Python actions here. */
result = CallSomeFunction();
/* evaluate result or handle exception */
- /* Destroy the thread state. No Python API allowed beyond this point. */
- PyThreadState_Clear(tstate);
- PyThreadState_DeleteCurrent();
+ /* Release the thread. No Python API allowed beyond this point. */
+ PyGILState_Release(gstate);
.. _fork-and-threads:
From 467507a651e351712f18fcafad64d1b5eed89b7d Mon Sep 17 00:00:00 2001
From: Charlie Lin
Date: Tue, 10 Mar 2026 11:21:33 -0400
Subject: [PATCH 09/19] gh-145697: Add `.sql` and `.sqlite3` recognition in
`mimetypes` (GH-145698)
Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com>
Co-authored-by: Benedikt Johannes
---
Doc/whatsnew/3.15.rst | 2 ++
Lib/mimetypes.py | 3 +++
Lib/test/test_mimetypes.py | 2 ++
.../Library/2026-03-09-18-33-16.gh-issue-145697.d6hFmm.rst | 1 +
4 files changed, 8 insertions(+)
create mode 100644 Misc/NEWS.d/next/Library/2026-03-09-18-33-16.gh-issue-145697.d6hFmm.rst
diff --git a/Doc/whatsnew/3.15.rst b/Doc/whatsnew/3.15.rst
index ead4e7cbf2871e..e749ef2a455ea2 100644
--- a/Doc/whatsnew/3.15.rst
+++ b/Doc/whatsnew/3.15.rst
@@ -825,6 +825,8 @@ mimetypes
* Add ``application/node`` MIME type for ``.cjs`` extension.
(Contributed by John Franey in :gh:`140937`.)
* Add ``application/toml``. (Contributed by Gil Forcada in :gh:`139959`.)
+* Add ``application/sql`` and ``application/vnd.sqlite3``.
+ (Contributed by Charlie Lin in :gh:`145698`.)
* Add ``image/jxl``. (Contributed by Foolbar in :gh:`144213`.)
* Rename ``application/x-texinfo`` to ``application/texinfo``.
(Contributed by Charlie Lin in :gh:`140165`.)
diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py
index fc916c470a0110..ee66160be63b6f 100644
--- a/Lib/mimetypes.py
+++ b/Lib/mimetypes.py
@@ -501,6 +501,7 @@ def _default_mime_types():
'.ps' : 'application/postscript',
'.eps' : 'application/postscript',
'.rtf' : 'application/rtf',
+ '.sql' : 'application/sql',
'.texi' : 'application/texinfo',
'.texinfo': 'application/texinfo',
'.toml' : 'application/toml',
@@ -525,6 +526,8 @@ def _default_mime_types():
'.xlsx' : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'.docx' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'.rar' : 'application/vnd.rar',
+ '.sqlite3': 'application/vnd.sqlite3',
+ '.sqlite' : 'application/vnd.sqlite3',
'.wasm' : 'application/wasm',
'.7z' : 'application/x-7z-compressed',
'.bcpio' : 'application/x-bcpio',
diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py
index fe7584f1f9d3b3..2d618081521e10 100644
--- a/Lib/test/test_mimetypes.py
+++ b/Lib/test/test_mimetypes.py
@@ -232,6 +232,7 @@ def check_extensions():
("application/pdf", ".pdf"),
("application/postscript", ".ps"),
("application/rtf", ".rtf"),
+ ("application/sql", ".sql"),
("application/texinfo", ".texi"),
("application/toml", ".toml"),
("application/vnd.apple.mpegurl", ".m3u"),
@@ -246,6 +247,7 @@ def check_extensions():
("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xlsx"),
("application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".docx"),
("application/vnd.rar", ".rar"),
+ ("application/vnd.sqlite3", ".sqlite3"),
("application/x-7z-compressed", ".7z"),
("application/x-debian-package", ".deb"),
("application/x-httpd-php", ".php"),
diff --git a/Misc/NEWS.d/next/Library/2026-03-09-18-33-16.gh-issue-145697.d6hFmm.rst b/Misc/NEWS.d/next/Library/2026-03-09-18-33-16.gh-issue-145697.d6hFmm.rst
new file mode 100644
index 00000000000000..c3a476df75f136
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-03-09-18-33-16.gh-issue-145697.d6hFmm.rst
@@ -0,0 +1 @@
+Add ``application/sql`` and ``application/vnd.sqlite3`` into ``mimetypes``.
From 2114da976c3d85a85283d1a9437bdf8604626be8 Mon Sep 17 00:00:00 2001
From: Ali Towaiji <145403626+Towaiji@users.noreply.github.com>
Date: Tue, 10 Mar 2026 11:48:41 -0400
Subject: [PATCH 10/19] gh-145591: Move slicing note to __getitem__ (GH-145606)
---
Doc/reference/datamodel.rst | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst
index cf5a0e71a104eb..062d301f6286f7 100644
--- a/Doc/reference/datamodel.rst
+++ b/Doc/reference/datamodel.rst
@@ -3223,21 +3223,6 @@ through the object's keys; for sequences, it should iterate through the values.
.. versionadded:: 3.4
-.. index:: pair: object; slice
-
-.. note::
-
- Slicing is done exclusively with the following three methods. A call like ::
-
- a[1:2] = b
-
- is translated to ::
-
- a[slice(1, 2, None)] = b
-
- and so forth. Missing slice items are always filled in with ``None``.
-
-
.. method:: object.__getitem__(self, subscript)
Called to implement *subscription*, that is, ``self[subscript]``.
@@ -3260,6 +3245,22 @@ through the object's keys; for sequences, it should iterate through the values.
should raise an :exc:`LookupError` or one of its subclasses
(:exc:`IndexError` for sequences; :exc:`KeyError` for mappings).
+ .. index:: pair: object; slice
+
+ .. note::
+
+ Slicing is handled by :meth:`!__getitem__`, :meth:`~object.__setitem__`,
+ and :meth:`~object.__delitem__`.
+ A call like ::
+
+ a[1:2] = b
+
+ is translated to ::
+
+ a[slice(1, 2, None)] = b
+
+ and so forth. Missing slice items are always filled in with ``None``.
+
.. note::
The sequence iteration protocol (used, for example, in :keyword:`for`
From 2756d56eefe86c4df696d8c65e21e4583ffe7511 Mon Sep 17 00:00:00 2001
From: Alexander Shadchin
Date: Tue, 10 Mar 2026 19:02:57 +0300
Subject: [PATCH 11/19] gh-85277: Fix building without `stropts.h` or empty
`stropts.h` (#143521)
---
...6-01-08-22-27-07.gh-issue-85277.TotySi.rst | 1 +
Modules/posixmodule.c | 4 +-
configure | 296 +++++++++---------
configure.ac | 12 +-
4 files changed, 167 insertions(+), 146 deletions(-)
create mode 100644 Misc/NEWS.d/next/Build/2026-01-08-22-27-07.gh-issue-85277.TotySi.rst
diff --git a/Misc/NEWS.d/next/Build/2026-01-08-22-27-07.gh-issue-85277.TotySi.rst b/Misc/NEWS.d/next/Build/2026-01-08-22-27-07.gh-issue-85277.TotySi.rst
new file mode 100644
index 00000000000000..538995538d7da8
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2026-01-08-22-27-07.gh-issue-85277.TotySi.rst
@@ -0,0 +1 @@
+Fix building without ``stropts.h`` or empty ``stropts.h``
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index aa3d682a19bc9c..8c360ce3b79b8a 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -9397,13 +9397,13 @@ os_openpty_impl(PyObject *module)
if (_Py_set_inheritable(master_fd, 0, NULL) < 0)
goto posix_error;
-#if !defined(__CYGWIN__) && !defined(__ANDROID__) && !defined(HAVE_DEV_PTC)
+#if defined(HAVE_STROPTS_H) && !defined(HAVE_DEV_PTC)
ioctl(slave_fd, I_PUSH, "ptem"); /* push ptem */
ioctl(slave_fd, I_PUSH, "ldterm"); /* push ldterm */
#ifndef __hpux
ioctl(slave_fd, I_PUSH, "ttcompat"); /* push ttcompat */
#endif /* __hpux */
-#endif /* HAVE_CYGWIN */
+#endif /* defined(HAVE_STROPTS_H) && !defined(HAVE_DEV_PTC) */
#endif /* HAVE_OPENPTY */
return Py_BuildValue("(ii)", master_fd, slave_fd);
diff --git a/configure b/configure
index eca5f03cdcfb2d..95bb6ba4e84ccf 100755
--- a/configure
+++ b/configure
@@ -2340,6 +2340,60 @@ fi
} # ac_fn_c_try_run
+# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR
+# ------------------------------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR.
+ac_fn_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+printf %s "checking whether $as_decl_name is declared... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ eval ac_save_FLAGS=\$$6
+ as_fn_append $6 " $5"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else case e in #(
+ e) eval "$3=no" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval $6=\$ac_save_FLAGS
+ ;;
+esac
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_check_decl
+
# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
@@ -2658,60 +2712,6 @@ printf "%s\n" "$ac_res" >&6; }
} # ac_fn_c_check_func
-# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR
-# ------------------------------------------------------------------
-# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
-# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR.
-ac_fn_check_decl ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- as_decl_name=`echo $2|sed 's/ *(.*//'`
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
-printf %s "checking whether $as_decl_name is declared... " >&6; }
-if eval test \${$3+y}
-then :
- printf %s "(cached) " >&6
-else case e in #(
- e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
- eval ac_save_FLAGS=\$$6
- as_fn_append $6 " $5"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-int
-main (void)
-{
-#ifndef $as_decl_name
-#ifdef __cplusplus
- (void) $as_decl_use;
-#else
- (void) $as_decl_name;
-#endif
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"
-then :
- eval "$3=yes"
-else case e in #(
- e) eval "$3=no" ;;
-esac
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
- eval $6=\$ac_save_FLAGS
- ;;
-esac
-fi
-eval ac_res=\$$3
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-printf "%s\n" "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_check_decl
-
# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
# ----------------------------------------------------
# Tries to find if the field MEMBER exists in type AGGR, after including
@@ -11461,12 +11461,6 @@ if test "x$ac_cv_header_spawn_h" = xyes
then :
printf "%s\n" "#define HAVE_SPAWN_H 1" >>confdefs.h
-fi
-ac_fn_c_check_header_compile "$LINENO" "stropts.h" "ac_cv_header_stropts_h" "$ac_includes_default"
-if test "x$ac_cv_header_stropts_h" = xyes
-then :
- printf "%s\n" "#define HAVE_STROPTS_H 1" >>confdefs.h
-
fi
ac_fn_c_check_header_compile "$LINENO" "sys/audioio.h" "ac_cv_header_sys_audioio_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_audioio_h" = xyes
@@ -11951,6 +11945,105 @@ fi
fi
+# On Linux, stropts.h may be empty
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5
+printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; }
+if test ${ac_cv_c_undeclared_builtin_options+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) ac_save_CFLAGS=$CFLAGS
+ ac_cv_c_undeclared_builtin_options='cannot detect'
+ for ac_arg in '' -fno-builtin; do
+ CFLAGS="$ac_save_CFLAGS $ac_arg"
+ # This test program should *not* compile successfully.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+(void) strchr;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else case e in #(
+ e) # This test program should compile successfully.
+ # No library function is consistently available on
+ # freestanding implementations, so test against a dummy
+ # declaration. Include always-available headers on the
+ # off chance that they somehow elicit warnings.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include
+#include
+#include
+#include
+extern void ac_decl (int, char *);
+
+int
+main (void)
+{
+(void) ac_decl (0, (char *) 0);
+ (void) ac_decl;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if test x"$ac_arg" = x
+then :
+ ac_cv_c_undeclared_builtin_options='none needed'
+else case e in #(
+ e) ac_cv_c_undeclared_builtin_options=$ac_arg ;;
+esac
+fi
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+ CFLAGS=$ac_save_CFLAGS
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5
+printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; }
+ case $ac_cv_c_undeclared_builtin_options in #(
+ 'cannot detect') :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
+as_fn_error $? "cannot make $CC report undeclared builtins
+See 'config.log' for more details" "$LINENO" 5; } ;; #(
+ 'none needed') :
+ ac_c_undeclared_builtin_options='' ;; #(
+ *) :
+ ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;;
+esac
+
+ac_fn_check_decl "$LINENO" "I_PUSH" "ac_cv_have_decl_I_PUSH" "
+ #ifdef HAVE_SYS_TYPES_H
+ # include
+ #endif
+ #include
+
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_I_PUSH" = xyes
+then :
+
+
+printf "%s\n" "#define HAVE_STROPTS_H 1" >>confdefs.h
+
+fi
+
# bluetooth/bluetooth.h has been known to not compile with -std=c99.
# http://permalink.gmane.org/gmane.linux.bluez.kernel/22294
SAVE_CFLAGS=$CFLAGS
@@ -20608,89 +20701,6 @@ fi
fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5
-printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; }
-if test ${ac_cv_c_undeclared_builtin_options+y}
-then :
- printf %s "(cached) " >&6
-else case e in #(
- e) ac_save_CFLAGS=$CFLAGS
- ac_cv_c_undeclared_builtin_options='cannot detect'
- for ac_arg in '' -fno-builtin; do
- CFLAGS="$ac_save_CFLAGS $ac_arg"
- # This test program should *not* compile successfully.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main (void)
-{
-(void) strchr;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"
-then :
-
-else case e in #(
- e) # This test program should compile successfully.
- # No library function is consistently available on
- # freestanding implementations, so test against a dummy
- # declaration. Include always-available headers on the
- # off chance that they somehow elicit warnings.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-#include
-#include
-#include
-extern void ac_decl (int, char *);
-
-int
-main (void)
-{
-(void) ac_decl (0, (char *) 0);
- (void) ac_decl;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"
-then :
- if test x"$ac_arg" = x
-then :
- ac_cv_c_undeclared_builtin_options='none needed'
-else case e in #(
- e) ac_cv_c_undeclared_builtin_options=$ac_arg ;;
-esac
-fi
- break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;
-esac
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
- done
- CFLAGS=$ac_save_CFLAGS
- ;;
-esac
-fi
-{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5
-printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; }
- case $ac_cv_c_undeclared_builtin_options in #(
- 'cannot detect') :
- { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5
-printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;}
-as_fn_error $? "cannot make $CC report undeclared builtins
-See 'config.log' for more details" "$LINENO" 5; } ;; #(
- 'none needed') :
- ac_c_undeclared_builtin_options='' ;; #(
- *) :
- ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;;
-esac
-
ac_fn_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include
#include
" "$ac_c_undeclared_builtin_options" "CFLAGS"
diff --git a/configure.ac b/configure.ac
index c21024a1e77433..e049f568417335 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3011,7 +3011,7 @@ AC_CHECK_HEADERS([ \
io.h langinfo.h libintl.h libutil.h linux/auxvec.h sys/auxv.h linux/fs.h linux/limits.h linux/memfd.h \
linux/netfilter_ipv4.h linux/random.h linux/soundcard.h linux/sched.h \
linux/tipc.h linux/wait.h netdb.h net/ethernet.h netinet/in.h netpacket/packet.h poll.h process.h pthread.h pty.h \
- sched.h setjmp.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \
+ sched.h setjmp.h shadow.h signal.h spawn.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \
sys/endian.h sys/epoll.h sys/event.h sys/eventfd.h sys/file.h sys/ioctl.h sys/kern_control.h \
sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/pidfd.h sys/poll.h \
sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \
@@ -3022,6 +3022,16 @@ AC_CHECK_HEADERS([ \
AC_HEADER_DIRENT
AC_HEADER_MAJOR
+# On Linux, stropts.h may be empty
+AC_CHECK_DECL([I_PUSH], [
+ AC_DEFINE([HAVE_STROPTS_H], [1],
+ [Define to 1 if you have the header file.])], [], [
+ #ifdef HAVE_SYS_TYPES_H
+ # include
+ #endif
+ #include
+])
+
# bluetooth/bluetooth.h has been known to not compile with -std=c99.
# http://permalink.gmane.org/gmane.linux.bluez.kernel/22294
SAVE_CFLAGS=$CFLAGS
From bf4017b16149ba17d723abacfe93aec79b2235fe Mon Sep 17 00:00:00 2001
From: Farhan Saif
Date: Tue, 10 Mar 2026 11:23:39 -0500
Subject: [PATCH 12/19] gh-125053: Document that ob_mutex must only be used via
critical section API (#144599)
Add a warning in the free-threading extensions howto explaining that
PyObject.ob_mutex is reserved for the critical section API and must not
be locked directly with PyMutex_Lock, as this can cause deadlocks.
Extension authors who need their own lock should add a separate PyMutex
field to their object struct.
Also add an ob_mutex member entry under PyObject in the C API reference
(Doc/c-api/structures.rst) with a cross-reference to the howto.
Co-authored-by: Victor Stinner
---
Doc/c-api/structures.rst | 13 +++++++++++++
Doc/howto/free-threading-extensions.rst | 24 ++++++++++++++++++++++++
2 files changed, 37 insertions(+)
diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst
index 70c4de543b7d00..c0d2663adefc6b 100644
--- a/Doc/c-api/structures.rst
+++ b/Doc/c-api/structures.rst
@@ -48,6 +48,19 @@ under :ref:`reference counting `.
Do not use this field directly; use :c:macro:`Py_TYPE` and
:c:func:`Py_SET_TYPE` instead.
+ .. c:member:: PyMutex ob_mutex
+
+ A :ref:`per-object lock `, present only in the :term:`free-threaded `
+ build (when :c:macro:`Py_GIL_DISABLED` is defined).
+
+ This field is **reserved for use by the critical section API**
+ (:c:macro:`Py_BEGIN_CRITICAL_SECTION` / :c:macro:`Py_END_CRITICAL_SECTION`).
+ Do **not** lock it directly with ``PyMutex_Lock``; doing so can cause
+ deadlocks. If you need your own lock, add a separate :c:type:`PyMutex`
+ field to your object struct.
+
+ .. versionadded:: 3.13
+
.. c:type:: PyVarObject
diff --git a/Doc/howto/free-threading-extensions.rst b/Doc/howto/free-threading-extensions.rst
index 83eba8cfea3969..2f089a3d89680a 100644
--- a/Doc/howto/free-threading-extensions.rst
+++ b/Doc/howto/free-threading-extensions.rst
@@ -384,6 +384,30 @@ Important Considerations
internal extension state, standard mutexes or other synchronization
primitives might be more appropriate.
+.. _per-object-locks:
+
+Per-Object Locks (``ob_mutex``)
+...............................
+
+In the free-threaded build, each Python object contains a :c:member:`~PyObject.ob_mutex`
+field of type :c:type:`PyMutex`. This mutex is **reserved for use by the
+critical section API** (:c:macro:`Py_BEGIN_CRITICAL_SECTION` /
+:c:macro:`Py_END_CRITICAL_SECTION`).
+
+.. warning::
+
+ Do **not** lock ``ob_mutex`` directly with ``PyMutex_Lock(&obj->ob_mutex)``.
+ Mixing direct ``PyMutex_Lock`` calls with the critical section API on the
+ same mutex can cause deadlocks.
+
+Even if your own code never uses critical sections on a particular object type,
+**CPython internals may use the critical section API on any Python object**.
+
+If your extension type needs its own lock, add a separate :c:type:`PyMutex`
+field (or another synchronization primitive) to your object struct.
+:c:type:`PyMutex` is very lightweight, so there is negligible cost to having
+an additional one.
+
Building Extensions for the Free-Threaded Build
===============================================
From 3f33bf83e8496737b86333bc9ec55dc3ccb3faca Mon Sep 17 00:00:00 2001
From: Serhiy Storchaka
Date: Tue, 10 Mar 2026 18:29:23 +0200
Subject: [PATCH 13/19] gh-145743: Fix inconsistency after calling
Struct.__init__() with invalid format (GH-145744)
Only set the format attribute after successful (re-)initialization.
---
Lib/test/test_struct.py | 20 ++++++++++++++++++--
Modules/_struct.c | 29 +++++++++++++++--------------
2 files changed, 33 insertions(+), 16 deletions(-)
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index 4cbfd7ad8b1e48..6904572d095d31 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -584,8 +584,24 @@ def test_Struct_reinitialization(self):
# Issue 9422: there was a memory leak when reinitializing a
# Struct instance. This test can be used to detect the leak
# when running with regrtest -L.
- s = struct.Struct('i')
- s.__init__('ii')
+ s = struct.Struct('>h')
+ s.__init__('>hh')
+ self.assertEqual(s.format, '>hh')
+ packed = b'\x00\x01\x00\x02'
+ self.assertEqual(s.pack(1, 2), packed)
+ self.assertEqual(s.unpack(packed), (1, 2))
+
+ with self.assertRaises(UnicodeEncodeError):
+ s.__init__('\udc00')
+ self.assertEqual(s.format, '>hh')
+ self.assertEqual(s.pack(1, 2), packed)
+ self.assertEqual(s.unpack(packed), (1, 2))
+
+ with self.assertRaises(struct.error):
+ s.__init__('$')
+ self.assertEqual(s.format, '>hh')
+ self.assertEqual(s.pack(1, 2), packed)
+ self.assertEqual(s.unpack(packed), (1, 2))
def check_sizeof(self, format_str, number_of_codes):
# The size of 'PyStructObject'
diff --git a/Modules/_struct.c b/Modules/_struct.c
index dcc3c7ec63e9e0..c2f7b1fe0e800a 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -1620,11 +1620,11 @@ align(Py_ssize_t size, char c, const formatdef *e)
/* calculate the size of a format string */
static int
-prepare_s(PyStructObject *self)
+prepare_s(PyStructObject *self, PyObject *format)
{
const formatdef *f;
const formatdef *e;
- formatcode *codes;
+ formatcode *codes, *codes0;
const char *s;
const char *fmt;
@@ -1634,8 +1634,8 @@ prepare_s(PyStructObject *self)
_structmodulestate *state = get_struct_state_structinst(self);
- fmt = PyBytes_AS_STRING(self->s_format);
- if (strlen(fmt) != (size_t)PyBytes_GET_SIZE(self->s_format)) {
+ fmt = PyBytes_AS_STRING(format);
+ if (strlen(fmt) != (size_t)PyBytes_GET_SIZE(format)) {
PyErr_SetString(state->StructError,
"embedded null character");
return -1;
@@ -1711,13 +1711,7 @@ prepare_s(PyStructObject *self)
PyErr_NoMemory();
return -1;
}
- /* Free any s_codes value left over from a previous initialization. */
- if (self->s_codes != NULL)
- PyMem_Free(self->s_codes);
- self->s_codes = codes;
- self->s_size = size;
- self->s_len = len;
-
+ codes0 = codes;
s = fmt;
size = 0;
while ((c = *s++) != '\0') {
@@ -1757,6 +1751,14 @@ prepare_s(PyStructObject *self)
codes->size = 0;
codes->repeat = 0;
+ /* Free any s_codes value left over from a previous initialization. */
+ if (self->s_codes != NULL)
+ PyMem_Free(self->s_codes);
+ self->s_codes = codes0;
+ self->s_size = size;
+ self->s_len = len;
+ Py_XSETREF(self->s_format, Py_NewRef(format));
+
return 0;
overflow:
@@ -1820,9 +1822,8 @@ Struct___init___impl(PyStructObject *self, PyObject *format)
return -1;
}
- Py_SETREF(self->s_format, format);
-
- ret = prepare_s(self);
+ ret = prepare_s(self, format);
+ Py_DECREF(format);
return ret;
}
From 9e0802330caca51fed7fc0c8c1dcce2daf03d8bd Mon Sep 17 00:00:00 2001
From: bkap123 <97006829+bkap123@users.noreply.github.com>
Date: Tue, 10 Mar 2026 12:30:11 -0400
Subject: [PATCH 14/19] gh-145036: Fix data race for list capacity in
free-threading (#145365)
Co-authored-by: Kumar Aditya
---
Lib/test/test_free_threading/test_list.py | 21 +++++++++++++++++++
...-02-28-18-42-36.gh-issue-145036.70Kbfz.rst | 1 +
Objects/listobject.c | 10 +++++++--
3 files changed, 30 insertions(+), 2 deletions(-)
create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2026-02-28-18-42-36.gh-issue-145036.70Kbfz.rst
diff --git a/Lib/test/test_free_threading/test_list.py b/Lib/test/test_free_threading/test_list.py
index 27ddc9c2d26dfb..0ede4df103f728 100644
--- a/Lib/test/test_free_threading/test_list.py
+++ b/Lib/test/test_free_threading/test_list.py
@@ -149,6 +149,27 @@ def reader_list(b, l):
with threading_helper.start_threads(threads):
pass
+ # gh-145036: race condition with list.__sizeof__()
+ def test_list_sizeof_free_threaded_build(self):
+ L = []
+
+ def mutate_function():
+ for _ in range(100):
+ L.append(1)
+ L.pop()
+
+ def size_function():
+ for _ in range(100):
+ L.__sizeof__()
+
+ threads = []
+ for _ in range(4):
+ threads.append(Thread(target=mutate_function))
+ threads.append(Thread(target=size_function))
+
+ with threading_helper.start_threads(threads):
+ pass
+
if __name__ == "__main__":
unittest.main()
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2026-02-28-18-42-36.gh-issue-145036.70Kbfz.rst b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-28-18-42-36.gh-issue-145036.70Kbfz.rst
new file mode 100644
index 00000000000000..2a565c1d02bc2e
--- /dev/null
+++ b/Misc/NEWS.d/next/Core_and_Builtins/2026-02-28-18-42-36.gh-issue-145036.70Kbfz.rst
@@ -0,0 +1 @@
+In free-threaded build, fix race condition when calling :meth:`!__sizeof__` on a :class:`list`
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 7fc21907fefd31..62d04ab150a77a 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -3582,8 +3582,14 @@ list___sizeof___impl(PyListObject *self)
/*[clinic end generated code: output=3417541f95f9a53e input=b8030a5d5ce8a187]*/
{
size_t res = _PyObject_SIZE(Py_TYPE(self));
- Py_ssize_t allocated = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->allocated);
- res += (size_t)allocated * sizeof(void*);
+#ifdef Py_GIL_DISABLED
+ PyObject **ob_item = _Py_atomic_load_ptr(&self->ob_item);
+ if (ob_item != NULL) {
+ res += list_capacity(ob_item) * sizeof(PyObject *);
+ }
+#else
+ res += (size_t)self->allocated * sizeof(PyObject *);
+#endif
return PyLong_FromSize_t(res);
}
From 50f82d062b3b59a09d6b63648df22d46f7f2b010 Mon Sep 17 00:00:00 2001
From: Benedikt Johannes
Date: Tue, 10 Mar 2026 17:33:56 +0100
Subject: [PATCH 15/19] gh-145044: avoid calling `Py_DECREF` in
`unsafe_object_compare` on immortal objects (#145045)
---
Objects/listobject.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 62d04ab150a77a..1fcedd3a28c91b 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -2795,11 +2795,12 @@ unsafe_object_compare(PyObject *v, PyObject *w, MergeState *ms)
if (PyBool_Check(res_obj)) {
res = (res_obj == Py_True);
+ assert(_Py_IsImmortal(res_obj));
}
else {
res = PyObject_IsTrue(res_obj);
+ Py_DECREF(res_obj);
}
- Py_DECREF(res_obj);
/* Note that we can't assert
* res == PyObject_RichCompareBool(v, w, Py_LT);
From c4333a12708a917d1cfb6418c04be45793ecc392 Mon Sep 17 00:00:00 2001
From: Sergey B Kirpichev
Date: Tue, 10 Mar 2026 19:40:51 +0300
Subject: [PATCH 16/19] gh-144173: fix flaky test_complex.test_truediv()
(#144355)
Previously, component-wise relative error bound was tested. However,
such bound can't exist already for complex multiplication as one can be
used to perform subtraction of floating-point numbers, e.g. x and y for
z0=1+1j and z1=x+yj.
```pycon
>>> x, y = 1e-9+1j, 1+1j
>>> a = x*y*y.conjugate()/2;a
(1.0000000272292198e-09+1j)
>>> b = x*(y*y.conjugate()/2);b
(1e-09+1j)
>>> b == x
True
>>> (a.real-b.real)/math.ulp(b.real)
131672427.0
```
---
Lib/test/test_complex.py | 41 ++++++++++++++++++++--------------------
1 file changed, 20 insertions(+), 21 deletions(-)
diff --git a/Lib/test/test_complex.py b/Lib/test/test_complex.py
index 0c7e7341f13d4e..bee2aceb187027 100644
--- a/Lib/test/test_complex.py
+++ b/Lib/test/test_complex.py
@@ -72,8 +72,8 @@ def assertAlmostEqual(self, a, b):
else:
unittest.TestCase.assertAlmostEqual(self, a, b)
- def assertCloseAbs(self, x, y, eps=1e-9):
- """Return true iff floats x and y "are close"."""
+ def assertClose(self, x, y, eps=1e-9):
+ """Return true iff complexes x and y "are close"."""
# put the one with larger magnitude second
if abs(x) > abs(y):
x, y = y, x
@@ -82,26 +82,15 @@ def assertCloseAbs(self, x, y, eps=1e-9):
if x == 0:
return abs(y) < eps
# check that relative difference < eps
- self.assertTrue(abs((x-y)/y) < eps)
-
- def assertClose(self, x, y, eps=1e-9):
- """Return true iff complexes x and y "are close"."""
- self.assertCloseAbs(x.real, y.real, eps)
- self.assertCloseAbs(x.imag, y.imag, eps)
+ self.assertTrue(abs(x-y)/abs(y) < eps)
def check_div(self, x, y):
"""Compute complex z=x*y, and check that z/x==y and z/y==x."""
z = x * y
- if x != 0:
- q = z / x
- self.assertClose(q, y)
- q = z.__truediv__(x)
- self.assertClose(q, y)
- if y != 0:
- q = z / y
- self.assertClose(q, x)
- q = z.__truediv__(y)
- self.assertClose(q, x)
+ if x:
+ self.assertClose(z / x, y)
+ if y:
+ self.assertClose(z / y, x)
def test_truediv(self):
simple_real = [float(i) for i in range(-5, 6)]
@@ -115,10 +104,20 @@ def test_truediv(self):
self.check_div(complex(1e200, 1e200), 1+0j)
self.check_div(complex(1e-200, 1e-200), 1+0j)
+ # Smith's algorithm has several sources of inaccuracy
+ # for components of the result. In examples below,
+ # it's cancellation of digits in computation of sum.
+ self.check_div(1e-09+1j, 1+1j)
+ self.check_div(8.289760544677449e-09+0.13257307440728516j,
+ 0.9059966714925808+0.5054864708672686j)
+
# Just for fun.
for i in range(100):
- self.check_div(complex(random(), random()),
- complex(random(), random()))
+ x = complex(random(), random())
+ y = complex(random(), random())
+ self.check_div(x, y)
+ y = complex(1e10*y.real, y.imag)
+ self.check_div(x, y)
self.assertAlmostEqual(complex.__truediv__(2+0j, 1+1j), 1-1j)
self.assertRaises(TypeError, operator.truediv, 1j, None)
@@ -454,7 +453,7 @@ def test_boolcontext(self):
self.assertTrue(1j)
def test_conjugate(self):
- self.assertClose(complex(5.3, 9.8).conjugate(), 5.3-9.8j)
+ self.assertEqual(complex(5.3, 9.8).conjugate(), 5.3-9.8j)
def test_constructor(self):
def check(z, x, y):
From f26eca7732ca9d0e6893e3fdfdfd4c25339c7155 Mon Sep 17 00:00:00 2001
From: Sam Gross
Date: Tue, 10 Mar 2026 12:47:12 -0400
Subject: [PATCH 17/19] gh-145685: Update find_name_in_mro() to return a
_PyStackRef (gh-145693)
---
Objects/typeobject.c | 80 +++++++++++++++++++-------------------------
1 file changed, 35 insertions(+), 45 deletions(-)
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 81abb0990eebe9..5dc96bf251b384 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -5978,15 +5978,16 @@ PyObject_GetItemData(PyObject *obj)
}
/* Internal API to look for a name through the MRO, bypassing the method cache.
- This returns a borrowed reference, and might set an exception.
- 'error' is set to: -1: error with exception; 1: error without exception; 0: ok */
-static PyObject *
-find_name_in_mro(PyTypeObject *type, PyObject *name, int *error)
+ The result is stored as a _PyStackRef in `out`. It never set an exception.
+ Returns -1 if there was an error, 0 if the name was not found, and 1 if
+ the name was found. */
+static int
+find_name_in_mro(PyTypeObject *type, PyObject *name, _PyStackRef *out)
{
Py_hash_t hash = _PyObject_HashFast(name);
if (hash == -1) {
- *error = -1;
- return NULL;
+ PyErr_Clear();
+ return -1;
}
/* Look in tp_dict of types in MRO */
@@ -5994,37 +5995,42 @@ find_name_in_mro(PyTypeObject *type, PyObject *name, int *error)
if (mro == NULL) {
if (!is_readying(type)) {
if (PyType_Ready(type) < 0) {
- *error = -1;
- return NULL;
+ PyErr_Clear();
+ return -1;
}
mro = lookup_tp_mro(type);
}
if (mro == NULL) {
- *error = 1;
- return NULL;
+ return -1;
}
}
- PyObject *res = NULL;
+ int res = 0;
+ PyThreadState *tstate = _PyThreadState_GET();
/* Keep a strong reference to mro because type->tp_mro can be replaced
during dict lookup, e.g. when comparing to non-string keys. */
- Py_INCREF(mro);
+ _PyCStackRef mro_ref;
+ _PyThreadState_PushCStackRef(tstate, &mro_ref);
+ mro_ref.ref = PyStackRef_FromPyObjectNew(mro);
Py_ssize_t n = PyTuple_GET_SIZE(mro);
for (Py_ssize_t i = 0; i < n; i++) {
PyObject *base = PyTuple_GET_ITEM(mro, i);
PyObject *dict = lookup_tp_dict(_PyType_CAST(base));
assert(dict && PyDict_Check(dict));
- if (_PyDict_GetItemRef_KnownHash((PyDictObject *)dict, name, hash, &res) < 0) {
- *error = -1;
+ Py_ssize_t ix = _Py_dict_lookup_threadsafe_stackref(
+ (PyDictObject *)dict, name, hash, out);
+ if (ix == DKIX_ERROR) {
+ PyErr_Clear();
+ res = -1;
goto done;
}
- if (res != NULL) {
+ if (!PyStackRef_IsNull(*out)) {
+ res = 1;
break;
}
}
- *error = 0;
done:
- Py_DECREF(mro);
+ _PyThreadState_PopCStackRef(tstate, &mro_ref);
return res;
}
@@ -6179,11 +6185,11 @@ _PyType_LookupStackRefAndVersion(PyTypeObject *type, PyObject *name, _PyStackRef
// We need to atomically do the lookup and capture the version before
// anyone else can modify our mro or mutate the type.
- PyObject *res;
- int error;
+ int res;
PyInterpreterState *interp = _PyInterpreterState_GET();
int has_version = 0;
unsigned int assigned_version = 0;
+
BEGIN_TYPE_LOCK();
// We must assign the version before doing the lookup. If
// find_name_in_mro() blocks and releases the critical section
@@ -6192,35 +6198,24 @@ _PyType_LookupStackRefAndVersion(PyTypeObject *type, PyObject *name, _PyStackRef
has_version = assign_version_tag(interp, type);
assigned_version = type->tp_version_tag;
}
- res = find_name_in_mro(type, name, &error);
+ res = find_name_in_mro(type, name, out);
END_TYPE_LOCK();
/* Only put NULL results into cache if there was no error. */
- if (error) {
- /* It's not ideal to clear the error condition,
- but this function is documented as not setting
- an exception, and I don't want to change that.
- E.g., when PyType_Ready() can't proceed, it won't
- set the "ready" flag, so future attempts to ready
- the same type will call it again -- hopefully
- in a context that propagates the exception out.
- */
- if (error == -1) {
- PyErr_Clear();
- }
+ if (res < 0) {
*out = PyStackRef_NULL;
return 0;
}
if (has_version) {
+ PyObject *res_obj = PyStackRef_AsPyObjectBorrow(*out);
#if Py_GIL_DISABLED
- update_cache_gil_disabled(entry, name, assigned_version, res);
+ update_cache_gil_disabled(entry, name, assigned_version, res_obj);
#else
- PyObject *old_value = update_cache(entry, name, assigned_version, res);
+ PyObject *old_value = update_cache(entry, name, assigned_version, res_obj);
Py_DECREF(old_value);
#endif
}
- *out = res ? PyStackRef_FromPyObjectSteal(res) : PyStackRef_NULL;
return has_version ? assigned_version : 0;
}
@@ -11709,7 +11704,6 @@ update_one_slot(PyTypeObject *type, pytype_slotdef *p, pytype_slotdef **next_p,
int use_generic = 0;
int offset = p->offset;
- int error;
void **ptr = slotptr(type, offset);
if (ptr == NULL) {
@@ -11725,19 +11719,15 @@ update_one_slot(PyTypeObject *type, pytype_slotdef *p, pytype_slotdef **next_p,
assert(!PyErr_Occurred());
do {
/* Use faster uncached lookup as we won't get any cache hits during type setup. */
- descr = find_name_in_mro(type, p->name_strobj, &error);
- if (descr == NULL) {
- if (error == -1) {
- /* It is unlikely but not impossible that there has been an exception
- during lookup. Since this function originally expected no errors,
- we ignore them here in order to keep up the interface. */
- PyErr_Clear();
- }
+ _PyStackRef descr_ref;
+ int res = find_name_in_mro(type, p->name_strobj, &descr_ref);
+ if (res <= 0) {
if (ptr == (void**)&type->tp_iternext) {
specific = (void *)_PyObject_NextNotImplemented;
}
continue;
}
+ descr = PyStackRef_AsPyObjectBorrow(descr_ref);
if (Py_IS_TYPE(descr, &PyWrapperDescr_Type) &&
((PyWrapperDescrObject *)descr)->d_base->name_strobj == p->name_strobj) {
void **tptr;
@@ -11815,7 +11805,7 @@ update_one_slot(PyTypeObject *type, pytype_slotdef *p, pytype_slotdef **next_p,
}
}
}
- Py_DECREF(descr);
+ PyStackRef_CLOSE(descr_ref);
} while ((++p)->offset == offset);
void *slot_value;
From 9c1c71066e34b11649735e8acb4765a85c76336f Mon Sep 17 00:00:00 2001
From: Sam Gross
Date: Tue, 10 Mar 2026 12:55:29 -0400
Subject: [PATCH 18/19] gh-145010: Fix Python.h compilation with -masm=intel
(#145011)
---
Include/object.h | 6 +++---
Lib/test/test_cppext/__init__.py | 20 ++++++++++++++++---
Lib/test/test_cppext/setup.py | 4 ++++
...-02-19-18-39-11.gh-issue-145010.mKzjci.rst | 2 ++
4 files changed, 26 insertions(+), 6 deletions(-)
create mode 100644 Misc/NEWS.d/next/C_API/2026-02-19-18-39-11.gh-issue-145010.mKzjci.rst
diff --git a/Include/object.h b/Include/object.h
index ad452be8405671..3fb28035a50547 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -206,11 +206,11 @@ _Py_ThreadId(void)
#elif defined(__MINGW32__) && defined(_M_ARM64)
tid = __getReg(18);
#elif defined(__i386__)
- __asm__("movl %%gs:0, %0" : "=r" (tid)); // 32-bit always uses GS
+ __asm__("{movl %%gs:0, %0|mov %0, dword ptr gs:[0]}" : "=r" (tid)); // 32-bit always uses GS
#elif defined(__MACH__) && defined(__x86_64__)
- __asm__("movq %%gs:0, %0" : "=r" (tid)); // x86_64 macOSX uses GS
+ __asm__("{movq %%gs:0, %0|mov %0, qword ptr gs:[0]}" : "=r" (tid)); // x86_64 macOSX uses GS
#elif defined(__x86_64__)
- __asm__("movq %%fs:0, %0" : "=r" (tid)); // x86_64 Linux, BSD uses FS
+ __asm__("{movq %%fs:0, %0|mov %0, qword ptr fs:[0]}" : "=r" (tid)); // x86_64 Linux, BSD uses FS
#elif defined(__arm__) && __ARM_ARCH >= 7
__asm__ ("mrc p15, 0, %0, c13, c0, 3\nbic %0, %0, #3" : "=r" (tid));
#elif defined(__aarch64__) && defined(__APPLE__)
diff --git a/Lib/test/test_cppext/__init__.py b/Lib/test/test_cppext/__init__.py
index 1fd01702f64029..5b4c97c181bb6a 100644
--- a/Lib/test/test_cppext/__init__.py
+++ b/Lib/test/test_cppext/__init__.py
@@ -1,6 +1,7 @@
# gh-91321: Build a basic C++ test extension to check that the Python C API is
# compatible with C++ and does not emit C++ compiler warnings.
import os.path
+import platform
import shlex
import shutil
import subprocess
@@ -28,13 +29,16 @@
class BaseTests:
TEST_INTERNAL_C_API = False
- def check_build(self, extension_name, std=None, limited=False):
+ def check_build(self, extension_name, std=None, limited=False,
+ extra_cflags=None):
venv_dir = 'env'
with support.setup_venv_with_pip_setuptools(venv_dir) as python_exe:
self._check_build(extension_name, python_exe,
- std=std, limited=limited)
+ std=std, limited=limited,
+ extra_cflags=extra_cflags)
- def _check_build(self, extension_name, python_exe, std, limited):
+ def _check_build(self, extension_name, python_exe, std, limited,
+ extra_cflags=None):
pkg_dir = 'pkg'
os.mkdir(pkg_dir)
shutil.copy(SETUP, os.path.join(pkg_dir, os.path.basename(SETUP)))
@@ -48,6 +52,8 @@ def run_cmd(operation, cmd):
env['CPYTHON_TEST_LIMITED'] = '1'
env['CPYTHON_TEST_EXT_NAME'] = extension_name
env['TEST_INTERNAL_C_API'] = str(int(self.TEST_INTERNAL_C_API))
+ if extra_cflags:
+ env['CPYTHON_TEST_EXTRA_CFLAGS'] = extra_cflags
if support.verbose:
print('Run:', ' '.join(map(shlex.quote, cmd)))
subprocess.run(cmd, check=True, env=env)
@@ -116,6 +122,14 @@ def test_build_cpp11(self):
def test_build_cpp14(self):
self.check_build('_testcpp14ext', std='c++14')
+ # Test that headers compile with Intel asm syntax, which may conflict
+ # with inline assembly in free-threading headers that use AT&T syntax.
+ @unittest.skipIf(support.MS_WINDOWS, "MSVC doesn't support -masm=intel")
+ @unittest.skipUnless(platform.machine() in ('x86_64', 'i686', 'AMD64'),
+ "x86-specific flag")
+ def test_build_intel_asm(self):
+ self.check_build('_testcppext_asm', extra_cflags='-masm=intel')
+
class TestInteralCAPI(BaseTests, unittest.TestCase):
TEST_INTERNAL_C_API = True
diff --git a/Lib/test/test_cppext/setup.py b/Lib/test/test_cppext/setup.py
index 2d9052a6b879da..14aeafefcaa8f7 100644
--- a/Lib/test/test_cppext/setup.py
+++ b/Lib/test/test_cppext/setup.py
@@ -86,6 +86,10 @@ def main():
if internal:
cppflags.append('-DTEST_INTERNAL_C_API=1')
+ extra_cflags = os.environ.get("CPYTHON_TEST_EXTRA_CFLAGS", "")
+ if extra_cflags:
+ cppflags.extend(shlex.split(extra_cflags))
+
# On Windows, add PCbuild\amd64\ to include and library directories
include_dirs = []
library_dirs = []
diff --git a/Misc/NEWS.d/next/C_API/2026-02-19-18-39-11.gh-issue-145010.mKzjci.rst b/Misc/NEWS.d/next/C_API/2026-02-19-18-39-11.gh-issue-145010.mKzjci.rst
new file mode 100644
index 00000000000000..7f5be699c6348d
--- /dev/null
+++ b/Misc/NEWS.d/next/C_API/2026-02-19-18-39-11.gh-issue-145010.mKzjci.rst
@@ -0,0 +1,2 @@
+Use GCC dialect alternatives for inline assembly in ``object.h`` so that the
+Python headers compile correctly with ``-masm=intel``.
From 4d0dce0c8ddc4d0321bd590a1a33990edc2e1b08 Mon Sep 17 00:00:00 2001
From: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com>
Date: Tue, 10 Mar 2026 16:57:34 +0000
Subject: [PATCH 19/19] Fix integer overflow for formats "s" and "p" in the
struct module (GH-145750)
---
Lib/test/test_struct.py | 6 ++++++
.../2026-03-10-14-13-12.gh-issue-145750.iQsTeX.rst | 3 +++
Modules/_struct.c | 8 +++++++-
3 files changed, 16 insertions(+), 1 deletion(-)
create mode 100644 Misc/NEWS.d/next/Library/2026-03-10-14-13-12.gh-issue-145750.iQsTeX.rst
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index 6904572d095d31..55e2ce590a2577 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -555,6 +555,12 @@ def test_count_overflow(self):
hugecount3 = '{}i{}q'.format(sys.maxsize // 4, sys.maxsize // 8)
self.assertRaises(struct.error, struct.calcsize, hugecount3)
+ hugecount4 = '{}?s'.format(sys.maxsize)
+ self.assertRaises(struct.error, struct.calcsize, hugecount4)
+
+ hugecount5 = '{}?p'.format(sys.maxsize)
+ self.assertRaises(struct.error, struct.calcsize, hugecount5)
+
def test_trailing_counter(self):
store = array.array('b', b' '*100)
diff --git a/Misc/NEWS.d/next/Library/2026-03-10-14-13-12.gh-issue-145750.iQsTeX.rst b/Misc/NEWS.d/next/Library/2026-03-10-14-13-12.gh-issue-145750.iQsTeX.rst
new file mode 100644
index 00000000000000..a909bea2caffe9
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-03-10-14-13-12.gh-issue-145750.iQsTeX.rst
@@ -0,0 +1,3 @@
+Avoid undefined behaviour from signed integer overflow when parsing format
+strings in the :mod:`struct` module. Found by OSS Fuzz in
+:oss-fuzz:`488466741`.
diff --git a/Modules/_struct.c b/Modules/_struct.c
index c2f7b1fe0e800a..f8574322b40c8d 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -1676,7 +1676,13 @@ prepare_s(PyStructObject *self, PyObject *format)
switch (c) {
case 's': _Py_FALLTHROUGH;
- case 'p': len++; ncodes++; break;
+ case 'p':
+ if (len == PY_SSIZE_T_MAX) {
+ goto overflow;
+ }
+ len++;
+ ncodes++;
+ break;
case 'x': break;
default:
if (num > PY_SSIZE_T_MAX - len) {