Skip to content

Commit 7c6681b

Browse files
committed
gh-138192: Fix Context initialization so that all subinterpreters are assigned the MISSING value.
1 parent 9d6b94a commit 7c6681b

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

Lib/test/test_interpreters/test_api.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2204,6 +2204,27 @@ def test_whence(self):
22042204
whence = eval(text)
22052205
self.assertEqual(whence, _interpreters.WHENCE_LEGACY_CAPI)
22062206

2207+
def test_get_current_missing(self):
2208+
with self.subTest('main'):
2209+
main, *_ = _interpreters.get_main()
2210+
interpid, whence = _interpreters.get_current()
2211+
self.assertEqual(interpid, main)
2212+
self.assertEqual(whence, _interpreters.WHENCE_RUNTIME)
2213+
2214+
script = f"""
2215+
import contextvars
2216+
from concurrent.interpreters import get_current
2217+
print(getattr(contextvars.Token, "MISSING", "'doesn't exist'"))
2218+
"""
2219+
def parse_stdout(text):
2220+
interpid, whence = eval(text)
2221+
return interpid, whence
2222+
2223+
with self.subTest('from concurrent.interpreters'):
2224+
orig = _interpreters.create()
2225+
text = self.run_and_capture(orig, script)
2226+
self.assertEqual(text.strip(), "<Token.MISSING>")
2227+
22072228
def test_is_running(self):
22082229
def check(interpid, expected):
22092230
with self.assertRaisesRegex(InterpreterError, 'unrecognized'):
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix Context initialization so that all subinterpreters are assigned the
2+
MISSING value.

Python/context.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,10 +1360,6 @@ get_token_missing(void)
13601360
PyStatus
13611361
_PyContext_Init(PyInterpreterState *interp)
13621362
{
1363-
if (!_Py_IsMainInterpreter(interp)) {
1364-
return _PyStatus_OK();
1365-
}
1366-
13671363
PyObject *missing = get_token_missing();
13681364
if (PyDict_SetItemString(
13691365
_PyType_GetDict(&PyContextToken_Type), "MISSING", missing))

0 commit comments

Comments
 (0)