From 4d7b4fe5a4a242ae7ed4d3d3bdd1899296eb8d45 Mon Sep 17 00:00:00 2001 From: Donghee Na Date: Fri, 5 Sep 2025 02:19:30 +0900 Subject: [PATCH] gh-138192: Fix Context initialization so that all subinterpreters are assigned the MISSING value. (gh-138503) --------- (cherry picked from commit f070f54c5f4a42c7c61d1d5d3b8f3b7203b4a0fb) Co-authored-by: Donghee Na Co-authored-by: Peter Bierma --- Lib/test/test_interpreters/test_api.py | 10 ++++++++++ .../2025-09-05-01-19-04.gh-issue-138192.erluq5.rst | 2 ++ Python/context.c | 5 +---- 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-09-05-01-19-04.gh-issue-138192.erluq5.rst diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py index a34b20beaca7a3..289e607ad3fad3 100644 --- a/Lib/test/test_interpreters/test_api.py +++ b/Lib/test/test_interpreters/test_api.py @@ -2204,6 +2204,16 @@ def test_whence(self): whence = eval(text) self.assertEqual(whence, _interpreters.WHENCE_LEGACY_CAPI) + def test_contextvars_missing(self): + script = f""" + import contextvars + print(getattr(contextvars.Token, "MISSING", "'doesn't exist'")) + """ + + orig = _interpreters.create() + text = self.run_and_capture(orig, script) + self.assertEqual(text.strip(), "") + def test_is_running(self): def check(interpid, expected): with self.assertRaisesRegex(InterpreterError, 'unrecognized'): diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-09-05-01-19-04.gh-issue-138192.erluq5.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-05-01-19-04.gh-issue-138192.erluq5.rst new file mode 100644 index 00000000000000..05fa8edacd680a --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-09-05-01-19-04.gh-issue-138192.erluq5.rst @@ -0,0 +1,2 @@ +Fix :mod:`contextvars` initialization so that all subinterpreters are assigned the +:attr:`~contextvars.Token.MISSING` value. diff --git a/Python/context.c b/Python/context.c index 9927cab915cae7..d1f8b7c2482181 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1357,11 +1357,8 @@ get_token_missing(void) PyStatus _PyContext_Init(PyInterpreterState *interp) { - if (!_Py_IsMainInterpreter(interp)) { - return _PyStatus_OK(); - } - PyObject *missing = get_token_missing(); + assert(PyUnstable_IsImmortal(missing)); if (PyDict_SetItemString( _PyType_GetDict(&PyContextToken_Type), "MISSING", missing)) {