Browse Source
bpo-32197: Try to fix a compiler error on OS X introduced in bpo-32030. (#4681)
bpo-32197: Try to fix a compiler error on OS X introduced in bpo-32030. (#4681)
* Revert "bpo-32030: _PyPathConfig_Init() sets home and program_name (#4673)" This reverts commitpull/4186/mergeaf5a895073. * Revert "bpo-32030: Fix config_get_program_name() on macOS (#4669)" This reverts commite23c06e2b0. * Revert "bpo-32030: Add Python/pathconfig.c (#4668)" This reverts commit0ea395ae96. * Revert "bpo-32030: Don't call _PyPathConfig_Fini() in Py_FinalizeEx() (#4667)" This reverts commitebac19dad6. * Revert "bpo-32030: Fix Py_GetPath(): init program_name (#4665)" This reverts commit9ac3d88827.
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 424 additions and 455 deletions
-
5Doc/c-api/init.rst
-
29Include/internal/pystate.h
-
3Include/pylifecycle.h
-
3Include/pystate.h
-
3Makefile.pre.in
-
197Modules/getpath.c
-
121Modules/main.c
-
184PC/getpathp.c
-
1PCbuild/pythoncore.vcxproj
-
3PCbuild/pythoncore.vcxproj.filters
-
266Python/pathconfig.c
-
64Python/pylifecycle.c
@ -1,266 +0,0 @@ |
|||
/* Path configuration like module_search_path (sys.path) */ |
|||
|
|||
#include "Python.h" |
|||
#include "osdefs.h" |
|||
#include "internal/pystate.h" |
|||
|
|||
#ifdef __cplusplus |
|||
extern "C" { |
|||
#endif |
|||
|
|||
|
|||
_PyPathConfig _Py_path_config = _PyPathConfig_INIT; |
|||
|
|||
|
|||
void |
|||
_PyPathConfig_Clear(_PyPathConfig *config) |
|||
{ |
|||
/* _PyMem_SetDefaultAllocator() is needed to get a known memory allocator, |
|||
since Py_SetPath(), Py_SetPythonHome() and Py_SetProgramName() can be |
|||
called before Py_Initialize() which can changes the memory allocator. */ |
|||
PyMemAllocatorEx old_alloc; |
|||
_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
|
|||
#define CLEAR(ATTR) \ |
|||
do { \ |
|||
PyMem_RawFree(ATTR); \ |
|||
ATTR = NULL; \ |
|||
} while (0) |
|||
|
|||
CLEAR(config->prefix); |
|||
CLEAR(config->program_full_path); |
|||
#ifdef MS_WINDOWS |
|||
CLEAR(config->dll_path); |
|||
#else |
|||
CLEAR(config->exec_prefix); |
|||
#endif |
|||
CLEAR(config->module_search_path); |
|||
CLEAR(config->home); |
|||
CLEAR(config->program_name); |
|||
#undef CLEAR |
|||
|
|||
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
} |
|||
|
|||
|
|||
/* Initialize paths for Py_GetPath(), Py_GetPrefix(), Py_GetExecPrefix() |
|||
and Py_GetProgramFullPath() */ |
|||
_PyInitError |
|||
_PyPathConfig_Init(const _PyMainInterpreterConfig *main_config) |
|||
{ |
|||
if (_Py_path_config.module_search_path) { |
|||
/* Already initialized */ |
|||
return _Py_INIT_OK(); |
|||
} |
|||
|
|||
_PyInitError err; |
|||
_PyPathConfig new_config = _PyPathConfig_INIT; |
|||
|
|||
PyMemAllocatorEx old_alloc; |
|||
_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
|
|||
/* Calculate program_full_path, prefix, exec_prefix (Unix) |
|||
or dll_path (Windows), and module_search_path */ |
|||
err = _PyPathConfig_Calculate(&new_config, main_config); |
|||
if (_Py_INIT_FAILED(err)) { |
|||
_PyPathConfig_Clear(&new_config); |
|||
goto done; |
|||
} |
|||
|
|||
/* Copy home and program_name from main_config */ |
|||
if (main_config->home != NULL) { |
|||
new_config.home = _PyMem_RawWcsdup(main_config->home); |
|||
if (new_config.home == NULL) { |
|||
err = _Py_INIT_NO_MEMORY(); |
|||
goto done; |
|||
} |
|||
} |
|||
else { |
|||
new_config.home = NULL; |
|||
} |
|||
|
|||
new_config.program_name = _PyMem_RawWcsdup(main_config->program_name); |
|||
if (new_config.program_name == NULL) { |
|||
err = _Py_INIT_NO_MEMORY(); |
|||
goto done; |
|||
} |
|||
|
|||
_PyPathConfig_Clear(&_Py_path_config); |
|||
_Py_path_config = new_config; |
|||
|
|||
err = _Py_INIT_OK(); |
|||
|
|||
done: |
|||
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
return err; |
|||
} |
|||
|
|||
|
|||
static void |
|||
pathconfig_global_init(void) |
|||
{ |
|||
if (_Py_path_config.module_search_path) { |
|||
/* Already initialized */ |
|||
return; |
|||
} |
|||
|
|||
_PyInitError err; |
|||
_PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT; |
|||
|
|||
err = _PyMainInterpreterConfig_ReadEnv(&config); |
|||
if (_Py_INIT_FAILED(err)) { |
|||
goto error; |
|||
} |
|||
|
|||
err = _PyMainInterpreterConfig_Read(&config); |
|||
if (_Py_INIT_FAILED(err)) { |
|||
goto error; |
|||
} |
|||
|
|||
err = _PyPathConfig_Init(&config); |
|||
if (_Py_INIT_FAILED(err)) { |
|||
goto error; |
|||
} |
|||
|
|||
_PyMainInterpreterConfig_Clear(&config); |
|||
return; |
|||
|
|||
error: |
|||
_PyMainInterpreterConfig_Clear(&config); |
|||
_Py_FatalInitError(err); |
|||
} |
|||
|
|||
|
|||
/* External interface */ |
|||
|
|||
void |
|||
Py_SetPath(const wchar_t *path) |
|||
{ |
|||
if (path == NULL) { |
|||
_PyPathConfig_Clear(&_Py_path_config); |
|||
return; |
|||
} |
|||
|
|||
PyMemAllocatorEx old_alloc; |
|||
_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
|
|||
_PyPathConfig new_config; |
|||
new_config.program_full_path = _PyMem_RawWcsdup(Py_GetProgramName()); |
|||
new_config.prefix = _PyMem_RawWcsdup(L""); |
|||
#ifdef MS_WINDOWS |
|||
new_config.dll_path = _PyMem_RawWcsdup(L""); |
|||
#else |
|||
new_config.exec_prefix = _PyMem_RawWcsdup(L""); |
|||
#endif |
|||
new_config.module_search_path = _PyMem_RawWcsdup(path); |
|||
|
|||
/* steal the home and program_name values (to leave them unchanged) */ |
|||
new_config.home = _Py_path_config.home; |
|||
_Py_path_config.home = NULL; |
|||
new_config.program_name = _Py_path_config.program_name; |
|||
_Py_path_config.program_name = NULL; |
|||
|
|||
_PyPathConfig_Clear(&_Py_path_config); |
|||
_Py_path_config = new_config; |
|||
|
|||
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
} |
|||
|
|||
|
|||
void |
|||
Py_SetPythonHome(wchar_t *home) |
|||
{ |
|||
if (home == NULL) { |
|||
return; |
|||
} |
|||
|
|||
PyMemAllocatorEx old_alloc; |
|||
_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
|
|||
PyMem_RawFree(_Py_path_config.home); |
|||
_Py_path_config.home = _PyMem_RawWcsdup(home); |
|||
|
|||
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
|
|||
if (_Py_path_config.home == NULL) { |
|||
Py_FatalError("Py_SetPythonHome() failed: out of memory"); |
|||
} |
|||
} |
|||
|
|||
|
|||
void |
|||
Py_SetProgramName(wchar_t *program_name) |
|||
{ |
|||
if (program_name == NULL || program_name[0] == L'\0') { |
|||
return; |
|||
} |
|||
|
|||
PyMemAllocatorEx old_alloc; |
|||
_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
|
|||
PyMem_RawFree(_Py_path_config.program_name); |
|||
_Py_path_config.program_name = _PyMem_RawWcsdup(program_name); |
|||
|
|||
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); |
|||
|
|||
if (_Py_path_config.program_name == NULL) { |
|||
Py_FatalError("Py_SetProgramName() failed: out of memory"); |
|||
} |
|||
} |
|||
|
|||
|
|||
wchar_t * |
|||
Py_GetPath(void) |
|||
{ |
|||
pathconfig_global_init(); |
|||
return _Py_path_config.module_search_path; |
|||
} |
|||
|
|||
|
|||
wchar_t * |
|||
Py_GetPrefix(void) |
|||
{ |
|||
pathconfig_global_init(); |
|||
return _Py_path_config.prefix; |
|||
} |
|||
|
|||
|
|||
wchar_t * |
|||
Py_GetExecPrefix(void) |
|||
{ |
|||
#ifdef MS_WINDOWS |
|||
return Py_GetPrefix(); |
|||
#else |
|||
pathconfig_global_init(); |
|||
return _Py_path_config.exec_prefix; |
|||
#endif |
|||
} |
|||
|
|||
|
|||
wchar_t * |
|||
Py_GetProgramFullPath(void) |
|||
{ |
|||
pathconfig_global_init(); |
|||
return _Py_path_config.program_full_path; |
|||
} |
|||
|
|||
|
|||
wchar_t* |
|||
Py_GetPythonHome(void) |
|||
{ |
|||
pathconfig_global_init(); |
|||
return _Py_path_config.home; |
|||
} |
|||
|
|||
|
|||
wchar_t * |
|||
Py_GetProgramName(void) |
|||
{ |
|||
pathconfig_global_init(); |
|||
return _Py_path_config.program_name; |
|||
} |
|||
|
|||
|
|||
#ifdef __cplusplus |
|||
} |
|||
#endif |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue