summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_import/__init__.py3
-rw-r--r--Modules/_testsinglephase.c3
-rw-r--r--Python/import.c4
3 files changed, 8 insertions, 2 deletions
diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py
index 11eaae5..b09065f 100644
--- a/Lib/test/test_import/__init__.py
+++ b/Lib/test/test_import/__init__.py
@@ -2887,12 +2887,15 @@ class SinglephaseInitTests(unittest.TestCase):
self.assertIs(reloaded.snapshot.cached, reloaded.module)
+ @unittest.skipIf(_testinternalcapi is None, "requires _testinternalcapi")
def test_check_state_first(self):
for variant in ['', '_with_reinit', '_with_state']:
name = f'{self.NAME}{variant}_check_cache_first'
with self.subTest(name):
mod = self._load_dynamic(name, self.ORIGIN)
self.assertEqual(mod.__name__, name)
+ sys.modules.pop(name, None)
+ _testinternalcapi.clear_extension(name, self.ORIGIN)
# Currently, for every single-phrase init module loaded
# in multiple interpreters, those interpreters share a
diff --git a/Modules/_testsinglephase.c b/Modules/_testsinglephase.c
index bcdb5ba..066e0db 100644
--- a/Modules/_testsinglephase.c
+++ b/Modules/_testsinglephase.c
@@ -682,6 +682,9 @@ finally:
/* the _testsinglephase_*_check_cache_first modules */
/****************************************************/
+/* Each of these modules should only be freshly loaded. That means
+ clearing the caches and each module def's m_base after each load. */
+
static struct PyModuleDef _testsinglephase_check_cache_first = {
PyModuleDef_HEAD_INIT,
.m_name = "_testsinglephase_check_cache_first",
diff --git a/Python/import.c b/Python/import.c
index 4f3325a..6fe6df4 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -494,7 +494,7 @@ _modules_by_index_check(PyInterpreterState *interp, Py_ssize_t index)
if (MODULES_BY_INDEX(interp) == NULL) {
return "Interpreters module-list not accessible.";
}
- if (index > PyList_GET_SIZE(MODULES_BY_INDEX(interp))) {
+ if (index >= PyList_GET_SIZE(MODULES_BY_INDEX(interp))) {
return "Module index out of bounds.";
}
return NULL;
@@ -2183,7 +2183,7 @@ clear_singlephase_extension(PyInterpreterState *interp,
/* Clear data set when the module was initially loaded. */
def->m_base.m_init = NULL;
Py_CLEAR(def->m_base.m_copy);
- // We leave m_index alone since there's no reason to reset it.
+ def->m_base.m_index = 0;
/* Clear the PyState_*Module() cache entry. */
Py_ssize_t index = _get_cached_module_index(cached);