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

Reply via email to