Commit 20004959 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-36301: Remove _PyCoreConfig.preconfig (GH-12546)

* Replace _PyCoreConfig.preconfig with 3 new fields in _PyCoreConfig:
  isolated, use_environment, dev_mode.
* Add _PyPreCmdline.dev_mode.
* Add _Py_PreInitializeFromPreConfigInPlace().
parent f78a5e9c
...@@ -123,7 +123,9 @@ typedef struct { ...@@ -123,7 +123,9 @@ typedef struct {
/* --- _PyCoreConfig ---------------------------------------------- */ /* --- _PyCoreConfig ---------------------------------------------- */
typedef struct { typedef struct {
_PyPreConfig preconfig; int isolated;
int use_environment;
int dev_mode;
/* Install signal handlers? Yes by default. */ /* Install signal handlers? Yes by default. */
int install_signal_handlers; int install_signal_handlers;
...@@ -375,7 +377,9 @@ typedef struct { ...@@ -375,7 +377,9 @@ typedef struct {
#define _PyCoreConfig_INIT \ #define _PyCoreConfig_INIT \
(_PyCoreConfig){ \ (_PyCoreConfig){ \
_PyCoreConfig_WINDOWS_INIT \ _PyCoreConfig_WINDOWS_INIT \
.preconfig = _PyPreConfig_INIT, \ .isolated = -1, \
.use_environment = -1, \
.dev_mode = -1, \
.install_signal_handlers = 1, \ .install_signal_handlers = 1, \
.use_hash_seed = -1, \ .use_hash_seed = -1, \
.faulthandler = -1, \ .faulthandler = -1, \
......
...@@ -16,7 +16,7 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding, ...@@ -16,7 +16,7 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding,
PyAPI_FUNC(_PyInitError) _Py_PreInitialize(void); PyAPI_FUNC(_PyInitError) _Py_PreInitialize(void);
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig( PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromPreConfig(
_PyPreConfig *preconfig); const _PyPreConfig *preconfig);
PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig( PyAPI_FUNC(_PyInitError) _Py_PreInitializeFromConfig(
const _PyCoreConfig *coreconfig); const _PyCoreConfig *coreconfig);
......
...@@ -16,12 +16,14 @@ typedef struct { ...@@ -16,12 +16,14 @@ typedef struct {
_PyWstrList xoptions; /* "-X value" option */ _PyWstrList xoptions; /* "-X value" option */
int use_environment; /* -E option */ int use_environment; /* -E option */
int isolated; /* -I option */ int isolated; /* -I option */
int dev_mode; /* -X dev and PYTHONDEVMODE */
} _PyPreCmdline; } _PyPreCmdline;
#define _PyPreCmdline_INIT \ #define _PyPreCmdline_INIT \
(_PyPreCmdline){ \ (_PyPreCmdline){ \
.use_environment = -1, \ .use_environment = -1, \
.isolated = -1} .isolated = -1, \
.dev_mode = -1}
/* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */ /* Note: _PyPreCmdline_INIT sets other fields to 0/NULL */
PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline); PyAPI_FUNC(void) _PyPreCmdline_Clear(_PyPreCmdline *cmdline);
...@@ -112,7 +114,7 @@ PyAPI_FUNC(void) _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config); ...@@ -112,7 +114,7 @@ PyAPI_FUNC(void) _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config);
PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config); PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *config);
PyAPI_FUNC(_PyInitError) _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config, PyAPI_FUNC(_PyInitError) _PyCoreConfig_ReadFromArgv(_PyCoreConfig *config,
const _PyArgv *args); const _PyArgv *args);
PyAPI_FUNC(_PyInitError) _PyCoreConfig_Write(const _PyCoreConfig *config); PyAPI_FUNC(void) _PyCoreConfig_Write(const _PyCoreConfig *config);
/* --- _PyMainInterpreterConfig ----------------------------------- */ /* --- _PyMainInterpreterConfig ----------------------------------- */
......
...@@ -77,6 +77,9 @@ extern void _PyGILState_Fini(void); ...@@ -77,6 +77,9 @@ extern void _PyGILState_Fini(void);
PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void); PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void);
PyAPI_FUNC(_PyInitError) _Py_PreInitializeInPlace(
_PyPreConfig *config);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
...@@ -272,12 +272,19 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ...@@ -272,12 +272,19 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
'allocator': None, 'allocator': None,
'coerce_c_locale': 0, 'coerce_c_locale': 0,
'coerce_c_locale_warn': 0, 'coerce_c_locale_warn': 0,
'dev_mode': 0,
'isolated': 0,
'use_environment': 1,
'utf8_mode': 0, 'utf8_mode': 0,
} }
COPY_PRE_CONFIG = [
'dev_mode',
'isolated',
'use_environment',
]
DEFAULT_CORE_CONFIG = { DEFAULT_CORE_CONFIG = {
'isolated': 0,
'use_environment': 1,
'dev_mode': 0,
'install_signal_handlers': 1, 'install_signal_handlers': 1,
'use_hash_seed': 0, 'use_hash_seed': 0,
'hash_seed': 0, 'hash_seed': 0,
...@@ -363,8 +370,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ...@@ -363,8 +370,6 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
'_Py_HasFileSystemDefaultEncodeErrors': 0, '_Py_HasFileSystemDefaultEncodeErrors': 0,
} }
COPY_GLOBAL_PRE_CONFIG = [ COPY_GLOBAL_PRE_CONFIG = [
('Py_IgnoreEnvironmentFlag', 'use_environment', True),
('Py_IsolatedFlag', 'isolated'),
('Py_UTF8Mode', 'utf8_mode'), ('Py_UTF8Mode', 'utf8_mode'),
] ]
COPY_GLOBAL_CONFIG = [ COPY_GLOBAL_CONFIG = [
...@@ -376,8 +381,10 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ...@@ -376,8 +381,10 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'), ('Py_FileSystemDefaultEncodeErrors', 'filesystem_errors'),
('Py_FileSystemDefaultEncoding', 'filesystem_encoding'), ('Py_FileSystemDefaultEncoding', 'filesystem_encoding'),
('Py_FrozenFlag', '_frozen'), ('Py_FrozenFlag', '_frozen'),
('Py_IgnoreEnvironmentFlag', 'use_environment', True),
('Py_InspectFlag', 'inspect'), ('Py_InspectFlag', 'inspect'),
('Py_InteractiveFlag', 'interactive'), ('Py_InteractiveFlag', 'interactive'),
('Py_IsolatedFlag', 'isolated'),
('Py_NoSiteFlag', 'site_import', True), ('Py_NoSiteFlag', 'site_import', True),
('Py_NoUserSiteDirectory', 'user_site_directory', True), ('Py_NoUserSiteDirectory', 'user_site_directory', True),
('Py_OptimizeFlag', 'optimization_level'), ('Py_OptimizeFlag', 'optimization_level'),
...@@ -415,7 +422,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ...@@ -415,7 +422,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
expected['xoptions'] = self.main_xoptions(core_config['xoptions']) expected['xoptions'] = self.main_xoptions(core_config['xoptions'])
self.assertEqual(main_config, expected) self.assertEqual(main_config, expected)
def get_expected_config(self, expected, expected_preconfig, env): def get_expected_config(self, expected, env):
expected = dict(self.DEFAULT_CORE_CONFIG, **expected) expected = dict(self.DEFAULT_CORE_CONFIG, **expected)
code = textwrap.dedent(''' code = textwrap.dedent('''
...@@ -443,7 +450,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ...@@ -443,7 +450,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
# when test_embed is run from a venv (bpo-35313) # when test_embed is run from a venv (bpo-35313)
args = (sys.executable, '-S', '-c', code) args = (sys.executable, '-S', '-c', code)
env = dict(env) env = dict(env)
if not expected_preconfig['isolated']: if not expected['isolated']:
env['PYTHONCOERCECLOCALE'] = '0' env['PYTHONCOERCECLOCALE'] = '0'
env['PYTHONUTF8'] = '0' env['PYTHONUTF8'] = '0'
proc = subprocess.run(args, env=env, proc = subprocess.run(args, env=env,
...@@ -509,7 +516,10 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ...@@ -509,7 +516,10 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
config = json.loads(out) config = json.loads(out)
expected_preconfig = dict(self.DEFAULT_PRE_CONFIG, **expected_preconfig) expected_preconfig = dict(self.DEFAULT_PRE_CONFIG, **expected_preconfig)
expected_config = self.get_expected_config(expected_config, expected_preconfig, env) expected_config = self.get_expected_config(expected_config, env)
for key in self.COPY_PRE_CONFIG:
if key not in expected_preconfig:
expected_preconfig[key] = expected_config[key]
self.check_core_config(config, expected_config) self.check_core_config(config, expected_config)
self.check_pre_config(config, expected_preconfig) self.check_pre_config(config, expected_preconfig)
...@@ -617,35 +627,36 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): ...@@ -617,35 +627,36 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
def test_init_env_dev_mode(self): def test_init_env_dev_mode(self):
preconfig = dict(self.INIT_ENV_PRECONFIG, preconfig = dict(self.INIT_ENV_PRECONFIG,
allocator='debug', allocator='debug')
dev_mode=1)
config = dict(self.INIT_ENV_CONFIG, config = dict(self.INIT_ENV_CONFIG,
dev_mode=1) dev_mode=1)
self.check_config("init_env_dev_mode", config, preconfig) self.check_config("init_env_dev_mode", config, preconfig)
def test_init_env_dev_mode(self): def test_init_env_dev_mode_alloc(self):
preconfig = dict(self.INIT_ENV_PRECONFIG, preconfig = dict(self.INIT_ENV_PRECONFIG,
allocator='malloc', allocator='malloc')
config = dict(self.INIT_ENV_CONFIG,
dev_mode=1) dev_mode=1)
config = dict(self.INIT_ENV_CONFIG)
self.check_config("init_env_dev_mode_alloc", config, preconfig) self.check_config("init_env_dev_mode_alloc", config, preconfig)
def test_init_dev_mode(self): def test_init_dev_mode(self):
preconfig = { preconfig = {
'allocator': 'debug', 'allocator': 'debug',
'dev_mode': 1,
} }
config = { config = {
'faulthandler': 1, 'faulthandler': 1,
'dev_mode': 1,
} }
self.check_config("init_dev_mode", config, preconfig) self.check_config("init_dev_mode", config, preconfig)
def test_init_isolated(self): def test_init_isolated(self):
preconfig = { preconfig = {
'isolated': 1, 'isolated': 0,
'use_environment': 0, 'use_environment': 1,
} }
config = { config = {
'isolated': 1,
'use_environment': 0,
'user_site_directory': 0, 'user_site_directory': 0,
} }
self.check_config("init_isolated", config, preconfig) self.check_config("init_isolated", config, preconfig)
......
...@@ -294,7 +294,7 @@ pymain_init_preconfig(const _PyArgv *args) ...@@ -294,7 +294,7 @@ pymain_init_preconfig(const _PyArgv *args)
goto done; goto done;
} }
err = _Py_PreInitializeFromPreConfig(&config); err = _Py_PreInitializeInPlace(&config);
done: done:
_PyPreConfig_Clear(&config); _PyPreConfig_Clear(&config);
...@@ -311,11 +311,6 @@ pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args, ...@@ -311,11 +311,6 @@ pymain_init_coreconfig(_PyCoreConfig *config, const _PyArgv *args,
return err; return err;
} }
err = _PyCoreConfig_Write(config);
if (_Py_INIT_FAILED(err)) {
return err;
}
return _Py_InitializeCore(interp_p, config); return _Py_InitializeCore(interp_p, config);
} }
...@@ -483,7 +478,7 @@ pymain_header(const _PyCoreConfig *config) ...@@ -483,7 +478,7 @@ pymain_header(const _PyCoreConfig *config)
static void static void
pymain_import_readline(const _PyCoreConfig *config) pymain_import_readline(const _PyCoreConfig *config)
{ {
if (config->preconfig.isolated) { if (config->isolated) {
return; return;
} }
if (!config->inspect && RUN_CODE(config)) { if (!config->inspect && RUN_CODE(config)) {
...@@ -655,7 +650,7 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf) ...@@ -655,7 +650,7 @@ pymain_run_file(_PyCoreConfig *config, PyCompilerFlags *cf)
static void static void
pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf) pymain_run_startup(_PyCoreConfig *config, PyCompilerFlags *cf)
{ {
const char *startup = _Py_GetEnv(config->preconfig.use_environment, "PYTHONSTARTUP"); const char *startup = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP");
if (startup == NULL) { if (startup == NULL) {
return; return;
} }
...@@ -735,7 +730,7 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode) ...@@ -735,7 +730,7 @@ pymain_repl(_PyCoreConfig *config, PyCompilerFlags *cf, int *exitcode)
{ {
/* Check this environment variable at the end, to give programs the /* Check this environment variable at the end, to give programs the
opportunity to set it from Python. */ opportunity to set it from Python. */
if (!Py_InspectFlag && _Py_GetEnv(config->preconfig.use_environment, "PYTHONINSPECT")) { if (!Py_InspectFlag && _Py_GetEnv(config->use_environment, "PYTHONINSPECT")) {
Py_InspectFlag = 1; Py_InspectFlag = 1;
config->inspect = 1; config->inspect = 1;
} }
...@@ -775,7 +770,7 @@ pymain_run_python(PyInterpreterState *interp, int *exitcode) ...@@ -775,7 +770,7 @@ pymain_run_python(PyInterpreterState *interp, int *exitcode)
goto done; goto done;
} }
} }
else if (!config->preconfig.isolated) { else if (!config->isolated) {
PyObject *path0 = NULL; PyObject *path0 = NULL;
if (_PyPathConfig_ComputeSysPath0(&config->argv, &path0)) { if (_PyPathConfig_ComputeSysPath0(&config->argv, &path0)) {
if (path0 == NULL) { if (path0 == NULL) {
......
...@@ -77,7 +77,7 @@ main(int argc, char *argv[]) ...@@ -77,7 +77,7 @@ main(int argc, char *argv[])
text[text_size] = '\0'; text[text_size] = '\0';
_PyCoreConfig config = _PyCoreConfig_INIT; _PyCoreConfig config = _PyCoreConfig_INIT;
config.preconfig.use_environment = 0; config.use_environment = 0;
config.user_site_directory = 0; config.user_site_directory = 0;
config.site_import = 0; config.site_import = 0;
config.program_name = L"./_freeze_importlib"; config.program_name = L"./_freeze_importlib";
......
...@@ -397,6 +397,22 @@ static int test_init_global_config(void) ...@@ -397,6 +397,22 @@ static int test_init_global_config(void)
static int test_init_from_config(void) static int test_init_from_config(void)
{ {
_PyInitError err;
_PyPreConfig preconfig = _PyPreConfig_INIT;
putenv("PYTHONMALLOC=malloc_debug");
preconfig.allocator = "malloc";
putenv("PYTHONUTF8=0");
Py_UTF8Mode = 0;
preconfig.utf8_mode = 1;
err = _Py_PreInitializeFromPreConfig(&preconfig);
if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err);
}
/* Test _Py_InitializeFromConfig() */ /* Test _Py_InitializeFromConfig() */
_PyCoreConfig config = _PyCoreConfig_INIT; _PyCoreConfig config = _PyCoreConfig_INIT;
config.install_signal_handlers = 0; config.install_signal_handlers = 0;
...@@ -407,9 +423,6 @@ static int test_init_from_config(void) ...@@ -407,9 +423,6 @@ static int test_init_from_config(void)
config.use_hash_seed = 1; config.use_hash_seed = 1;
config.hash_seed = 123; config.hash_seed = 123;
putenv("PYTHONMALLOC=malloc_debug");
config.preconfig.allocator = "malloc";
/* dev_mode=1 is tested in test_init_dev_mode() */ /* dev_mode=1 is tested in test_init_dev_mode() */
putenv("PYTHONFAULTHANDLER="); putenv("PYTHONFAULTHANDLER=");
...@@ -430,10 +443,6 @@ static int test_init_from_config(void) ...@@ -430,10 +443,6 @@ static int test_init_from_config(void)
/* FIXME: test coerce_c_locale and coerce_c_locale_warn */ /* FIXME: test coerce_c_locale and coerce_c_locale_warn */
putenv("PYTHONUTF8=0");
Py_UTF8Mode = 0;
config.preconfig.utf8_mode = 1;
putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix"); putenv("PYTHONPYCACHEPREFIX=env_pycache_prefix");
config.pycache_prefix = L"conf_pycache_prefix"; config.pycache_prefix = L"conf_pycache_prefix";
...@@ -521,7 +530,7 @@ static int test_init_from_config(void) ...@@ -521,7 +530,7 @@ static int test_init_from_config(void)
Py_FrozenFlag = 0; Py_FrozenFlag = 0;
config._frozen = 1; config._frozen = 1;
_PyInitError err = _Py_InitializeFromConfig(&config); err = _Py_InitializeFromConfig(&config);
/* Don't call _PyCoreConfig_Clear() since all strings are static */ /* Don't call _PyCoreConfig_Clear() since all strings are static */
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err); _Py_ExitInitError(err);
...@@ -607,20 +616,30 @@ static int test_init_env_dev_mode_alloc(void) ...@@ -607,20 +616,30 @@ static int test_init_env_dev_mode_alloc(void)
static int test_init_isolated(void) static int test_init_isolated(void)
{ {
_PyInitError err;
_PyPreConfig preconfig = _PyPreConfig_INIT;
/* Set coerce_c_locale and utf8_mode to not depend on the locale */
preconfig.coerce_c_locale = 0;
preconfig.utf8_mode = 0;
err = _Py_PreInitializeFromPreConfig(&preconfig);
if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err);
}
/* Test _PyCoreConfig.isolated=1 */ /* Test _PyCoreConfig.isolated=1 */
_PyCoreConfig config = _PyCoreConfig_INIT; _PyCoreConfig config = _PyCoreConfig_INIT;
Py_IsolatedFlag = 0; Py_IsolatedFlag = 0;
config.preconfig.isolated = 1; config.isolated = 1;
/* Set coerce_c_locale and utf8_mode to not depend on the locale */
config.preconfig.coerce_c_locale = 0;
config.preconfig.utf8_mode = 0;
/* Use path starting with "./" avoids a search along the PATH */ /* Use path starting with "./" avoids a search along the PATH */
config.program_name = L"./_testembed"; config.program_name = L"./_testembed";
test_init_env_dev_mode_putenvs(); test_init_env_dev_mode_putenvs();
_PyInitError err = _Py_InitializeFromConfig(&config); err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
_Py_ExitInitError(err); _Py_ExitInitError(err);
} }
...@@ -635,7 +654,7 @@ static int test_init_dev_mode(void) ...@@ -635,7 +654,7 @@ static int test_init_dev_mode(void)
_PyCoreConfig config = _PyCoreConfig_INIT; _PyCoreConfig config = _PyCoreConfig_INIT;
putenv("PYTHONFAULTHANDLER="); putenv("PYTHONFAULTHANDLER=");
putenv("PYTHONMALLOC="); putenv("PYTHONMALLOC=");
config.preconfig.dev_mode = 1; config.dev_mode = 1;
config.program_name = L"./_testembed"; config.program_name = L"./_testembed";
_PyInitError err = _Py_InitializeFromConfig(&config); _PyInitError err = _Py_InitializeFromConfig(&config);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
......
...@@ -469,8 +469,6 @@ Py_GetArgcArgv(int *argc, wchar_t ***argv) ...@@ -469,8 +469,6 @@ Py_GetArgcArgv(int *argc, wchar_t ***argv)
void void
_PyCoreConfig_Clear(_PyCoreConfig *config) _PyCoreConfig_Clear(_PyCoreConfig *config)
{ {
_PyPreConfig_Clear(&config->preconfig);
#define CLEAR(ATTR) \ #define CLEAR(ATTR) \
do { \ do { \
PyMem_RawFree(ATTR); \ PyMem_RawFree(ATTR); \
...@@ -514,10 +512,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) ...@@ -514,10 +512,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
{ {
_PyCoreConfig_Clear(config); _PyCoreConfig_Clear(config);
if (_PyPreConfig_Copy(&config->preconfig, &config2->preconfig) < 0) {
return -1;
}
#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR #define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
#define COPY_STR_ATTR(ATTR) \ #define COPY_STR_ATTR(ATTR) \
do { \ do { \
...@@ -544,6 +538,9 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) ...@@ -544,6 +538,9 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
} \ } \
} while (0) } while (0)
COPY_ATTR(isolated);
COPY_ATTR(use_environment);
COPY_ATTR(dev_mode);
COPY_ATTR(install_signal_handlers); COPY_ATTR(install_signal_handlers);
COPY_ATTR(use_hash_seed); COPY_ATTR(use_hash_seed);
COPY_ATTR(hash_seed); COPY_ATTR(hash_seed);
...@@ -613,7 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2) ...@@ -613,7 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
static const char* static const char*
_PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name) _PyCoreConfig_GetEnv(const _PyCoreConfig *config, const char *name)
{ {
return _Py_GetEnv(config->preconfig.use_environment, name); return _Py_GetEnv(config->use_environment, name);
} }
...@@ -622,9 +619,9 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, ...@@ -622,9 +619,9 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config,
wchar_t **dest, wchar_t **dest,
wchar_t *wname, char *name) wchar_t *wname, char *name)
{ {
assert(config->preconfig.use_environment >= 0); assert(config->use_environment >= 0);
if (!config->preconfig.use_environment) { if (!config->use_environment) {
*dest = NULL; *dest = NULL;
return 0; return 0;
} }
...@@ -668,8 +665,6 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config, ...@@ -668,8 +665,6 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config,
void void
_PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
{ {
_PyPreConfig_GetGlobalConfig(&config->preconfig);
#define COPY_FLAG(ATTR, VALUE) \ #define COPY_FLAG(ATTR, VALUE) \
if (config->ATTR == -1) { \ if (config->ATTR == -1) { \
config->ATTR = VALUE; \ config->ATTR = VALUE; \
...@@ -679,6 +674,8 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config) ...@@ -679,6 +674,8 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
config->ATTR = !(VALUE); \ config->ATTR = !(VALUE); \
} }
COPY_FLAG(isolated, Py_IsolatedFlag);
COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag);
COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(bytes_warning, Py_BytesWarningFlag);
COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(inspect, Py_InspectFlag);
COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(interactive, Py_InteractiveFlag);
...@@ -714,6 +711,8 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config) ...@@ -714,6 +711,8 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config)
VAR = !config->ATTR; \ VAR = !config->ATTR; \
} }
COPY_FLAG(isolated, Py_IsolatedFlag);
COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag);
COPY_FLAG(bytes_warning, Py_BytesWarningFlag); COPY_FLAG(bytes_warning, Py_BytesWarningFlag);
COPY_FLAG(inspect, Py_InspectFlag); COPY_FLAG(inspect, Py_InspectFlag);
COPY_FLAG(interactive, Py_InteractiveFlag); COPY_FLAG(interactive, Py_InteractiveFlag);
...@@ -924,7 +923,7 @@ config_wstr_to_int(const wchar_t *wstr, int *result) ...@@ -924,7 +923,7 @@ config_wstr_to_int(const wchar_t *wstr, int *result)
static _PyInitError static _PyInitError
config_read_env_vars(_PyCoreConfig *config) config_read_env_vars(_PyCoreConfig *config)
{ {
int use_env = config->preconfig.use_environment; int use_env = config->use_environment;
/* Get environment variables */ /* Get environment variables */
_Py_get_env_flag(use_env, &config->parser_debug, "PYTHONDEBUG"); _Py_get_env_flag(use_env, &config->parser_debug, "PYTHONDEBUG");
...@@ -1149,7 +1148,8 @@ get_locale_encoding(char **locale_encoding) ...@@ -1149,7 +1148,8 @@ get_locale_encoding(char **locale_encoding)
static _PyInitError static _PyInitError
config_init_stdio_encoding(_PyCoreConfig *config) config_init_stdio_encoding(_PyCoreConfig *config,
const _PyPreConfig *preconfig)
{ {
/* If Py_SetStandardStreamEncoding() have been called, use these /* If Py_SetStandardStreamEncoding() have been called, use these
parameters. */ parameters. */
...@@ -1219,7 +1219,7 @@ config_init_stdio_encoding(_PyCoreConfig *config) ...@@ -1219,7 +1219,7 @@ config_init_stdio_encoding(_PyCoreConfig *config)
} }
/* UTF-8 Mode uses UTF-8/surrogateescape */ /* UTF-8 Mode uses UTF-8/surrogateescape */
if (config->preconfig.utf8_mode) { if (preconfig->utf8_mode) {
if (config->stdio_encoding == NULL) { if (config->stdio_encoding == NULL) {
config->stdio_encoding = _PyMem_RawStrdup("utf-8"); config->stdio_encoding = _PyMem_RawStrdup("utf-8");
if (config->stdio_encoding == NULL) { if (config->stdio_encoding == NULL) {
...@@ -1254,10 +1254,10 @@ config_init_stdio_encoding(_PyCoreConfig *config) ...@@ -1254,10 +1254,10 @@ config_init_stdio_encoding(_PyCoreConfig *config)
static _PyInitError static _PyInitError
config_init_fs_encoding(_PyCoreConfig *config) config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig)
{ {
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
if (config->preconfig.legacy_windows_fs_encoding) { if (preconfig->legacy_windows_fs_encoding) {
/* Legacy Windows filesystem encoding: mbcs/replace */ /* Legacy Windows filesystem encoding: mbcs/replace */
if (config->filesystem_encoding == NULL) { if (config->filesystem_encoding == NULL) {
config->filesystem_encoding = _PyMem_RawStrdup("mbcs"); config->filesystem_encoding = _PyMem_RawStrdup("mbcs");
...@@ -1292,7 +1292,7 @@ config_init_fs_encoding(_PyCoreConfig *config) ...@@ -1292,7 +1292,7 @@ config_init_fs_encoding(_PyCoreConfig *config)
} }
#else #else
if (config->filesystem_encoding == NULL) { if (config->filesystem_encoding == NULL) {
if (config->preconfig.utf8_mode) { if (preconfig->utf8_mode) {
/* UTF-8 Mode use: utf-8/surrogateescape */ /* UTF-8 Mode use: utf-8/surrogateescape */
config->filesystem_encoding = _PyMem_RawStrdup("utf-8"); config->filesystem_encoding = _PyMem_RawStrdup("utf-8");
/* errors defaults to surrogateescape above */ /* errors defaults to surrogateescape above */
...@@ -1341,12 +1341,8 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) ...@@ -1341,12 +1341,8 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
{ {
_PyInitError err; _PyInitError err;
err = _Py_PreInitializeFromConfig(config); const _PyPreConfig *preconfig = &_PyRuntime.preconfig;
if (_Py_INIT_FAILED(err)) { _PyPreCmdline_GetPreConfig(cmdline, preconfig);
return err;
}
_PyPreCmdline_GetPreConfig(cmdline, &_PyRuntime.preconfig);
_PyPreCmdline_GetCoreConfig(cmdline, config); _PyPreCmdline_GetCoreConfig(cmdline, config);
err = _PyPreCmdline_Read(cmdline); err = _PyPreCmdline_Read(cmdline);
...@@ -1360,19 +1356,16 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) ...@@ -1360,19 +1356,16 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
return _Py_INIT_NO_MEMORY(); return _Py_INIT_NO_MEMORY();
} }
if (_PyPreConfig_Copy(&config->preconfig, &_PyRuntime.preconfig) < 0) {
return _Py_INIT_NO_MEMORY();
}
_PyCoreConfig_GetGlobalConfig(config); _PyCoreConfig_GetGlobalConfig(config);
assert(config->preconfig.use_environment >= 0); assert(config->use_environment >= 0);
if (config->preconfig.isolated > 0) { if (config->isolated > 0) {
config->use_environment = 0;
config->user_site_directory = 0; config->user_site_directory = 0;
} }
if (config->preconfig.use_environment) { if (config->use_environment) {
err = config_read_env_vars(config); err = config_read_env_vars(config);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
return err; return err;
...@@ -1421,7 +1414,7 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) ...@@ -1421,7 +1414,7 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
} }
/* default values */ /* default values */
if (config->preconfig.dev_mode) { if (config->dev_mode) {
if (config->faulthandler < 0) { if (config->faulthandler < 0) {
config->faulthandler = 1; config->faulthandler = 1;
} }
...@@ -1438,13 +1431,13 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) ...@@ -1438,13 +1431,13 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
} }
if (config->filesystem_encoding == NULL || config->filesystem_errors == NULL) { if (config->filesystem_encoding == NULL || config->filesystem_errors == NULL) {
err = config_init_fs_encoding(config); err = config_init_fs_encoding(config, preconfig);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
return err; return err;
} }
} }
err = config_init_stdio_encoding(config); err = config_init_stdio_encoding(config, preconfig);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
return err; return err;
} }
...@@ -1456,7 +1449,7 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline) ...@@ -1456,7 +1449,7 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
} }
} }
assert(config->preconfig.use_environment >= 0); assert(config->use_environment >= 0);
assert(config->filesystem_encoding != NULL); assert(config->filesystem_encoding != NULL);
assert(config->filesystem_errors != NULL); assert(config->filesystem_errors != NULL);
assert(config->stdio_encoding != NULL); assert(config->stdio_encoding != NULL);
...@@ -1544,22 +1537,11 @@ config_init_stdio(const _PyCoreConfig *config) ...@@ -1544,22 +1537,11 @@ config_init_stdio(const _PyCoreConfig *config)
- set Py_xxx global configuration variables - set Py_xxx global configuration variables
- initialize C standard streams (stdin, stdout, stderr) */ - initialize C standard streams (stdin, stdout, stderr) */
_PyInitError void
_PyCoreConfig_Write(const _PyCoreConfig *config) _PyCoreConfig_Write(const _PyCoreConfig *config)
{ {
_PyCoreConfig_SetGlobalConfig(config); _PyCoreConfig_SetGlobalConfig(config);
config_init_stdio(config); config_init_stdio(config);
/* Write the new pre-configuration into _PyRuntime */
PyMemAllocatorEx old_alloc;
_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
int res = _PyPreConfig_Copy(&_PyRuntime.preconfig, &config->preconfig);
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
if (res < 0) {
return _Py_INIT_NO_MEMORY();
}
return _Py_INIT_OK();
} }
...@@ -1604,6 +1586,9 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config) ...@@ -1604,6 +1586,9 @@ _PyCoreConfig_AsDict(const _PyCoreConfig *config)
#define SET_ITEM_WSTRLIST(LIST) \ #define SET_ITEM_WSTRLIST(LIST) \
SET_ITEM(#LIST, _PyWstrList_AsList(&config->LIST)) SET_ITEM(#LIST, _PyWstrList_AsList(&config->LIST))
SET_ITEM_INT(isolated);
SET_ITEM_INT(use_environment);
SET_ITEM_INT(dev_mode);
SET_ITEM_INT(install_signal_handlers); SET_ITEM_INT(install_signal_handlers);
SET_ITEM_INT(use_hash_seed); SET_ITEM_INT(use_hash_seed);
SET_ITEM_UINT(hash_seed); SET_ITEM_UINT(hash_seed);
...@@ -1945,7 +1930,7 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline) ...@@ -1945,7 +1930,7 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline)
* the lowest precedence entries first so that later entries override them. * the lowest precedence entries first so that later entries override them.
*/ */
if (config->preconfig.dev_mode) { if (config->dev_mode) {
if (_PyWstrList_Append(&config->warnoptions, L"default")) { if (_PyWstrList_Append(&config->warnoptions, L"default")) {
return _Py_INIT_NO_MEMORY(); return _Py_INIT_NO_MEMORY();
} }
...@@ -2101,7 +2086,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline) ...@@ -2101,7 +2086,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline)
return err; return err;
} }
if (config->preconfig.use_environment) { if (config->use_environment) {
err = cmdline_init_env_warnoptions(cmdline, config); err = cmdline_init_env_warnoptions(cmdline, config);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
return err; return err;
...@@ -2178,8 +2163,7 @@ _Py_GetConfigsAsDict(void) ...@@ -2178,8 +2163,7 @@ _Py_GetConfigsAsDict(void)
/* pre config */ /* pre config */
PyInterpreterState *interp = _PyInterpreterState_Get(); PyInterpreterState *interp = _PyInterpreterState_Get();
const _PyCoreConfig *core_config = _PyInterpreterState_GetCoreConfig(interp); const _PyPreConfig *pre_config = &_PyRuntime.preconfig;
const _PyPreConfig *pre_config = &core_config->preconfig;
dict = _PyPreConfig_AsDict(pre_config); dict = _PyPreConfig_AsDict(pre_config);
if (dict == NULL) { if (dict == NULL) {
goto error; goto error;
...@@ -2190,6 +2174,7 @@ _Py_GetConfigsAsDict(void) ...@@ -2190,6 +2174,7 @@ _Py_GetConfigsAsDict(void)
Py_CLEAR(dict); Py_CLEAR(dict);
/* core config */ /* core config */
const _PyCoreConfig *core_config = _PyInterpreterState_GetCoreConfig(interp);
dict = _PyCoreConfig_AsDict(core_config); dict = _PyCoreConfig_AsDict(core_config);
if (dict == NULL) { if (dict == NULL) {
goto error; goto error;
......
...@@ -331,7 +331,7 @@ _PyCoreConfig_CalculatePathConfig(_PyCoreConfig *config) ...@@ -331,7 +331,7 @@ _PyCoreConfig_CalculatePathConfig(_PyCoreConfig *config)
#endif #endif
if (path_config.isolated != -1) { if (path_config.isolated != -1) {
config->preconfig.isolated = path_config.isolated; config->isolated = path_config.isolated;
} }
if (path_config.site_import != -1) { if (path_config.site_import != -1) {
config->site_import = path_config.site_import; config->site_import = path_config.site_import;
......
...@@ -143,6 +143,23 @@ _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config) ...@@ -143,6 +143,23 @@ _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config)
COPY_ATTR(use_environment); COPY_ATTR(use_environment);
COPY_ATTR(isolated); COPY_ATTR(isolated);
COPY_ATTR(dev_mode);
#undef COPY_ATTR
}
void
_PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config)
{
#define COPY_ATTR(ATTR) \
if (cmdline->ATTR != -1) { \
config->ATTR = cmdline->ATTR; \
}
COPY_ATTR(use_environment);
COPY_ATTR(isolated);
COPY_ATTR(dev_mode);
#undef COPY_ATTR #undef COPY_ATTR
} }
...@@ -152,12 +169,13 @@ void ...@@ -152,12 +169,13 @@ void
_PyPreCmdline_GetCoreConfig(_PyPreCmdline *cmdline, const _PyCoreConfig *config) _PyPreCmdline_GetCoreConfig(_PyPreCmdline *cmdline, const _PyCoreConfig *config)
{ {
#define COPY_ATTR(ATTR) \ #define COPY_ATTR(ATTR) \
if (config->preconfig.ATTR != -1) { \ if (config->ATTR != -1) { \
cmdline->ATTR = config->preconfig.ATTR; \ cmdline->ATTR = config->ATTR; \
} }
COPY_ATTR(use_environment); COPY_ATTR(use_environment);
COPY_ATTR(isolated); COPY_ATTR(isolated);
COPY_ATTR(dev_mode);
#undef COPY_ATTR #undef COPY_ATTR
} }
...@@ -167,12 +185,13 @@ void ...@@ -167,12 +185,13 @@ void
_PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config) _PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config)
{ {
#define COPY_ATTR(ATTR) \ #define COPY_ATTR(ATTR) \
if (config->preconfig.ATTR == -1 && cmdline->ATTR != -1) { \ if (config->ATTR == -1 && cmdline->ATTR != -1) { \
config->preconfig.ATTR = cmdline->ATTR; \ config->ATTR = cmdline->ATTR; \
} }
COPY_ATTR(use_environment); COPY_ATTR(use_environment);
COPY_ATTR(isolated); COPY_ATTR(isolated);
COPY_ATTR(dev_mode);
#undef COPY_ATTR #undef COPY_ATTR
} }
...@@ -206,13 +225,13 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2) ...@@ -206,13 +225,13 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2)
COPY_ATTR(isolated); COPY_ATTR(isolated);
COPY_ATTR(use_environment); COPY_ATTR(use_environment);
COPY_ATTR(dev_mode);
COPY_ATTR(coerce_c_locale); COPY_ATTR(coerce_c_locale);
COPY_ATTR(coerce_c_locale_warn); COPY_ATTR(coerce_c_locale_warn);
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
COPY_ATTR(legacy_windows_fs_encoding); COPY_ATTR(legacy_windows_fs_encoding);
#endif #endif
COPY_ATTR(utf8_mode); COPY_ATTR(utf8_mode);
COPY_ATTR(dev_mode);
COPY_STR_ATTR(allocator); COPY_STR_ATTR(allocator);
#undef COPY_ATTR #undef COPY_ATTR
...@@ -567,21 +586,6 @@ get_ctype_locale(char **locale_p) ...@@ -567,21 +586,6 @@ get_ctype_locale(char **locale_p)
} }
void
_PyPreCmdline_SetPreConfig(const _PyPreCmdline *cmdline, _PyPreConfig *config)
{
#define COPY_ATTR(ATTR) \
if (cmdline->ATTR != -1) { \
config->ATTR = cmdline->ATTR; \
}
COPY_ATTR(use_environment);
COPY_ATTR(isolated);
#undef COPY_ATTR
}
PyObject* PyObject*
_PyPreConfig_AsDict(const _PyPreConfig *config) _PyPreConfig_AsDict(const _PyPreConfig *config)
{ {
...@@ -712,7 +716,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args, ...@@ -712,7 +716,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args,
if (coreconfig) { if (coreconfig) {
_PyPreCmdline_GetCoreConfig(&cmdline, coreconfig); _PyPreCmdline_GetCoreConfig(&cmdline, coreconfig);
if (config->dev_mode == -1) { if (config->dev_mode == -1) {
config->dev_mode = coreconfig->preconfig.dev_mode; config->dev_mode = coreconfig->dev_mode;
} }
} }
......
...@@ -286,9 +286,10 @@ static const char *_C_LOCALE_WARNING = ...@@ -286,9 +286,10 @@ static const char *_C_LOCALE_WARNING =
"locales is recommended.\n"; "locales is recommended.\n";
static void static void
_emit_stderr_warning_for_legacy_locale(const _PyCoreConfig *core_config) _emit_stderr_warning_for_legacy_locale(void)
{ {
if (core_config->preconfig.coerce_c_locale_warn && _Py_LegacyLocaleDetected()) { const _PyPreConfig *preconfig = &_PyRuntime.preconfig;
if (preconfig->coerce_c_locale_warn && _Py_LegacyLocaleDetected()) {
PySys_FormatStderr("%s", _C_LOCALE_WARNING); PySys_FormatStderr("%s", _C_LOCALE_WARNING);
} }
} }
...@@ -675,6 +676,8 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p, ...@@ -675,6 +676,8 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p,
{ {
PyInterpreterState *interp; PyInterpreterState *interp;
_PyCoreConfig_Write(core_config);
_PyInitError err = pycore_init_runtime(core_config); _PyInitError err = pycore_init_runtime(core_config);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
return err; return err;
...@@ -720,54 +723,64 @@ pyinit_preinit(_PyPreConfig *config, ...@@ -720,54 +723,64 @@ pyinit_preinit(_PyPreConfig *config,
const _PyCoreConfig *coreconfig) const _PyCoreConfig *coreconfig)
{ {
_PyInitError err; _PyInitError err;
_PyPreConfig local_config = _PyPreConfig_INIT;
if (!config) {
config = &local_config;
}
err = _PyRuntime_Initialize(); err = _PyRuntime_Initialize();
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
return err; goto done;
} }
if (_PyRuntime.pre_initialized) { if (_PyRuntime.pre_initialized) {
/* If it's already configured: ignored the new configuration */ /* If it's already configured: ignored the new configuration */
return _Py_INIT_OK(); err = _Py_INIT_OK();
} goto done;
if (!src_config && coreconfig) {
src_config = &coreconfig->preconfig;
} }
if (src_config) { if (src_config) {
if (_PyPreConfig_Copy(config, src_config) < 0) { if (_PyPreConfig_Copy(config, src_config) < 0) {
return _Py_INIT_ERR("failed to copy pre config"); err = _Py_INIT_ERR("failed to copy pre config");
goto done;
} }
} }
err = _PyPreConfig_Read(config, NULL, coreconfig); err = _PyPreConfig_Read(config, NULL, coreconfig);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
return err; goto done;
} }
err = _PyPreConfig_Write(config); err = _PyPreConfig_Write(config);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
return err; goto done;
} }
_PyRuntime.pre_initialized = 1; _PyRuntime.pre_initialized = 1;
return _Py_INIT_OK(); err = _Py_INIT_OK();
done:
_PyPreConfig_Clear(&local_config);
return err;
} }
_PyInitError _PyInitError
_Py_PreInitialize(void) _Py_PreInitialize(void)
{ {
_PyPreConfig config = _PyPreConfig_INIT; return pyinit_preinit(NULL, NULL, NULL);
_PyInitError err = pyinit_preinit(&config, NULL, NULL);
_PyPreConfig_Clear(&config);
return err;
} }
_PyInitError _PyInitError
_Py_PreInitializeFromPreConfig(_PyPreConfig *config) _Py_PreInitializeFromPreConfig(const _PyPreConfig *src_config)
{
return pyinit_preinit(NULL, src_config, NULL);
}
_PyInitError
_Py_PreInitializeInPlace(_PyPreConfig *config)
{ {
return pyinit_preinit(config, NULL, NULL); return pyinit_preinit(config, NULL, NULL);
} }
...@@ -776,10 +789,7 @@ _Py_PreInitializeFromPreConfig(_PyPreConfig *config) ...@@ -776,10 +789,7 @@ _Py_PreInitializeFromPreConfig(_PyPreConfig *config)
_PyInitError _PyInitError
_Py_PreInitializeFromConfig(const _PyCoreConfig *coreconfig) _Py_PreInitializeFromConfig(const _PyCoreConfig *coreconfig)
{ {
_PyPreConfig config = _PyPreConfig_INIT; return pyinit_preinit(NULL, NULL, coreconfig);
_PyInitError err = pyinit_preinit(&config, NULL, coreconfig);
_PyPreConfig_Clear(&config);
return err;
} }
...@@ -964,7 +974,7 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp, ...@@ -964,7 +974,7 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp,
} }
#ifndef MS_WINDOWS #ifndef MS_WINDOWS
_emit_stderr_warning_for_legacy_locale(core_config); _emit_stderr_warning_for_legacy_locale();
#endif #endif
return _Py_INIT_OK(); return _Py_INIT_OK();
......
...@@ -2158,6 +2158,7 @@ make_flags(void) ...@@ -2158,6 +2158,7 @@ make_flags(void)
{ {
int pos = 0; int pos = 0;
PyObject *seq; PyObject *seq;
const _PyPreConfig *preconfig = &_PyRuntime.preconfig;
const _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config; const _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config;
seq = PyStructSequence_New(&FlagsType); seq = PyStructSequence_New(&FlagsType);
...@@ -2174,16 +2175,16 @@ make_flags(void) ...@@ -2174,16 +2175,16 @@ make_flags(void)
SetFlag(!config->write_bytecode); SetFlag(!config->write_bytecode);
SetFlag(!config->user_site_directory); SetFlag(!config->user_site_directory);
SetFlag(!config->site_import); SetFlag(!config->site_import);
SetFlag(!config->preconfig.use_environment); SetFlag(!config->use_environment);
SetFlag(config->verbose); SetFlag(config->verbose);
/* SetFlag(saw_unbuffered_flag); */ /* SetFlag(saw_unbuffered_flag); */
/* SetFlag(skipfirstline); */ /* SetFlag(skipfirstline); */
SetFlag(config->bytes_warning); SetFlag(config->bytes_warning);
SetFlag(config->quiet); SetFlag(config->quiet);
SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0); SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0);
SetFlag(config->preconfig.isolated); SetFlag(config->isolated);
PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->preconfig.dev_mode)); PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode));
SetFlag(config->preconfig.utf8_mode); SetFlag(preconfig->utf8_mode);
#undef SetFlag #undef SetFlag
if (PyErr_Occurred()) { if (PyErr_Occurred()) {
......
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