summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2024-05-04 21:24:02 (GMT)
committerGitHub <noreply@github.com>2024-05-04 21:24:02 (GMT)
commit291cfa454b9c5b677c955aaf53fab91f0186b6fa (patch)
tree0a0976010c9f0bd5fb77f80e00f44fa726d7c665 /Include
parent978fba58aef347de4a1376e525df2dacc7b2fff3 (diff)
downloadcpython-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.h12
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);