[3.13] gh-119560: Drop an Invalid Assert in PyState_FindModule() (gh-119561) (gh-119632)

The assertion was added in gh-118532 but was based on the invalid assumption that PyState_FindModule() would only be called with an already-initialized module def.  I've added a test to make sure we don't make that assumption again.

(cherry picked from commit 0c5ebe13e9)

Co-authored-by: Eric Snow <ericsnowcurrently@gmail.com>
This commit is contained in:
Miss Islington (bot) 2024-05-27 21:11:29 +02:00 committed by GitHub
parent 0a4a3184f5
commit bd9983cab8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 100 additions and 4 deletions

View file

@ -1,7 +1,7 @@
/* Testing module for single-phase initialization of extension modules
This file contains 5 distinct modules, meaning each as its own name
This file contains 8 distinct modules, meaning each as its own name
and its own init function (PyInit_...). The default import system will
only find the one matching the filename: _testsinglephase. To load the
others you must do so manually. For example:
@ -14,7 +14,7 @@ spec = importlib.util.spec_from_file_location(name, filename, loader=loader)
mod = importlib._bootstrap._load(spec)
```
Here are the 5 modules:
Here are the 8 modules:
* _testsinglephase
* def: _testsinglephase_basic,
@ -136,6 +136,32 @@ Here are the 5 modules:
5. increment <global>.initialized_count
* functions: see common functions below
* import system: same as _testsinglephase_basic_copy
* _testsinglephase_check_cache_first
* def: _testsinglepahse_check_cache_first
* m_name: "_testsinglephase_check_cache_first"
* m_size: -1
* state: none
* init function:
* tries PyState_FindModule() first
* otherwise creates empty module
* functions: none
* import system: same as _testsinglephase
* _testsinglephase_with_reinit_check_cache_first
* def: _testsinglepahse_with_reinit_check_cache_first
* m_name: "_testsinglephase_with_reinit_check_cache_first"
* m_size: 0
* state: none
* init function: same as _testsinglephase_check_cache_first
* functions: none
* import system: same as _testsinglephase_with_reinit
* _testsinglephase_with_state_check_cache_first
* def: _testsinglepahse_with_state_check_cache_first
* m_name: "_testsinglephase_with_state_check_cache_first"
* m_size: 42
* state: none
* init function: same as _testsinglephase_check_cache_first
* functions: none
* import system: same as _testsinglephase_with_state
Module state:
@ -650,3 +676,64 @@ PyInit__testsinglephase_with_state(void)
finally:
return module;
}
/****************************************************/
/* the _testsinglephase_*_check_cache_first modules */
/****************************************************/
static struct PyModuleDef _testsinglephase_check_cache_first = {
PyModuleDef_HEAD_INIT,
.m_name = "_testsinglephase_check_cache_first",
.m_doc = PyDoc_STR("Test module _testsinglephase_check_cache_first"),
.m_size = -1, // no module state
};
PyMODINIT_FUNC
PyInit__testsinglephase_check_cache_first(void)
{
assert(_testsinglephase_check_cache_first.m_base.m_index == 0);
PyObject *mod = PyState_FindModule(&_testsinglephase_check_cache_first);
if (mod != NULL) {
return Py_NewRef(mod);
}
return PyModule_Create(&_testsinglephase_check_cache_first);
}
static struct PyModuleDef _testsinglephase_with_reinit_check_cache_first = {
PyModuleDef_HEAD_INIT,
.m_name = "_testsinglephase_with_reinit_check_cache_first",
.m_doc = PyDoc_STR("Test module _testsinglephase_with_reinit_check_cache_first"),
.m_size = 0, // no module state
};
PyMODINIT_FUNC
PyInit__testsinglephase_with_reinit_check_cache_first(void)
{
assert(_testsinglephase_with_reinit_check_cache_first.m_base.m_index == 0);
PyObject *mod = PyState_FindModule(&_testsinglephase_with_reinit_check_cache_first);
if (mod != NULL) {
return Py_NewRef(mod);
}
return PyModule_Create(&_testsinglephase_with_reinit_check_cache_first);
}
static struct PyModuleDef _testsinglephase_with_state_check_cache_first = {
PyModuleDef_HEAD_INIT,
.m_name = "_testsinglephase_with_state_check_cache_first",
.m_doc = PyDoc_STR("Test module _testsinglephase_with_state_check_cache_first"),
.m_size = 42, // not used
};
PyMODINIT_FUNC
PyInit__testsinglephase_with_state_check_cache_first(void)
{
assert(_testsinglephase_with_state_check_cache_first.m_base.m_index == 0);
PyObject *mod = PyState_FindModule(&_testsinglephase_with_state_check_cache_first);
if (mod != NULL) {
return Py_NewRef(mod);
}
return PyModule_Create(&_testsinglephase_with_state_check_cache_first);
}