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().
This commit is contained in:
Victor Stinner 2019-03-26 02:31:11 +01:00 committed by GitHub
parent f78a5e9ce8
commit 20004959d2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 179 additions and 145 deletions

View file

@ -469,8 +469,6 @@ Py_GetArgcArgv(int *argc, wchar_t ***argv)
void
_PyCoreConfig_Clear(_PyCoreConfig *config)
{
_PyPreConfig_Clear(&config->preconfig);
#define CLEAR(ATTR) \
do { \
PyMem_RawFree(ATTR); \
@ -514,10 +512,6 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
{
_PyCoreConfig_Clear(config);
if (_PyPreConfig_Copy(&config->preconfig, &config2->preconfig) < 0) {
return -1;
}
#define COPY_ATTR(ATTR) config->ATTR = config2->ATTR
#define COPY_STR_ATTR(ATTR) \
do { \
@ -544,6 +538,9 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
} \
} while (0)
COPY_ATTR(isolated);
COPY_ATTR(use_environment);
COPY_ATTR(dev_mode);
COPY_ATTR(install_signal_handlers);
COPY_ATTR(use_hash_seed);
COPY_ATTR(hash_seed);
@ -613,7 +610,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
static const char*
_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,
wchar_t **dest,
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;
return 0;
}
@ -668,8 +665,6 @@ _PyCoreConfig_GetEnvDup(const _PyCoreConfig *config,
void
_PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
{
_PyPreConfig_GetGlobalConfig(&config->preconfig);
#define COPY_FLAG(ATTR, VALUE) \
if (config->ATTR == -1) { \
config->ATTR = VALUE; \
@ -679,6 +674,8 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
config->ATTR = !(VALUE); \
}
COPY_FLAG(isolated, Py_IsolatedFlag);
COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag);
COPY_FLAG(bytes_warning, Py_BytesWarningFlag);
COPY_FLAG(inspect, Py_InspectFlag);
COPY_FLAG(interactive, Py_InteractiveFlag);
@ -714,6 +711,8 @@ _PyCoreConfig_SetGlobalConfig(const _PyCoreConfig *config)
VAR = !config->ATTR; \
}
COPY_FLAG(isolated, Py_IsolatedFlag);
COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag);
COPY_FLAG(bytes_warning, Py_BytesWarningFlag);
COPY_FLAG(inspect, Py_InspectFlag);
COPY_FLAG(interactive, Py_InteractiveFlag);
@ -924,7 +923,7 @@ config_wstr_to_int(const wchar_t *wstr, int *result)
static _PyInitError
config_read_env_vars(_PyCoreConfig *config)
{
int use_env = config->preconfig.use_environment;
int use_env = config->use_environment;
/* Get environment variables */
_Py_get_env_flag(use_env, &config->parser_debug, "PYTHONDEBUG");
@ -1149,7 +1148,8 @@ get_locale_encoding(char **locale_encoding)
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
parameters. */
@ -1219,7 +1219,7 @@ config_init_stdio_encoding(_PyCoreConfig *config)
}
/* UTF-8 Mode uses UTF-8/surrogateescape */
if (config->preconfig.utf8_mode) {
if (preconfig->utf8_mode) {
if (config->stdio_encoding == NULL) {
config->stdio_encoding = _PyMem_RawStrdup("utf-8");
if (config->stdio_encoding == NULL) {
@ -1254,10 +1254,10 @@ config_init_stdio_encoding(_PyCoreConfig *config)
static _PyInitError
config_init_fs_encoding(_PyCoreConfig *config)
config_init_fs_encoding(_PyCoreConfig *config, const _PyPreConfig *preconfig)
{
#ifdef MS_WINDOWS
if (config->preconfig.legacy_windows_fs_encoding) {
if (preconfig->legacy_windows_fs_encoding) {
/* Legacy Windows filesystem encoding: mbcs/replace */
if (config->filesystem_encoding == NULL) {
config->filesystem_encoding = _PyMem_RawStrdup("mbcs");
@ -1292,7 +1292,7 @@ config_init_fs_encoding(_PyCoreConfig *config)
}
#else
if (config->filesystem_encoding == NULL) {
if (config->preconfig.utf8_mode) {
if (preconfig->utf8_mode) {
/* UTF-8 Mode use: utf-8/surrogateescape */
config->filesystem_encoding = _PyMem_RawStrdup("utf-8");
/* errors defaults to surrogateescape above */
@ -1341,12 +1341,8 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
{
_PyInitError err;
err = _Py_PreInitializeFromConfig(config);
if (_Py_INIT_FAILED(err)) {
return err;
}
_PyPreCmdline_GetPreConfig(cmdline, &_PyRuntime.preconfig);
const _PyPreConfig *preconfig = &_PyRuntime.preconfig;
_PyPreCmdline_GetPreConfig(cmdline, preconfig);
_PyPreCmdline_GetCoreConfig(cmdline, config);
err = _PyPreCmdline_Read(cmdline);
@ -1360,19 +1356,16 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
return _Py_INIT_NO_MEMORY();
}
if (_PyPreConfig_Copy(&config->preconfig, &_PyRuntime.preconfig) < 0) {
return _Py_INIT_NO_MEMORY();
}
_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;
}
if (config->preconfig.use_environment) {
if (config->use_environment) {
err = config_read_env_vars(config);
if (_Py_INIT_FAILED(err)) {
return err;
@ -1421,7 +1414,7 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
}
/* default values */
if (config->preconfig.dev_mode) {
if (config->dev_mode) {
if (config->faulthandler < 0) {
config->faulthandler = 1;
}
@ -1438,13 +1431,13 @@ config_read_impl(_PyCoreConfig *config, _PyPreCmdline *cmdline)
}
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)) {
return err;
}
}
err = config_init_stdio_encoding(config);
err = config_init_stdio_encoding(config, preconfig);
if (_Py_INIT_FAILED(err)) {
return err;
}
@ -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_errors != NULL);
assert(config->stdio_encoding != NULL);
@ -1544,22 +1537,11 @@ config_init_stdio(const _PyCoreConfig *config)
- set Py_xxx global configuration variables
- initialize C standard streams (stdin, stdout, stderr) */
_PyInitError
void
_PyCoreConfig_Write(const _PyCoreConfig *config)
{
_PyCoreConfig_SetGlobalConfig(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)
#define SET_ITEM_WSTRLIST(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(use_hash_seed);
SET_ITEM_UINT(hash_seed);
@ -1945,7 +1930,7 @@ config_init_warnoptions(_PyCoreConfig *config, const _PyCmdline *cmdline)
* 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")) {
return _Py_INIT_NO_MEMORY();
}
@ -2101,7 +2086,7 @@ config_from_cmdline(_PyCoreConfig *config, _PyCmdline *cmdline)
return err;
}
if (config->preconfig.use_environment) {
if (config->use_environment) {
err = cmdline_init_env_warnoptions(cmdline, config);
if (_Py_INIT_FAILED(err)) {
return err;
@ -2178,8 +2163,7 @@ _Py_GetConfigsAsDict(void)
/* pre config */
PyInterpreterState *interp = _PyInterpreterState_Get();
const _PyCoreConfig *core_config = _PyInterpreterState_GetCoreConfig(interp);
const _PyPreConfig *pre_config = &core_config->preconfig;
const _PyPreConfig *pre_config = &_PyRuntime.preconfig;
dict = _PyPreConfig_AsDict(pre_config);
if (dict == NULL) {
goto error;
@ -2190,6 +2174,7 @@ _Py_GetConfigsAsDict(void)
Py_CLEAR(dict);
/* core config */
const _PyCoreConfig *core_config = _PyInterpreterState_GetCoreConfig(interp);
dict = _PyCoreConfig_AsDict(core_config);
if (dict == NULL) {
goto error;

View file

@ -331,7 +331,7 @@ _PyCoreConfig_CalculatePathConfig(_PyCoreConfig *config)
#endif
if (path_config.isolated != -1) {
config->preconfig.isolated = path_config.isolated;
config->isolated = path_config.isolated;
}
if (path_config.site_import != -1) {
config->site_import = path_config.site_import;

View file

@ -143,6 +143,23 @@ _PyPreCmdline_GetPreConfig(_PyPreCmdline *cmdline, const _PyPreConfig *config)
COPY_ATTR(use_environment);
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
}
@ -152,12 +169,13 @@ void
_PyPreCmdline_GetCoreConfig(_PyPreCmdline *cmdline, const _PyCoreConfig *config)
{
#define COPY_ATTR(ATTR) \
if (config->preconfig.ATTR != -1) { \
cmdline->ATTR = config->preconfig.ATTR; \
if (config->ATTR != -1) { \
cmdline->ATTR = config->ATTR; \
}
COPY_ATTR(use_environment);
COPY_ATTR(isolated);
COPY_ATTR(dev_mode);
#undef COPY_ATTR
}
@ -167,12 +185,13 @@ void
_PyPreCmdline_SetCoreConfig(const _PyPreCmdline *cmdline, _PyCoreConfig *config)
{
#define COPY_ATTR(ATTR) \
if (config->preconfig.ATTR == -1 && cmdline->ATTR != -1) { \
config->preconfig.ATTR = cmdline->ATTR; \
if (config->ATTR == -1 && cmdline->ATTR != -1) { \
config->ATTR = cmdline->ATTR; \
}
COPY_ATTR(use_environment);
COPY_ATTR(isolated);
COPY_ATTR(dev_mode);
#undef COPY_ATTR
}
@ -206,13 +225,13 @@ _PyPreConfig_Copy(_PyPreConfig *config, const _PyPreConfig *config2)
COPY_ATTR(isolated);
COPY_ATTR(use_environment);
COPY_ATTR(dev_mode);
COPY_ATTR(coerce_c_locale);
COPY_ATTR(coerce_c_locale_warn);
#ifdef MS_WINDOWS
COPY_ATTR(legacy_windows_fs_encoding);
#endif
COPY_ATTR(utf8_mode);
COPY_ATTR(dev_mode);
COPY_STR_ATTR(allocator);
#undef COPY_ATTR
@ -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*
_PyPreConfig_AsDict(const _PyPreConfig *config)
{
@ -712,7 +716,7 @@ _PyPreConfig_Read(_PyPreConfig *config, const _PyArgv *args,
if (coreconfig) {
_PyPreCmdline_GetCoreConfig(&cmdline, coreconfig);
if (config->dev_mode == -1) {
config->dev_mode = coreconfig->preconfig.dev_mode;
config->dev_mode = coreconfig->dev_mode;
}
}

View file

@ -286,9 +286,10 @@ static const char *_C_LOCALE_WARNING =
"locales is recommended.\n";
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);
}
}
@ -675,6 +676,8 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p,
{
PyInterpreterState *interp;
_PyCoreConfig_Write(core_config);
_PyInitError err = pycore_init_runtime(core_config);
if (_Py_INIT_FAILED(err)) {
return err;
@ -720,54 +723,64 @@ pyinit_preinit(_PyPreConfig *config,
const _PyCoreConfig *coreconfig)
{
_PyInitError err;
_PyPreConfig local_config = _PyPreConfig_INIT;
if (!config) {
config = &local_config;
}
err = _PyRuntime_Initialize();
if (_Py_INIT_FAILED(err)) {
return err;
goto done;
}
if (_PyRuntime.pre_initialized) {
/* If it's already configured: ignored the new configuration */
return _Py_INIT_OK();
}
if (!src_config && coreconfig) {
src_config = &coreconfig->preconfig;
err = _Py_INIT_OK();
goto done;
}
if (src_config) {
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);
if (_Py_INIT_FAILED(err)) {
return err;
goto done;
}
err = _PyPreConfig_Write(config);
if (_Py_INIT_FAILED(err)) {
return err;
goto done;
}
_PyRuntime.pre_initialized = 1;
return _Py_INIT_OK();
err = _Py_INIT_OK();
done:
_PyPreConfig_Clear(&local_config);
return err;
}
_PyInitError
_Py_PreInitialize(void)
{
_PyPreConfig config = _PyPreConfig_INIT;
_PyInitError err = pyinit_preinit(&config, NULL, NULL);
_PyPreConfig_Clear(&config);
return err;
return pyinit_preinit(NULL, NULL, NULL);
}
_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);
}
@ -776,10 +789,7 @@ _Py_PreInitializeFromPreConfig(_PyPreConfig *config)
_PyInitError
_Py_PreInitializeFromConfig(const _PyCoreConfig *coreconfig)
{
_PyPreConfig config = _PyPreConfig_INIT;
_PyInitError err = pyinit_preinit(&config, NULL, coreconfig);
_PyPreConfig_Clear(&config);
return err;
return pyinit_preinit(NULL, NULL, coreconfig);
}
@ -964,7 +974,7 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp,
}
#ifndef MS_WINDOWS
_emit_stderr_warning_for_legacy_locale(core_config);
_emit_stderr_warning_for_legacy_locale();
#endif
return _Py_INIT_OK();

View file

@ -2158,6 +2158,7 @@ make_flags(void)
{
int pos = 0;
PyObject *seq;
const _PyPreConfig *preconfig = &_PyRuntime.preconfig;
const _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config;
seq = PyStructSequence_New(&FlagsType);
@ -2174,16 +2175,16 @@ make_flags(void)
SetFlag(!config->write_bytecode);
SetFlag(!config->user_site_directory);
SetFlag(!config->site_import);
SetFlag(!config->preconfig.use_environment);
SetFlag(!config->use_environment);
SetFlag(config->verbose);
/* SetFlag(saw_unbuffered_flag); */
/* SetFlag(skipfirstline); */
SetFlag(config->bytes_warning);
SetFlag(config->quiet);
SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0);
SetFlag(config->preconfig.isolated);
PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->preconfig.dev_mode));
SetFlag(config->preconfig.utf8_mode);
SetFlag(config->isolated);
PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode));
SetFlag(preconfig->utf8_mode);
#undef SetFlag
if (PyErr_Occurred()) {