From e32e79f7d8216b78ac9e61bb1f2eee693108d4ee Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 23 Nov 2017 01:49:45 +0100 Subject: [PATCH] bpo-32030: Move PYTHONPATH to _PyMainInterpreterConfig (#4511) Move _PyCoreConfig.module_search_path_env to _PyMainInterpreterConfig structure. --- Include/pylifecycle.h | 2 +- Include/pystate.h | 6 +++--- Modules/getpath.c | 18 +++++++++--------- Modules/main.c | 18 +++++++++--------- PC/getpathp.c | 10 +++++----- Python/pylifecycle.c | 4 ++-- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index 2a5e73a79ca..5eaa74edab8 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -94,7 +94,7 @@ PyAPI_FUNC(wchar_t *) Py_GetPrefix(void); PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); PyAPI_FUNC(wchar_t *) Py_GetPath(void); #ifdef Py_BUILD_CORE -PyAPI_FUNC(wchar_t *) _Py_GetPathWithConfig(_PyCoreConfig *config); +PyAPI_FUNC(wchar_t *) _Py_GetPathWithConfig(_PyMainInterpreterConfig *config); #endif PyAPI_FUNC(void) Py_SetPath(const wchar_t *); #ifdef MS_WINDOWS diff --git a/Include/pystate.h b/Include/pystate.h index c5d3c3345f0..b2739f1db25 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -30,7 +30,6 @@ typedef struct { unsigned long hash_seed; int _disable_importlib; /* Needed by freeze_importlib */ const char *allocator; /* Memory allocator: _PyMem_SetupAllocators() */ - wchar_t *module_search_path_env; /* PYTHONPATH environment variable */ int dev_mode; /* -X dev */ int faulthandler; /* -X faulthandler */ int tracemalloc; /* -X tracemalloc=N */ @@ -46,7 +45,6 @@ typedef struct { .hash_seed = 0, \ ._disable_importlib = 0, \ .allocator = NULL, \ - .module_search_path_env = NULL, \ .dev_mode = 0, \ .faulthandler = 0, \ .tracemalloc = 0, \ @@ -62,11 +60,13 @@ typedef struct { */ typedef struct { int install_signal_handlers; + wchar_t *module_search_path_env; /* PYTHONPATH environment variable */ } _PyMainInterpreterConfig; #define _PyMainInterpreterConfig_INIT \ (_PyMainInterpreterConfig){\ - .install_signal_handlers = -1} + .install_signal_handlers = -1, \ + .module_search_path_env = NULL} typedef struct _is { diff --git a/Modules/getpath.c b/Modules/getpath.c index ad4a4e5e718..ead143280b7 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -456,7 +456,7 @@ search_for_exec_prefix(wchar_t *argv0_path, wchar_t *home, } static void -calculate_path(_PyCoreConfig *core_config) +calculate_path(_PyMainInterpreterConfig *config) { extern wchar_t *Py_GetProgramName(void); @@ -706,9 +706,9 @@ calculate_path(_PyCoreConfig *core_config) bufsz = 0; wchar_t *env_path = NULL; - if (core_config) { - if (core_config->module_search_path_env) { - bufsz += wcslen(core_config->module_search_path_env) + 1; + if (config) { + if (config->module_search_path_env) { + bufsz += wcslen(config->module_search_path_env) + 1; } } else { @@ -752,9 +752,9 @@ calculate_path(_PyCoreConfig *core_config) /* Run-time value of $PYTHONPATH goes first */ buf[0] = '\0'; - if (core_config) { - if (core_config->module_search_path_env) { - wcscpy(buf, core_config->module_search_path_env); + if (config) { + if (config->module_search_path_env) { + wcscpy(buf, config->module_search_path_env); wcscat(buf, delimiter); } } @@ -858,10 +858,10 @@ Py_SetPath(const wchar_t *path) } wchar_t * -_Py_GetPathWithConfig(_PyCoreConfig *core_config) +_Py_GetPathWithConfig(_PyMainInterpreterConfig *config) { if (!module_search_path) { - calculate_path(core_config); + calculate_path(config); } return module_search_path; } diff --git a/Modules/main.c b/Modules/main.c index 3bd93e37601..8390af29238 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -389,6 +389,7 @@ typedef struct { /* non-zero is stdin is a TTY or if -i option is used */ int stdin_is_interactive; _PyCoreConfig core_config; + _PyMainInterpreterConfig config; _Py_CommandLineDetails cmdline; PyObject *main_importer_path; /* non-zero if filename, command (-c) or module (-m) is set @@ -409,6 +410,7 @@ typedef struct { {.status = 0, \ .cf = {.cf_flags = 0}, \ .core_config = _PyCoreConfig_INIT, \ + .config = _PyMainInterpreterConfig_INIT, \ .main_importer_path = NULL, \ .run_code = -1, \ .program_name = NULL, \ @@ -442,7 +444,7 @@ pymain_free_impl(_PyMain *pymain) Py_CLEAR(pymain->main_importer_path); PyMem_RawFree(pymain->program_name); - PyMem_RawFree(pymain->core_config.module_search_path_env); + PyMem_RawFree(pymain->config.module_search_path_env); #ifdef __INSURE__ /* Insure++ is a memory analysis tool that aids in discovering @@ -957,20 +959,16 @@ pymain_get_program_name(_PyMain *pymain) static int pymain_init_main_interpreter(_PyMain *pymain) { - _PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT; _PyInitError err; - /* TODO: Moar config options! */ - config.install_signal_handlers = 1; - /* TODO: Print any exceptions raised by these operations */ - err = _Py_ReadMainInterpreterConfig(&config); + err = _Py_ReadMainInterpreterConfig(&pymain->config); if (_Py_INIT_FAILED(err)) { pymain->err = err; return -1; } - err = _Py_InitializeMainInterpreter(&config); + err = _Py_InitializeMainInterpreter(&pymain->config); if (_Py_INIT_FAILED(err)) { pymain->err = err; return -1; @@ -1387,7 +1385,7 @@ pymain_init_pythonpath(_PyMain *pymain) return -1; } - pymain->core_config.module_search_path_env = path2; + pymain->config.module_search_path_env = path2; #else char *path = pymain_get_env_var("PYTHONPATH"); if (!path) { @@ -1405,7 +1403,7 @@ pymain_init_pythonpath(_PyMain *pymain) } return -1; } - pymain->core_config.module_search_path_env = wpath; + pymain->config.module_search_path_env = wpath; #endif return 0; } @@ -1574,6 +1572,8 @@ pymain_init(_PyMain *pymain) } pymain->core_config._disable_importlib = 0; + /* TODO: Moar config options! */ + pymain->config.install_signal_handlers = 1; orig_argc = pymain->argc; /* For Py_GetArgcArgv() */ orig_argv = pymain->argv; diff --git a/PC/getpathp.c b/PC/getpathp.c index b182ae6a58d..1d18faed450 100644 --- a/PC/getpathp.c +++ b/PC/getpathp.c @@ -624,7 +624,7 @@ read_pth_file(const wchar_t *path, wchar_t *prefix, int *isolated, int *nosite) static void -calculate_path(_PyCoreConfig *core_config) +calculate_path(_PyMainInterpreterConfig *config) { wchar_t argv0_path[MAXPATHLEN+1]; wchar_t *buf; @@ -637,8 +637,8 @@ calculate_path(_PyCoreConfig *core_config) wchar_t *userpath = NULL; wchar_t zip_path[MAXPATHLEN+1]; - if (core_config) { - envpath = core_config->module_search_path_env; + if (config) { + envpath = config->module_search_path_env; } else if (!Py_IgnoreEnvironmentFlag) { envpath = _wgetenv(L"PYTHONPATH"); @@ -899,10 +899,10 @@ Py_SetPath(const wchar_t *path) } wchar_t * -_Py_GetPathWithConfig(_PyCoreConfig *core_config) +_Py_GetPathWithConfig(_PyMainInterpreterConfig *config) { if (!module_search_path) { - calculate_path(core_config); + calculate_path(config); } return module_search_path; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 9eeac9d33be..552501d23ca 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -843,7 +843,7 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *config) /* GetPath may initialize state that _PySys_EndInit locks in, and so has to be called first. */ /* TODO: Call Py_GetPath() in Py_ReadConfig, rather than here */ - wchar_t *sys_path = _Py_GetPathWithConfig(&interp->core_config); + wchar_t *sys_path = _Py_GetPathWithConfig(&interp->config); if (interp->core_config._disable_importlib) { /* Special mode for freeze_importlib: run with no import system @@ -1301,7 +1301,7 @@ new_interpreter(PyThreadState **tstate_p) /* XXX The following is lax in error checking */ - wchar_t *sys_path = _Py_GetPathWithConfig(&interp->core_config); + wchar_t *sys_path = _Py_GetPathWithConfig(&interp->config); PyObject *modules = PyDict_New(); if (modules == NULL) {