https://github.com/python/cpython/commit/a678d8e511456c96652af965309e684ccaa98e90 commit: a678d8e511456c96652af965309e684ccaa98e90 branch: 3.12 author: Petr Viktorin <encu...@gmail.com> committer: encukou <encu...@gmail.com> date: 2025-02-27T16:30:46+01:00 summary:
[3.12] gh-129405: Fix doc for Py_mod_multiple_interpreters default, and add test (GH-129406) (GH-130510) files: M Doc/c-api/module.rst M Lib/test/test_import/__init__.py M Modules/_testmultiphase.c diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index b110443d927070..2afa760b5d33ef 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -415,7 +415,7 @@ The available slot types are: in one module definition. If ``Py_mod_multiple_interpreters`` is not specified, the import - machinery defaults to ``Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED``. + machinery defaults to ``Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED``. .. versionadded:: 3.12 diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py index 81b2f33a840f1d..1ac756f1b15365 100644 --- a/Lib/test/test_import/__init__.py +++ b/Lib/test/test_import/__init__.py @@ -1900,6 +1900,7 @@ def test_single_init_extension_compat(self): @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") def test_multi_init_extension_compat(self): + # Module with Py_MOD_PER_INTERPRETER_GIL_SUPPORTED module = '_testmultiphase' require_extension(module) with self.subTest(f'{module}: not strict'): @@ -1911,6 +1912,8 @@ def test_multi_init_extension_compat(self): @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") def test_multi_init_extension_non_isolated_compat(self): + # Module with Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED + # and Py_MOD_GIL_NOT_USED modname = '_test_non_isolated' filename = _testmultiphase.__file__ loader = ExtensionFileLoader(modname, filename) @@ -1929,23 +1932,33 @@ def test_multi_init_extension_non_isolated_compat(self): @unittest.skipIf(_testmultiphase is None, "test requires _testmultiphase module") def test_multi_init_extension_per_interpreter_gil_compat(self): - modname = '_test_shared_gil_only' - filename = _testmultiphase.__file__ - loader = ExtensionFileLoader(modname, filename) - spec = importlib.util.spec_from_loader(modname, loader) - module = importlib.util.module_from_spec(spec) - loader.exec_module(module) - sys.modules[modname] = module - - require_extension(module) - with self.subTest(f'{modname}: isolated, strict'): - self.check_incompatible_here(modname, filename, isolated=True) - with self.subTest(f'{modname}: not isolated, strict'): - self.check_compatible_here(modname, filename, - strict=True, isolated=False) - with self.subTest(f'{modname}: not isolated, not strict'): - self.check_compatible_here(modname, filename, - strict=False, isolated=False) + # _test_shared_gil_only: + # Explicit Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED (default) + # and Py_MOD_GIL_NOT_USED + # _test_no_multiple_interpreter_slot: + # No Py_mod_multiple_interpreters slot + # and Py_MOD_GIL_NOT_USED + for modname in ('_test_shared_gil_only', + '_test_no_multiple_interpreter_slot'): + with self.subTest(modname=modname): + + filename = _testmultiphase.__file__ + loader = ExtensionFileLoader(modname, filename) + spec = importlib.util.spec_from_loader(modname, loader) + module = importlib.util.module_from_spec(spec) + loader.exec_module(module) + sys.modules[modname] = module + + require_extension(module) + with self.subTest(f'{modname}: isolated, strict'): + self.check_incompatible_here(modname, filename, + isolated=True) + with self.subTest(f'{modname}: not isolated, strict'): + self.check_compatible_here(modname, filename, + strict=True, isolated=False) + with self.subTest(f'{modname}: not isolated, not strict'): + self.check_compatible_here( + modname, filename, strict=False, isolated=False) def test_python_compat(self): module = 'threading' diff --git a/Modules/_testmultiphase.c b/Modules/_testmultiphase.c index ca71b6156b005d..7e7451b430dbf5 100644 --- a/Modules/_testmultiphase.c +++ b/Modules/_testmultiphase.c @@ -967,3 +967,20 @@ PyInit__test_shared_gil_only(void) { return PyModuleDef_Init(&shared_gil_only_def); } + + +static PyModuleDef_Slot no_multiple_interpreter_slot_slots[] = { + {Py_mod_exec, execfunc}, + {0, NULL}, +}; + +static PyModuleDef no_multiple_interpreter_slot_def = TEST_MODULE_DEF( + "_test_no_multiple_interpreter_slot", + no_multiple_interpreter_slot_slots, + testexport_methods); + +PyMODINIT_FUNC +PyInit__test_no_multiple_interpreter_slot(void) +{ + return PyModuleDef_Init(&no_multiple_interpreter_slot_def); +} _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com