diff options
Diffstat (limited to 'Python')
-rw-r--r-- | Python/pathconfig.c | 22 | ||||
-rw-r--r-- | Python/pylifecycle.c | 42 |
2 files changed, 34 insertions, 30 deletions
diff --git a/Python/pathconfig.c b/Python/pathconfig.c index b17ae822a7..748084ba44 100644 --- a/Python/pathconfig.c +++ b/Python/pathconfig.c @@ -46,7 +46,7 @@ _PyPathConfig_Clear(_PyPathConfig *config) /* Initialize paths for Py_GetPath(), Py_GetPrefix(), Py_GetExecPrefix() and Py_GetProgramFullPath() */ _PyInitError -_PyPathConfig_Init(const _PyMainInterpreterConfig *main_config) +_PyPathConfig_Init(const _PyCoreConfig *core_config) { if (_Py_path_config.module_search_path) { /* Already initialized */ @@ -61,15 +61,15 @@ _PyPathConfig_Init(const _PyMainInterpreterConfig *main_config) /* Calculate program_full_path, prefix, exec_prefix (Unix) or dll_path (Windows), and module_search_path */ - err = _PyPathConfig_Calculate(&new_config, main_config); + err = _PyPathConfig_Calculate(&new_config, core_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); + /* Copy home and program_name from core_config */ + if (core_config->home != NULL) { + new_config.home = _PyMem_RawWcsdup(core_config->home); if (new_config.home == NULL) { err = _Py_INIT_NO_MEMORY(); goto done; @@ -79,7 +79,7 @@ _PyPathConfig_Init(const _PyMainInterpreterConfig *main_config) new_config.home = NULL; } - new_config.program_name = _PyMem_RawWcsdup(main_config->program_name); + new_config.program_name = _PyMem_RawWcsdup(core_config->program_name); if (new_config.program_name == NULL) { err = _Py_INIT_NO_MEMORY(); goto done; @@ -105,14 +105,14 @@ pathconfig_global_init(void) } _PyInitError err; - _PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT; + _PyCoreConfig config = _PyCoreConfig_INIT; - err = _PyMainInterpreterConfig_ReadEnv(&config); + err = _PyCoreConfig_ReadEnv(&config); if (_Py_INIT_FAILED(err)) { goto error; } - err = _PyMainInterpreterConfig_Read(&config); + err = _PyCoreConfig_Read(&config); if (_Py_INIT_FAILED(err)) { goto error; } @@ -122,11 +122,11 @@ pathconfig_global_init(void) goto error; } - _PyMainInterpreterConfig_Clear(&config); + _PyCoreConfig_Clear(&config); return; error: - _PyMainInterpreterConfig_Clear(&config); + _PyCoreConfig_Clear(&config); _Py_FatalInitError(err); } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 2bac23d1cb..31965f503c 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -792,13 +792,8 @@ _Py_InitializeCore(const _PyCoreConfig *config) */ _PyInitError -_PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *config) +_PyCoreConfig_Read(_PyCoreConfig *config) { - /* Signal handlers are installed by default */ - if (config->install_signal_handlers < 0) { - config->install_signal_handlers = 1; - } - if (config->program_name == NULL) { #ifdef MS_WINDOWS const wchar_t *program_name = L"python"; @@ -814,9 +809,8 @@ _PyMainInterpreterConfig_Read(_PyMainInterpreterConfig *config) return _Py_INIT_OK(); } - void -_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config) +_PyCoreConfig_Clear(_PyCoreConfig *config) { #define CLEAR(ATTR) \ do { \ @@ -831,6 +825,14 @@ _PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config) } +void +_PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *config) +{ + Py_CLEAR(config->argv); + Py_CLEAR(config->module_search_path); +} + + /* Update interpreter state based on supplied configuration settings * * After calling this function, most of the restrictions on the interpreter @@ -881,16 +883,11 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *config) return _Py_INIT_ERR("can't initialize time"); } - /* GetPath may initialize state that _PySys_EndInit locks - in, and so has to be called first. */ - err = _PyPathConfig_Init(&interp->config); - if (_Py_INIT_FAILED(err)) { - return err; + assert(interp->config.module_search_path != NULL); + if (PySys_SetObject("path", interp->config.module_search_path) != 0) { + return _Py_INIT_ERR("can't assign sys.path"); } - wchar_t *sys_path = Py_GetPath(); - /* Finish setting up the sys module and import system */ - PySys_SetPath(sys_path); if (_PySys_EndInit(interp->sysdict) < 0) return _Py_INIT_ERR("can't finish initializing sys"); @@ -949,6 +946,12 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *config) } } + if (interp->config.argv != NULL) { + if (PySys_SetObject("argv", interp->config.argv) != 0) { + return _Py_INIT_ERR("can't assign sys.argv"); + } + } + return _Py_INIT_OK(); } @@ -970,12 +973,12 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib) goto done; } - err = _PyMainInterpreterConfig_ReadEnv(&config); + err = _PyCoreConfig_ReadEnv(&core_config); if (_Py_INIT_FAILED(err)) { goto done; } - err = _PyMainInterpreterConfig_Read(&config); + err = _PyMainInterpreterConfig_Read(&config, &core_config); if (_Py_INIT_FAILED(err)) { goto done; } @@ -988,6 +991,7 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib) err = _Py_INIT_OK(); done: + _PyCoreConfig_Clear(&core_config); _PyMainInterpreterConfig_Clear(&config); return err; } @@ -1342,7 +1346,7 @@ new_interpreter(PyThreadState **tstate_p) interp->config = main_interp->config; } - err = _PyPathConfig_Init(&interp->config); + err = _PyPathConfig_Init(&interp->core_config); if (_Py_INIT_FAILED(err)) { return err; } |