mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 44f57a952e
			
		
	
	
		44f57a952e
		
			
		
	
	
	
	
		
			
			Basically, I've turned most of _PyImport_LoadDynamicModuleWithSpec() into two new functions (_PyImport_GetModInitFunc() and _PyImport_RunModInitFunc()) and moved the rest of it out into _imp_create_dynamic_impl(). There shouldn't be any changes in behavior. This change makes some future changes simpler. This is particularly relevant to potentially calling each module init function in the main interpreter first. Thus the critical part of the PR is the addition of _PyImport_RunModInitFunc(), which is strictly focused on running the init func and validating the result. A later PR will take it a step farther by capturing error information rather than raising exceptions. FWIW, this change also helps readers by clarifying a bit more about what happens when an extension/builtin module is imported.
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef Py_INTERNAL_IMPORTDL_H
 | |
| #define Py_INTERNAL_IMPORTDL_H
 | |
| 
 | |
| #include "patchlevel.h"           // PY_MAJOR_VERSION
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #ifndef Py_BUILD_CORE
 | |
| #  error "this header requires Py_BUILD_CORE define"
 | |
| #endif
 | |
| 
 | |
| 
 | |
| extern const char *_PyImport_DynLoadFiletab[];
 | |
| 
 | |
| 
 | |
| typedef PyObject *(*PyModInitFunction)(void);
 | |
| 
 | |
| struct _Py_ext_module_loader_info {
 | |
|     PyObject *filename;
 | |
| #ifndef MS_WINDOWS
 | |
|     PyObject *filename_encoded;
 | |
| #endif
 | |
|     PyObject *name;
 | |
|     PyObject *name_encoded;
 | |
|     /* path is always a borrowed ref of name or filename,
 | |
|      * depending on if it's builtin or not. */
 | |
|     PyObject *path;
 | |
|     const char *hook_prefix;
 | |
|     const char *newcontext;
 | |
| };
 | |
| extern void _Py_ext_module_loader_info_clear(
 | |
|     struct _Py_ext_module_loader_info *info);
 | |
| extern int _Py_ext_module_loader_info_init(
 | |
|     struct _Py_ext_module_loader_info *info,
 | |
|     PyObject *name,
 | |
|     PyObject *filename);
 | |
| extern int _Py_ext_module_loader_info_init_from_spec(
 | |
|     struct _Py_ext_module_loader_info *info,
 | |
|     PyObject *spec);
 | |
| 
 | |
| struct _Py_ext_module_loader_result {
 | |
|     PyModuleDef *def;
 | |
|     PyObject *module;
 | |
| };
 | |
| extern PyModInitFunction _PyImport_GetModInitFunc(
 | |
|     struct _Py_ext_module_loader_info *info,
 | |
|     FILE *fp);
 | |
| extern int _PyImport_RunModInitFunc(
 | |
|     PyModInitFunction p0,
 | |
|     struct _Py_ext_module_loader_info *info,
 | |
|     struct _Py_ext_module_loader_result *p_res);
 | |
| 
 | |
| 
 | |
| /* Max length of module suffix searched for -- accommodates "module.slb" */
 | |
| #define MAXSUFFIXSIZE 12
 | |
| 
 | |
| #ifdef MS_WINDOWS
 | |
| #include <windows.h>
 | |
| typedef FARPROC dl_funcptr;
 | |
| 
 | |
| #ifdef _DEBUG
 | |
| #  define PYD_DEBUG_SUFFIX "_d"
 | |
| #else
 | |
| #  define PYD_DEBUG_SUFFIX ""
 | |
| #endif
 | |
| 
 | |
| #ifdef Py_GIL_DISABLED
 | |
| #  define PYD_THREADING_TAG "t"
 | |
| #else
 | |
| #  define PYD_THREADING_TAG ""
 | |
| #endif
 | |
| 
 | |
| #ifdef PYD_PLATFORM_TAG
 | |
| #  define PYD_SOABI "cp" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) PYD_THREADING_TAG "-" PYD_PLATFORM_TAG
 | |
| #else
 | |
| #  define PYD_SOABI "cp" Py_STRINGIFY(PY_MAJOR_VERSION) Py_STRINGIFY(PY_MINOR_VERSION) PYD_THREADING_TAG
 | |
| #endif
 | |
| 
 | |
| #define PYD_TAGGED_SUFFIX PYD_DEBUG_SUFFIX "." PYD_SOABI ".pyd"
 | |
| #define PYD_UNTAGGED_SUFFIX PYD_DEBUG_SUFFIX ".pyd"
 | |
| 
 | |
| #else
 | |
| typedef void (*dl_funcptr)(void);
 | |
| #endif
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| #endif /* !Py_INTERNAL_IMPORTDL_H */
 |