Commit 022be02d authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-36763: Add _PyPreConfig._config_init (GH-13481)

* _PyPreConfig_GetGlobalConfig() and  _PyCoreConfig_GetGlobalConfig()
  now do nothing if the configuration was not initialized with
  _PyPreConfig_InitCompatConfig() and _PyCoreConfig_InitCompatConfig()
* Remove utf8_mode=-2 special case: use utf8_mode=-1 instead.
* Fix _PyPreConfig_InitPythonConfig():

  * isolated = 0 instead of -1
  * use_environment = 1 instead of -1

* Rename _PyConfig_INIT to  _PyConfig_INIT_COMPAT
* Rename _PyPreConfig_Init() to _PyPreConfig_InitCompatConfig()
* Rename _PyCoreConfig_Init() to _PyCoreConfig_InitCompatConfig()
* PyInterpreterState_New() now uses _PyCoreConfig_InitPythonConfig()
  as default configuration, but it's very quickly overriden anyway.
* _freeze_importlib.c uses _PyCoreConfig_SetString() to set
  program_name.
* Cleanup preconfig_init_utf8_mode(): cmdline is always non-NULL.
parent e4d300e0
...@@ -40,9 +40,18 @@ typedef struct { ...@@ -40,9 +40,18 @@ typedef struct {
#define _Py_CONFIG_VERSION 1 #define _Py_CONFIG_VERSION 1
typedef enum {
/* Py_Initialize() API: backward compatibility with Python 3.6 and 3.7 */
_PyConfig_INIT_COMPAT = 1,
_PyConfig_INIT_PYTHON = 2,
_PyConfig_INIT_ISOLATED = 3
} _PyConfigInitEnum;
typedef struct { typedef struct {
int _config_version; /* Internal configuration version, int _config_version; /* Internal configuration version,
used for ABI compatibility */ used for ABI compatibility */
int _config_init; /* _PyConfigInitEnum value */
/* Parse _Py_PreInitializeFromArgs() arguments? /* Parse _Py_PreInitializeFromArgs() arguments?
See _PyCoreConfig.parse_argv */ See _PyCoreConfig.parse_argv */
...@@ -107,10 +116,7 @@ typedef struct { ...@@ -107,10 +116,7 @@ typedef struct {
Set to 0 by "-X utf8=0" and PYTHONUTF8=0. Set to 0 by "-X utf8=0" and PYTHONUTF8=0.
If equals to -1, it is set to 1 if the LC_CTYPE locale is "C" or If equals to -1, it is set to 1 if the LC_CTYPE locale is "C" or
"POSIX", otherwise it is set to 0. "POSIX", otherwise it is set to 0. Inherit Py_UTF8Mode value value. */
If equals to -2, inherit Py_UTF8Mode value value (which is equal to 0
by default). */
int utf8_mode; int utf8_mode;
int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */ int dev_mode; /* Development mode. PYTHONDEVMODE, -X dev */
...@@ -126,16 +132,10 @@ PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config); ...@@ -126,16 +132,10 @@ PyAPI_FUNC(void) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config);
/* --- _PyCoreConfig ---------------------------------------------- */ /* --- _PyCoreConfig ---------------------------------------------- */
typedef enum {
_PyCoreConfig_INIT = 0,
_PyCoreConfig_INIT_PYTHON = 1,
_PyCoreConfig_INIT_ISOLATED = 2
} _PyCoreConfigInitEnum;
typedef struct { typedef struct {
int _config_version; /* Internal configuration version, int _config_version; /* Internal configuration version,
used for ABI compatibility */ used for ABI compatibility */
int _config_init; /* _PyCoreConfigInitEnum value */ int _config_init; /* _PyConfigInitEnum value */
int isolated; /* Isolated mode? see _PyPreConfig.isolated */ int isolated; /* Isolated mode? see _PyPreConfig.isolated */
int use_environment; /* Use environment variables? see _PyPreConfig.use_environment */ int use_environment; /* Use environment variables? see _PyPreConfig.use_environment */
......
...@@ -120,7 +120,7 @@ PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline, ...@@ -120,7 +120,7 @@ PyAPI_FUNC(_PyInitError) _PyPreCmdline_Read(_PyPreCmdline *cmdline,
/* --- _PyPreConfig ----------------------------------------------- */ /* --- _PyPreConfig ----------------------------------------------- */
PyAPI_FUNC(void) _PyPreConfig_Init(_PyPreConfig *config); PyAPI_FUNC(void) _PyPreConfig_InitCompatConfig(_PyPreConfig *config);
PyAPI_FUNC(void) _PyPreConfig_InitFromCoreConfig( PyAPI_FUNC(void) _PyPreConfig_InitFromCoreConfig(
_PyPreConfig *config, _PyPreConfig *config,
const _PyCoreConfig *coreconfig); const _PyCoreConfig *coreconfig);
...@@ -139,7 +139,7 @@ PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(const _PyPreConfig *config); ...@@ -139,7 +139,7 @@ PyAPI_FUNC(_PyInitError) _PyPreConfig_Write(const _PyPreConfig *config);
/* --- _PyCoreConfig ---------------------------------------------- */ /* --- _PyCoreConfig ---------------------------------------------- */
PyAPI_FUNC(void) _PyCoreConfig_Init(_PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_InitCompatConfig(_PyCoreConfig *config);
PyAPI_FUNC(_PyInitError) _PyCoreConfig_Copy( PyAPI_FUNC(_PyInitError) _PyCoreConfig_Copy(
_PyCoreConfig *config, _PyCoreConfig *config,
const _PyCoreConfig *config2); const _PyCoreConfig *config2);
......
This diff is collapsed.
...@@ -76,18 +76,30 @@ main(int argc, char *argv[]) ...@@ -76,18 +76,30 @@ main(int argc, char *argv[])
} }
text[text_size] = '\0'; text[text_size] = '\0';
_PyInitError err;
_PyCoreConfig config; _PyCoreConfig config;
_PyCoreConfig_InitIsolatedConfig(&config);
err = _PyCoreConfig_InitIsolatedConfig(&config);
if (_PyInitError_Failed(err)) {
_PyCoreConfig_Clear(&config);
_Py_ExitInitError(err);
}
config.site_import = 0; config.site_import = 0;
config.program_name = L"./_freeze_importlib";
err = _PyCoreConfig_SetString(&config, &config.program_name,
L"./_freeze_importlib");
if (_PyInitError_Failed(err)) {
_PyCoreConfig_Clear(&config);
_Py_ExitInitError(err);
}
/* Don't install importlib, since it could execute outdated bytecode. */ /* Don't install importlib, since it could execute outdated bytecode. */
config._install_importlib = 0; config._install_importlib = 0;
config._init_main = 0; config._init_main = 0;
_PyInitError err = _Py_InitializeFromConfig(&config); err = _Py_InitializeFromConfig(&config);
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any _PyCoreConfig_Clear(&config);
memory: program_name is a constant string. */
if (_PyInitError_Failed(err)) { if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err); _Py_ExitInitError(err);
} }
......
...@@ -317,7 +317,7 @@ dump_config(void) ...@@ -317,7 +317,7 @@ dump_config(void)
} }
static int test_init_default_config(void) static int test_init_initialize_config(void)
{ {
_testembed_Py_Initialize(); _testembed_Py_Initialize();
dump_config(); dump_config();
...@@ -326,6 +326,47 @@ static int test_init_default_config(void) ...@@ -326,6 +326,47 @@ static int test_init_default_config(void)
} }
static int check_init_compat_config(int preinit)
{
_PyInitError err;
if (preinit) {
_PyPreConfig preconfig;
_PyPreConfig_InitCompatConfig(&preconfig);
err = _Py_PreInitialize(&preconfig);
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
}
_PyCoreConfig config;
_PyCoreConfig_InitCompatConfig(&config);
config.program_name = L"./_testembed";
err = _Py_InitializeFromConfig(&config);
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}
dump_config();
Py_Finalize();
return 0;
}
static int test_preinit_compat_config(void)
{
return check_init_compat_config(1);
}
static int test_init_compat_config(void)
{
return check_init_compat_config(0);
}
static int test_init_global_config(void) static int test_init_global_config(void)
{ {
/* FIXME: test Py_IgnoreEnvironmentFlag */ /* FIXME: test Py_IgnoreEnvironmentFlag */
...@@ -380,7 +421,7 @@ static int test_init_from_config(void) ...@@ -380,7 +421,7 @@ static int test_init_from_config(void)
_PyInitError err; _PyInitError err;
_PyPreConfig preconfig; _PyPreConfig preconfig;
_PyPreConfig_Init(&preconfig); _PyPreConfig_InitCompatConfig(&preconfig);
putenv("PYTHONMALLOC=malloc_debug"); putenv("PYTHONMALLOC=malloc_debug");
preconfig.allocator = PYMEM_ALLOCATOR_MALLOC; preconfig.allocator = PYMEM_ALLOCATOR_MALLOC;
...@@ -396,7 +437,7 @@ static int test_init_from_config(void) ...@@ -396,7 +437,7 @@ static int test_init_from_config(void)
/* Test _Py_InitializeFromConfig() */ /* Test _Py_InitializeFromConfig() */
_PyCoreConfig config; _PyCoreConfig config;
_PyCoreConfig_Init(&config); _PyCoreConfig_InitCompatConfig(&config);
config.install_signal_handlers = 0; config.install_signal_handlers = 0;
/* FIXME: test use_environment */ /* FIXME: test use_environment */
...@@ -676,7 +717,7 @@ static int test_preinit_isolated1(void) ...@@ -676,7 +717,7 @@ static int test_preinit_isolated1(void)
_PyInitError err; _PyInitError err;
_PyPreConfig preconfig; _PyPreConfig preconfig;
_PyPreConfig_Init(&preconfig); _PyPreConfig_InitCompatConfig(&preconfig);
preconfig.isolated = 1; preconfig.isolated = 1;
err = _Py_PreInitialize(&preconfig); err = _Py_PreInitialize(&preconfig);
...@@ -685,7 +726,7 @@ static int test_preinit_isolated1(void) ...@@ -685,7 +726,7 @@ static int test_preinit_isolated1(void)
} }
_PyCoreConfig config; _PyCoreConfig config;
_PyCoreConfig_Init(&config); _PyCoreConfig_InitCompatConfig(&config);
config.program_name = L"./_testembed"; config.program_name = L"./_testembed";
set_all_env_vars(); set_all_env_vars();
...@@ -705,7 +746,7 @@ static int test_preinit_isolated2(void) ...@@ -705,7 +746,7 @@ static int test_preinit_isolated2(void)
_PyInitError err; _PyInitError err;
_PyPreConfig preconfig; _PyPreConfig preconfig;
_PyPreConfig_Init(&preconfig); _PyPreConfig_InitCompatConfig(&preconfig);
preconfig.isolated = 0; preconfig.isolated = 0;
err = _Py_PreInitialize(&preconfig); err = _Py_PreInitialize(&preconfig);
...@@ -715,7 +756,7 @@ static int test_preinit_isolated2(void) ...@@ -715,7 +756,7 @@ static int test_preinit_isolated2(void)
/* Test _PyCoreConfig.isolated=1 */ /* Test _PyCoreConfig.isolated=1 */
_PyCoreConfig config; _PyCoreConfig config;
_PyCoreConfig_Init(&config); _PyCoreConfig_InitCompatConfig(&config);
Py_IsolatedFlag = 0; Py_IsolatedFlag = 0;
config.isolated = 1; config.isolated = 1;
...@@ -885,12 +926,14 @@ static int check_preinit_isolated_config(int preinit) ...@@ -885,12 +926,14 @@ static int check_preinit_isolated_config(int preinit)
_PyCoreConfig config; _PyCoreConfig config;
err = _PyCoreConfig_InitIsolatedConfig(&config); err = _PyCoreConfig_InitIsolatedConfig(&config);
if (_PyInitError_Failed(err)) { if (_PyInitError_Failed(err)) {
_PyCoreConfig_Clear(&config);
_Py_ExitInitError(err); _Py_ExitInitError(err);
} }
config.program_name = L"./_testembed"; config.program_name = L"./_testembed";
err = _Py_InitializeFromConfig(&config); err = _Py_InitializeFromConfig(&config);
if (_PyInitError_Failed(err)) { if (_PyInitError_Failed(err)) {
_PyCoreConfig_Clear(&config);
_Py_ExitInitError(err); _Py_ExitInitError(err);
} }
...@@ -1207,7 +1250,9 @@ static struct TestCase TestCases[] = { ...@@ -1207,7 +1250,9 @@ static struct TestCase TestCases[] = {
{ "bpo20891", test_bpo20891 }, { "bpo20891", test_bpo20891 },
{ "initialize_twice", test_initialize_twice }, { "initialize_twice", test_initialize_twice },
{ "initialize_pymain", test_initialize_pymain }, { "initialize_pymain", test_initialize_pymain },
{ "init_default_config", test_init_default_config }, { "init_initialize_config", test_init_initialize_config },
{ "preinit_compat_config", test_preinit_compat_config },
{ "init_compat_config", test_init_compat_config },
{ "init_global_config", test_init_global_config }, { "init_global_config", test_init_global_config },
{ "init_from_config", test_init_from_config }, { "init_from_config", test_init_from_config },
{ "init_parse_argv", test_init_parse_argv }, { "init_parse_argv", test_init_parse_argv },
......
...@@ -109,7 +109,7 @@ static const char usage_6[] = ...@@ -109,7 +109,7 @@ static const char usage_6[] =
/* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change /* UTF-8 mode (PEP 540): if equals to 1, use the UTF-8 encoding, and change
stdin and stdout error handler to "surrogateescape". It is equal to stdin and stdout error handler to "surrogateescape". It is equal to
-1 by default: unknown, will be set by Py_Main() */ -1 by default: unknown, will be set by Py_Main() */
int Py_UTF8Mode = 0; int Py_UTF8Mode = -1;
int Py_DebugFlag = 0; /* Needed by parser.c */ int Py_DebugFlag = 0; /* Needed by parser.c */
int Py_VerboseFlag = 0; /* Needed by import.c */ int Py_VerboseFlag = 0; /* Needed by import.c */
int Py_QuietFlag = 0; /* Needed by sysmodule.c */ int Py_QuietFlag = 0; /* Needed by sysmodule.c */
...@@ -546,12 +546,12 @@ _PyCoreConfig_Clear(_PyCoreConfig *config) ...@@ -546,12 +546,12 @@ _PyCoreConfig_Clear(_PyCoreConfig *config)
void void
_PyCoreConfig_Init(_PyCoreConfig *config) _PyCoreConfig_InitCompatConfig(_PyCoreConfig *config)
{ {
memset(config, 0, sizeof(*config)); memset(config, 0, sizeof(*config));
config->_config_version = _Py_CONFIG_VERSION; config->_config_version = _Py_CONFIG_VERSION;
config->_config_init = (int)_PyCoreConfig_INIT; config->_config_init = (int)_PyConfig_INIT_COMPAT;
config->isolated = -1; config->isolated = -1;
config->use_environment = -1; config->use_environment = -1;
config->dev_mode = -1; config->dev_mode = -1;
...@@ -586,7 +586,7 @@ _PyCoreConfig_Init(_PyCoreConfig *config) ...@@ -586,7 +586,7 @@ _PyCoreConfig_Init(_PyCoreConfig *config)
static void static void
_PyCoreConfig_InitDefaults(_PyCoreConfig *config) _PyCoreConfig_InitDefaults(_PyCoreConfig *config)
{ {
_PyCoreConfig_Init(config); _PyCoreConfig_InitCompatConfig(config);
config->isolated = 0; config->isolated = 0;
config->use_environment = 1; config->use_environment = 1;
...@@ -613,7 +613,7 @@ _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config) ...@@ -613,7 +613,7 @@ _PyCoreConfig_InitPythonConfig(_PyCoreConfig *config)
{ {
_PyCoreConfig_InitDefaults(config); _PyCoreConfig_InitDefaults(config);
config->_config_init = (int)_PyCoreConfig_INIT_PYTHON; config->_config_init = (int)_PyConfig_INIT_PYTHON;
config->configure_c_stdio = 1; config->configure_c_stdio = 1;
config->parse_argv = 1; config->parse_argv = 1;
...@@ -626,7 +626,7 @@ _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config) ...@@ -626,7 +626,7 @@ _PyCoreConfig_InitIsolatedConfig(_PyCoreConfig *config)
{ {
_PyCoreConfig_InitDefaults(config); _PyCoreConfig_InitDefaults(config);
config->_config_init = (int)_PyCoreConfig_INIT_ISOLATED; config->_config_init = (int)_PyConfig_INIT_ISOLATED;
config->isolated = 1; config->isolated = 1;
config->use_environment = 0; config->use_environment = 0;
config->user_site_directory = 0; config->user_site_directory = 0;
...@@ -962,6 +962,11 @@ _PyCoreConfig_GetEnvDup(_PyCoreConfig *config, ...@@ -962,6 +962,11 @@ _PyCoreConfig_GetEnvDup(_PyCoreConfig *config,
static void static void
_PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
{ {
if (config->_config_init != _PyConfig_INIT_COMPAT) {
/* Python and Isolated configuration ignore global variables */
return;
}
#define COPY_FLAG(ATTR, VALUE) \ #define COPY_FLAG(ATTR, VALUE) \
if (config->ATTR == -1) { \ if (config->ATTR == -1) { \
config->ATTR = VALUE; \ config->ATTR = VALUE; \
......
...@@ -40,7 +40,11 @@ Py_FrozenMain(int argc, char **argv) ...@@ -40,7 +40,11 @@ Py_FrozenMain(int argc, char **argv)
} }
_PyCoreConfig config; _PyCoreConfig config;
_PyCoreConfig_InitPythonConfig(&config); err = _PyCoreConfig_InitPythonConfig(&config);
if (_PyInitError_Failed(err)) {
_PyCoreConfig_Clear(&config);
_Py_ExitInitError(err);
}
config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */ config.pathconfig_warnings = 0; /* Suppress errors from getpath.c */
if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
...@@ -82,8 +86,7 @@ Py_FrozenMain(int argc, char **argv) ...@@ -82,8 +86,7 @@ Py_FrozenMain(int argc, char **argv)
Py_SetProgramName(argv_copy[0]); Py_SetProgramName(argv_copy[0]);
err = _Py_InitializeFromConfig(&config); err = _Py_InitializeFromConfig(&config);
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any _PyCoreConfig_Clear(&config);
memory: program_name is a constant string. */
if (_PyInitError_Failed(err)) { if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err); _Py_ExitInitError(err);
} }
......
...@@ -383,7 +383,7 @@ pathconfig_global_init(void) ...@@ -383,7 +383,7 @@ pathconfig_global_init(void)
_PyInitError err; _PyInitError err;
_PyCoreConfig config; _PyCoreConfig config;
_PyCoreConfig_Init(&config); _PyCoreConfig_InitCompatConfig(&config);
err = _PyCoreConfig_Read(&config); err = _PyCoreConfig_Read(&config);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
......
...@@ -262,16 +262,17 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline, const _PyPreConfig *preconfig) ...@@ -262,16 +262,17 @@ _PyPreCmdline_Read(_PyPreCmdline *cmdline, const _PyPreConfig *preconfig)
void void
_PyPreConfig_Init(_PyPreConfig *config) _PyPreConfig_InitCompatConfig(_PyPreConfig *config)
{ {
memset(config, 0, sizeof(*config)); memset(config, 0, sizeof(*config));
config->_config_version = _Py_CONFIG_VERSION; config->_config_version = _Py_CONFIG_VERSION;
config->_config_init = (int)_PyConfig_INIT_COMPAT;
config->parse_argv = 0; config->parse_argv = 0;
config->isolated = -1; config->isolated = -1;
config->use_environment = -1; config->use_environment = -1;
config->configure_locale = 1; config->configure_locale = 1;
config->utf8_mode = -2; config->utf8_mode = -1;
config->dev_mode = -1; config->dev_mode = -1;
config->allocator = PYMEM_ALLOCATOR_NOT_SET; config->allocator = PYMEM_ALLOCATOR_NOT_SET;
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
...@@ -283,23 +284,30 @@ _PyPreConfig_Init(_PyPreConfig *config) ...@@ -283,23 +284,30 @@ _PyPreConfig_Init(_PyPreConfig *config)
void void
_PyPreConfig_InitPythonConfig(_PyPreConfig *config) _PyPreConfig_InitPythonConfig(_PyPreConfig *config)
{ {
_PyPreConfig_Init(config); _PyPreConfig_InitCompatConfig(config);
config->_config_init = (int)_PyConfig_INIT_PYTHON;
config->isolated = 0;
config->parse_argv = 1; config->parse_argv = 1;
config->use_environment = 1;
/* Set to -1 to enable C locale coercion (PEP 538) and UTF-8 Mode (PEP 540) /* Set to -1 to enable C locale coercion (PEP 538) and UTF-8 Mode (PEP 540)
depending on the LC_CTYPE locale, PYTHONUTF8 and PYTHONCOERCECLOCALE depending on the LC_CTYPE locale, PYTHONUTF8 and PYTHONCOERCECLOCALE
environment variables. */ environment variables. */
config->coerce_c_locale = -1; config->coerce_c_locale = -1;
config->coerce_c_locale_warn = -1; config->coerce_c_locale_warn = -1;
config->utf8_mode = -1; config->utf8_mode = -1;
#ifdef MS_WINDOWS
config->legacy_windows_fs_encoding = 0;
#endif
} }
void void
_PyPreConfig_InitIsolatedConfig(_PyPreConfig *config) _PyPreConfig_InitIsolatedConfig(_PyPreConfig *config)
{ {
_PyPreConfig_Init(config); _PyPreConfig_InitCompatConfig(config);
config->_config_init = (int)_PyConfig_INIT_ISOLATED;
config->configure_locale = 0; config->configure_locale = 0;
config->isolated = 1; config->isolated = 1;
config->use_environment = 0; config->use_environment = 0;
...@@ -315,7 +323,7 @@ void ...@@ -315,7 +323,7 @@ void
_PyPreConfig_InitFromPreConfig(_PyPreConfig *config, _PyPreConfig_InitFromPreConfig(_PyPreConfig *config,
const _PyPreConfig *config2) const _PyPreConfig *config2)
{ {
_PyPreConfig_Init(config); _PyPreConfig_InitCompatConfig(config);
_PyPreConfig_Copy(config, config2); _PyPreConfig_Copy(config, config2);
} }
...@@ -324,17 +332,17 @@ void ...@@ -324,17 +332,17 @@ void
_PyPreConfig_InitFromCoreConfig(_PyPreConfig *config, _PyPreConfig_InitFromCoreConfig(_PyPreConfig *config,
const _PyCoreConfig *coreconfig) const _PyCoreConfig *coreconfig)
{ {
_PyCoreConfigInitEnum config_init = (_PyCoreConfigInitEnum)coreconfig->_config_init; _PyConfigInitEnum config_init = (_PyConfigInitEnum)coreconfig->_config_init;
switch (config_init) { switch (config_init) {
case _PyCoreConfig_INIT_PYTHON: case _PyConfig_INIT_PYTHON:
_PyPreConfig_InitPythonConfig(config); _PyPreConfig_InitPythonConfig(config);
break; break;
case _PyCoreConfig_INIT_ISOLATED: case _PyConfig_INIT_ISOLATED:
_PyPreConfig_InitIsolatedConfig(config); _PyPreConfig_InitIsolatedConfig(config);
break; break;
case _PyCoreConfig_INIT: case _PyConfig_INIT_COMPAT:
default: default:
_PyPreConfig_Init(config); _PyPreConfig_InitCompatConfig(config);
} }
_PyPreConfig_GetCoreConfig(config, coreconfig); _PyPreConfig_GetCoreConfig(config, coreconfig);
} }
...@@ -428,6 +436,11 @@ _PyPreConfig_GetCoreConfig(_PyPreConfig *config, ...@@ -428,6 +436,11 @@ _PyPreConfig_GetCoreConfig(_PyPreConfig *config,
static void static void
_PyPreConfig_GetGlobalConfig(_PyPreConfig *config) _PyPreConfig_GetGlobalConfig(_PyPreConfig *config)
{ {
if (config->_config_init != _PyConfig_INIT_COMPAT) {
/* Python and Isolated configuration ignore global variables */
return;
}
#define COPY_FLAG(ATTR, VALUE) \ #define COPY_FLAG(ATTR, VALUE) \
if (config->ATTR < 0) { \ if (config->ATTR < 0) { \
config->ATTR = VALUE; \ config->ATTR = VALUE; \
...@@ -439,12 +452,10 @@ _PyPreConfig_GetGlobalConfig(_PyPreConfig *config) ...@@ -439,12 +452,10 @@ _PyPreConfig_GetGlobalConfig(_PyPreConfig *config)
COPY_FLAG(isolated, Py_IsolatedFlag); COPY_FLAG(isolated, Py_IsolatedFlag);
COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag); COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag);
COPY_FLAG(utf8_mode, Py_UTF8Mode);
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag); COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag);
#endif #endif
if (config->utf8_mode == -2) {
config->utf8_mode = Py_UTF8Mode;
}
#undef COPY_FLAG #undef COPY_FLAG
#undef COPY_NOT_FLAG #undef COPY_NOT_FLAG
...@@ -565,12 +576,7 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline) ...@@ -565,12 +576,7 @@ preconfig_init_utf8_mode(_PyPreConfig *config, const _PyPreCmdline *cmdline)
} }
const wchar_t *xopt; const wchar_t *xopt;
if (cmdline) { xopt = _Py_get_xoption(&cmdline->xoptions, L"utf8");
xopt = _Py_get_xoption(&cmdline->xoptions, L"utf8");
}
else {
xopt = NULL;
}
if (xopt) { if (xopt) {
wchar_t *sep = wcschr(xopt, L'='); wchar_t *sep = wcschr(xopt, L'=');
if (sep) { if (sep) {
......
...@@ -867,7 +867,7 @@ _Py_InitializeCore(_PyRuntimeState *runtime, ...@@ -867,7 +867,7 @@ _Py_InitializeCore(_PyRuntimeState *runtime,
} }
_PyCoreConfig local_config; _PyCoreConfig local_config;
_PyCoreConfig_Init(&local_config); _PyCoreConfig_InitCompatConfig(&local_config);
err = pyinit_coreconfig(runtime, &local_config, src_config, args, interp_p); err = pyinit_coreconfig(runtime, &local_config, src_config, args, interp_p);
_PyCoreConfig_Clear(&local_config); _PyCoreConfig_Clear(&local_config);
return err; return err;
...@@ -1096,7 +1096,7 @@ Py_InitializeEx(int install_sigs) ...@@ -1096,7 +1096,7 @@ Py_InitializeEx(int install_sigs)
} }
_PyCoreConfig config; _PyCoreConfig config;
_PyCoreConfig_Init(&config); _PyCoreConfig_InitCompatConfig(&config);
config.install_signal_handlers = install_sigs; config.install_signal_handlers = install_sigs;
err = _Py_InitializeFromConfig(&config); err = _Py_InitializeFromConfig(&config);
......
...@@ -49,7 +49,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime) ...@@ -49,7 +49,7 @@ _PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
_PyGC_Initialize(&runtime->gc); _PyGC_Initialize(&runtime->gc);
_PyEval_Initialize(&runtime->ceval); _PyEval_Initialize(&runtime->ceval);
_PyPreConfig_Init(&runtime->preconfig); _PyPreConfig_InitPythonConfig(&runtime->preconfig);
runtime->gilstate.check_enabled = 1; runtime->gilstate.check_enabled = 1;
...@@ -189,7 +189,13 @@ PyInterpreterState_New(void) ...@@ -189,7 +189,13 @@ PyInterpreterState_New(void)
memset(interp, 0, sizeof(*interp)); memset(interp, 0, sizeof(*interp));
interp->id_refcount = -1; interp->id_refcount = -1;
interp->check_interval = 100; interp->check_interval = 100;
_PyCoreConfig_Init(&interp->core_config);
_PyInitError err = _PyCoreConfig_InitPythonConfig(&interp->core_config);
if (_Py_INIT_FAILED(err)) {
PyMem_RawFree(interp);
return NULL;
}
interp->eval_frame = _PyEval_EvalFrameDefault; interp->eval_frame = _PyEval_EvalFrameDefault;
#ifdef HAVE_DLOPEN #ifdef HAVE_DLOPEN
#if HAVE_DECL_RTLD_NOW #if HAVE_DECL_RTLD_NOW
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment