| 
									
										
										
										
											2019-06-19 00:48:09 +02:00
										 |  |  | #ifndef Py_LIMITED_API
 | 
					
						
							|  |  |  | #ifndef Py_INTERNAL_IMPORT_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_IMPORT_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-21 19:15:52 +02:00
										 |  |  | #ifndef Py_BUILD_CORE
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE define"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-07 14:33:40 -05:00
										 |  |  | #include "pycore_lock.h"          // PyMutex
 | 
					
						
							| 
									
										
										
										
											2023-07-28 14:39:08 -06:00
										 |  |  | #include "pycore_hashtable.h"     // _Py_hashtable_t
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-04 01:02:07 +02:00
										 |  |  | extern int _PyImport_IsInitialized(PyInterpreterState *); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 18:06:53 +02:00
										 |  |  | // Export for 'pyexpat' shared extension
 | 
					
						
							| 
									
										
										
										
											2023-07-04 01:02:07 +02:00
										 |  |  | PyAPI_FUNC(int) _PyImport_SetModule(PyObject *name, PyObject *module); | 
					
						
							| 
									
										
										
										
											2023-08-24 18:06:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-25 03:44:11 +02:00
										 |  |  | extern int _PyImport_SetModuleString(const char *name, PyObject* module); | 
					
						
							| 
									
										
										
										
											2023-07-04 01:02:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | extern void _PyImport_AcquireLock(PyInterpreterState *interp); | 
					
						
							|  |  |  | extern int _PyImport_ReleaseLock(PyInterpreterState *interp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern int _PyImport_FixupBuiltin( | 
					
						
							|  |  |  |     PyObject *mod, | 
					
						
							|  |  |  |     const char *name,            /* UTF-8 encoded string */ | 
					
						
							|  |  |  |     PyObject *modules | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | extern int _PyImport_FixupExtensionObject(PyObject*, PyObject *, | 
					
						
							|  |  |  |                                           PyObject *, PyObject *); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 18:06:53 +02:00
										 |  |  | // Export for many shared extensions, like '_json'
 | 
					
						
							| 
									
										
										
										
											2023-07-25 03:44:11 +02:00
										 |  |  | PyAPI_FUNC(PyObject*) _PyImport_GetModuleAttr(PyObject *, PyObject *); | 
					
						
							| 
									
										
										
										
											2023-08-24 18:06:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Export for many shared extensions, like '_datetime'
 | 
					
						
							| 
									
										
										
										
											2023-07-25 03:44:11 +02:00
										 |  |  | PyAPI_FUNC(PyObject*) _PyImport_GetModuleAttrString(const char *, const char *); | 
					
						
							| 
									
										
										
										
											2023-07-04 01:02:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-11 14:16:28 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct _import_runtime_state { | 
					
						
							| 
									
										
										
										
											2022-11-11 17:06:05 -07:00
										 |  |  |     /* The builtin modules (defined in config.c). */ | 
					
						
							|  |  |  |     struct _inittab *inittab; | 
					
						
							| 
									
										
										
										
											2022-11-11 14:16:28 -07:00
										 |  |  |     /* The most recent value assigned to a PyModuleDef.m_base.m_index.
 | 
					
						
							|  |  |  |        This is incremented each time PyModuleDef_Init() is called, | 
					
						
							|  |  |  |        which is just about every time an extension module is imported. | 
					
						
							|  |  |  |        See PyInterpreterState.modules_by_index for more info. */ | 
					
						
							|  |  |  |     Py_ssize_t last_module_index; | 
					
						
							| 
									
										
										
										
											2023-03-29 17:15:43 -06:00
										 |  |  |     struct { | 
					
						
							| 
									
										
										
										
											2023-07-28 14:39:08 -06:00
										 |  |  |         /* A lock to guard the cache. */ | 
					
						
							| 
									
										
										
										
											2023-12-07 14:33:40 -05:00
										 |  |  |         PyMutex mutex; | 
					
						
							| 
									
										
										
										
											2023-07-28 14:39:08 -06:00
										 |  |  |         /* The actual cache of (filename, name, PyModuleDef) for modules.
 | 
					
						
							| 
									
										
										
										
											2023-03-29 17:15:43 -06:00
										 |  |  |            Only legacy (single-phase init) extension modules are added | 
					
						
							|  |  |  |            and only if they support multiple initialization (m_size >- 0) | 
					
						
							|  |  |  |            or are imported in the main interpreter. | 
					
						
							|  |  |  |            This is initialized lazily in _PyImport_FixupExtensionObject(). | 
					
						
							|  |  |  |            Modules are added there and looked up in _imp.find_extension(). */ | 
					
						
							| 
									
										
										
										
											2023-07-28 14:39:08 -06:00
										 |  |  |         _Py_hashtable_t *hashtable; | 
					
						
							| 
									
										
										
										
											2023-03-29 17:15:43 -06:00
										 |  |  |     } extensions; | 
					
						
							| 
									
										
										
										
											2022-11-16 09:37:14 -07:00
										 |  |  |     /* Package context -- the full module name for package imports */ | 
					
						
							|  |  |  |     const char * pkgcontext; | 
					
						
							| 
									
										
										
										
											2022-11-11 14:16:28 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-15 15:32:31 -07:00
										 |  |  | struct _import_state { | 
					
						
							|  |  |  |     /* cached sys.modules dictionary */ | 
					
						
							|  |  |  |     PyObject *modules; | 
					
						
							|  |  |  |     /* This is the list of module objects for all legacy (single-phase init)
 | 
					
						
							|  |  |  |        extension modules ever loaded in this process (i.e. imported | 
					
						
							|  |  |  |        in this interpreter or in any other).  Py_None stands in for | 
					
						
							|  |  |  |        modules that haven't actually been imported in this interpreter. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        A module's index (PyModuleDef.m_base.m_index) is used to look up | 
					
						
							|  |  |  |        the corresponding module object for this interpreter, if any. | 
					
						
							|  |  |  |        (See PyState_FindModule().)  When any extension module | 
					
						
							|  |  |  |        is initialized during import, its moduledef gets initialized by | 
					
						
							|  |  |  |        PyModuleDef_Init(), and the first time that happens for each | 
					
						
							|  |  |  |        PyModuleDef, its index gets set to the current value of | 
					
						
							|  |  |  |        a global counter (see _PyRuntimeState.imports.last_module_index). | 
					
						
							|  |  |  |        The entry for that index in this interpreter remains unset until | 
					
						
							|  |  |  |        the module is actually imported here.  (Py_None is used as | 
					
						
							|  |  |  |        a placeholder.)  Note that multi-phase init modules always get | 
					
						
							|  |  |  |        an index for which there will never be a module set. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        This is initialized lazily in PyState_AddModule(), which is also | 
					
						
							|  |  |  |        where modules get added. */ | 
					
						
							|  |  |  |     PyObject *modules_by_index; | 
					
						
							|  |  |  |     /* importlib module._bootstrap */ | 
					
						
							|  |  |  |     PyObject *importlib; | 
					
						
							|  |  |  |     /* override for config->use_frozen_modules (for tests)
 | 
					
						
							|  |  |  |        (-1: "off", 1: "on", 0: no override) */ | 
					
						
							|  |  |  |     int override_frozen_modules; | 
					
						
							| 
									
										
										
										
											2023-02-15 18:16:00 -07:00
										 |  |  |     int override_multi_interp_extensions_check; | 
					
						
							| 
									
										
										
										
											2023-02-15 15:32:31 -07:00
										 |  |  | #ifdef HAVE_DLOPEN
 | 
					
						
							|  |  |  |     int dlopenflags; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     PyObject *import_func; | 
					
						
							| 
									
										
										
										
											2023-03-09 09:46:21 -07:00
										 |  |  |     /* The global import lock. */ | 
					
						
							|  |  |  |     struct { | 
					
						
							|  |  |  |         PyThread_type_lock mutex; | 
					
						
							|  |  |  |         unsigned long thread; | 
					
						
							|  |  |  |         int level; | 
					
						
							|  |  |  |     } lock; | 
					
						
							|  |  |  |     /* diagnostic info in PyImport_ImportModuleLevelObject() */ | 
					
						
							|  |  |  |     struct { | 
					
						
							|  |  |  |         int import_level; | 
					
						
							| 
									
										
										
										
											2024-02-20 16:02:27 +01:00
										 |  |  |         PyTime_t accumulated; | 
					
						
							| 
									
										
										
										
											2023-03-09 09:46:21 -07:00
										 |  |  |         int header; | 
					
						
							|  |  |  |     } find_and_load; | 
					
						
							| 
									
										
										
										
											2023-02-15 15:32:31 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef HAVE_DLOPEN
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:05:59 +02:00
										 |  |  | #  include <dlfcn.h>              // RTLD_NOW, RTLD_LAZY
 | 
					
						
							| 
									
										
										
										
											2023-02-15 15:32:31 -07:00
										 |  |  | #  if HAVE_DECL_RTLD_NOW
 | 
					
						
							|  |  |  | #    define _Py_DLOPEN_FLAGS RTLD_NOW
 | 
					
						
							|  |  |  | #  else
 | 
					
						
							|  |  |  | #    define _Py_DLOPEN_FLAGS RTLD_LAZY
 | 
					
						
							|  |  |  | #  endif
 | 
					
						
							|  |  |  | #  define DLOPENFLAGS_INIT .dlopenflags = _Py_DLOPEN_FLAGS,
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #  define _Py_DLOPEN_FLAGS 0
 | 
					
						
							|  |  |  | #  define DLOPENFLAGS_INIT
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define IMPORTS_INIT \
 | 
					
						
							|  |  |  |     { \ | 
					
						
							|  |  |  |         DLOPENFLAGS_INIT \ | 
					
						
							| 
									
										
										
										
											2023-03-09 09:46:21 -07:00
										 |  |  |         .lock = { \ | 
					
						
							|  |  |  |             .mutex = NULL, \ | 
					
						
							|  |  |  |             .thread = PYTHREAD_INVALID_THREAD_ID, \ | 
					
						
							|  |  |  |             .level = 0, \ | 
					
						
							|  |  |  |         }, \ | 
					
						
							|  |  |  |         .find_and_load = { \ | 
					
						
							|  |  |  |             .header = 1, \ | 
					
						
							|  |  |  |         }, \ | 
					
						
							| 
									
										
										
										
											2023-02-15 15:32:31 -07:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern void _PyImport_ClearCore(PyInterpreterState *interp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern Py_ssize_t _PyImport_GetNextModuleIndex(void); | 
					
						
							|  |  |  | extern const char * _PyImport_ResolveNameWithPackageContext(const char *name); | 
					
						
							|  |  |  | extern const char * _PyImport_SwapPackageContext(const char *newcontext); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern int _PyImport_GetDLOpenFlags(PyInterpreterState *interp); | 
					
						
							|  |  |  | extern void _PyImport_SetDLOpenFlags(PyInterpreterState *interp, int new_val); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern PyObject * _PyImport_InitModules(PyInterpreterState *interp); | 
					
						
							|  |  |  | extern PyObject * _PyImport_GetModules(PyInterpreterState *interp); | 
					
						
							|  |  |  | extern void _PyImport_ClearModules(PyInterpreterState *interp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern void _PyImport_ClearModulesByIndex(PyInterpreterState *interp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern int _PyImport_InitDefaultImportFunc(PyInterpreterState *interp); | 
					
						
							|  |  |  | extern int _PyImport_IsDefaultImportFunc( | 
					
						
							|  |  |  |         PyInterpreterState *interp, | 
					
						
							|  |  |  |         PyObject *func); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern PyObject * _PyImport_GetImportlibLoader( | 
					
						
							|  |  |  |         PyInterpreterState *interp, | 
					
						
							|  |  |  |         const char *loader_name); | 
					
						
							|  |  |  | extern PyObject * _PyImport_GetImportlibExternalLoader( | 
					
						
							|  |  |  |         PyInterpreterState *interp, | 
					
						
							|  |  |  |         const char *loader_name); | 
					
						
							|  |  |  | extern PyObject * _PyImport_BlessMyLoader( | 
					
						
							|  |  |  |         PyInterpreterState *interp, | 
					
						
							|  |  |  |         PyObject *module_globals); | 
					
						
							|  |  |  | extern PyObject * _PyImport_ImportlibModuleRepr( | 
					
						
							|  |  |  |         PyInterpreterState *interp, | 
					
						
							|  |  |  |         PyObject *module); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern PyStatus _PyImport_Init(void); | 
					
						
							|  |  |  | extern void _PyImport_Fini(void); | 
					
						
							|  |  |  | extern void _PyImport_Fini2(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern PyStatus _PyImport_InitCore( | 
					
						
							|  |  |  |         PyThreadState *tstate, | 
					
						
							|  |  |  |         PyObject *sysmod, | 
					
						
							|  |  |  |         int importlib); | 
					
						
							|  |  |  | extern PyStatus _PyImport_InitExternal(PyThreadState *tstate); | 
					
						
							|  |  |  | extern void _PyImport_FiniCore(PyInterpreterState *interp); | 
					
						
							|  |  |  | extern void _PyImport_FiniExternal(PyInterpreterState *interp); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-11 14:16:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-15 01:16:24 +09:00
										 |  |  | #ifdef HAVE_FORK
 | 
					
						
							| 
									
										
										
										
											2023-03-09 09:46:21 -07:00
										 |  |  | extern PyStatus _PyImport_ReInitLock(PyInterpreterState *interp); | 
					
						
							| 
									
										
										
										
											2020-04-15 01:16:24 +09:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2023-02-15 15:32:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern PyObject* _PyImport_GetBuiltinModuleNames(void); | 
					
						
							| 
									
										
										
										
											2019-06-19 00:48:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 11:26:37 -06:00
										 |  |  | struct _module_alias { | 
					
						
							|  |  |  |     const char *name;                 /* ASCII encoded string */ | 
					
						
							|  |  |  |     const char *orig;                 /* ASCII encoded string */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 18:06:53 +02:00
										 |  |  | // Export these 3 symbols for test_ctypes
 | 
					
						
							| 
									
										
										
										
											2023-07-25 05:48:04 +02:00
										 |  |  | PyAPI_DATA(const struct _frozen*) _PyImport_FrozenBootstrap; | 
					
						
							|  |  |  | PyAPI_DATA(const struct _frozen*) _PyImport_FrozenStdlib; | 
					
						
							|  |  |  | PyAPI_DATA(const struct _frozen*) _PyImport_FrozenTest; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 11:26:37 -06:00
										 |  |  | extern const struct _module_alias * _PyImport_FrozenAliases; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-25 03:44:11 +02:00
										 |  |  | extern int _PyImport_CheckSubinterpIncompatibleExtensionAllowed( | 
					
						
							| 
									
										
										
										
											2023-02-15 18:16:00 -07:00
										 |  |  |     const char *name); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-25 03:44:11 +02:00
										 |  |  | // Export for '_testinternalcapi' shared extension
 | 
					
						
							| 
									
										
										
										
											2023-07-25 05:48:04 +02:00
										 |  |  | PyAPI_FUNC(int) _PyImport_ClearExtension(PyObject *name, PyObject *filename); | 
					
						
							| 
									
										
										
										
											2023-02-15 16:05:07 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-19 00:48:09 +02:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_INTERNAL_IMPORT_H */
 | 
					
						
							|  |  |  | #endif /* !Py_LIMITED_API */
 |