diff options
author | Eric Snow <ericsnowcurrently@gmail.com> | 2024-05-04 21:24:02 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-04 21:24:02 (GMT) |
commit | 291cfa454b9c5b677c955aaf53fab91f0186b6fa (patch) | |
tree | 0a0976010c9f0bd5fb77f80e00f44fa726d7c665 /Include | |
parent | 978fba58aef347de4a1376e525df2dacc7b2fff3 (diff) | |
download | cpython-291cfa454b9c5b677c955aaf53fab91f0186b6fa.zip cpython-291cfa454b9c5b677c955aaf53fab91f0186b6fa.tar.gz cpython-291cfa454b9c5b677c955aaf53fab91f0186b6fa.tar.bz2 |
gh-117953: Track Extra Details in Global Extensions Cache (gh-118532)
We have only been tracking each module's PyModuleDef. However, there are some problems with that. For example, in some cases we load single-phase init extension modules from def->m_base.m_init or def->m_base.m_copy, but if multiple modules share a def then we can end up with unexpected behavior.
With this change, we track the following:
* PyModuleDef (same as before)
* for some modules, its init function or a copy of its __dict__, but specific to that module
* whether it is a builtin/core module or a "dynamic" extension
* the interpreter (ID) that owns the cached __dict__ (only if cached)
This also makes it easier to remember the module's kind (e.g. single-phase init) and if loading it previously failed, which I'm doing separately.
Diffstat (limited to 'Include')
-rw-r--r-- | Include/internal/pycore_importdl.h | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/Include/internal/pycore_importdl.h b/Include/internal/pycore_importdl.h index b0af28d..e5f222b 100644 --- a/Include/internal/pycore_importdl.h +++ b/Include/internal/pycore_importdl.h @@ -22,6 +22,11 @@ typedef enum ext_module_kind { _Py_ext_module_kind_INVALID = 3, } _Py_ext_module_kind; +typedef enum ext_module_origin { + _Py_ext_module_origin_CORE = 1, + _Py_ext_module_origin_BUILTIN = 2, + _Py_ext_module_origin_DYNAMIC = 3, +} _Py_ext_module_origin; /* Input for loading an extension module. */ struct _Py_ext_module_loader_info { @@ -34,6 +39,7 @@ struct _Py_ext_module_loader_info { /* path is always a borrowed ref of name or filename, * depending on if it's builtin or not. */ PyObject *path; + _Py_ext_module_origin origin; const char *hook_prefix; const char *newcontext; }; @@ -42,7 +48,11 @@ extern void _Py_ext_module_loader_info_clear( extern int _Py_ext_module_loader_info_init( struct _Py_ext_module_loader_info *info, PyObject *name, - PyObject *filename); + PyObject *filename, + _Py_ext_module_origin origin); +extern int _Py_ext_module_loader_info_init_for_core( + struct _Py_ext_module_loader_info *p_info, + PyObject *name); extern int _Py_ext_module_loader_info_init_for_builtin( struct _Py_ext_module_loader_info *p_info, PyObject *name); |