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.
This commit is contained in:
Victor Stinner 2019-05-22 23:58:50 +02:00 committed by GitHub
parent e4d300e07c
commit 022be02dcf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 200 additions and 108 deletions

View file

@ -76,18 +76,30 @@ main(int argc, char *argv[])
}
text[text_size] = '\0';
_PyInitError err;
_PyCoreConfig config;
_PyCoreConfig_InitIsolatedConfig(&config);
err = _PyCoreConfig_InitIsolatedConfig(&config);
if (_PyInitError_Failed(err)) {
_PyCoreConfig_Clear(&config);
_Py_ExitInitError(err);
}
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. */
config._install_importlib = 0;
config._init_main = 0;
_PyInitError err = _Py_InitializeFromConfig(&config);
/* No need to call _PyCoreConfig_Clear() since we didn't allocate any
memory: program_name is a constant string. */
err = _Py_InitializeFromConfig(&config);
_PyCoreConfig_Clear(&config);
if (_PyInitError_Failed(err)) {
_Py_ExitInitError(err);
}

View file

@ -317,7 +317,7 @@ dump_config(void)
}
static int test_init_default_config(void)
static int test_init_initialize_config(void)
{
_testembed_Py_Initialize();
dump_config();
@ -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)
{
/* FIXME: test Py_IgnoreEnvironmentFlag */
@ -380,7 +421,7 @@ static int test_init_from_config(void)
_PyInitError err;
_PyPreConfig preconfig;
_PyPreConfig_Init(&preconfig);
_PyPreConfig_InitCompatConfig(&preconfig);
putenv("PYTHONMALLOC=malloc_debug");
preconfig.allocator = PYMEM_ALLOCATOR_MALLOC;
@ -396,7 +437,7 @@ static int test_init_from_config(void)
/* Test _Py_InitializeFromConfig() */
_PyCoreConfig config;
_PyCoreConfig_Init(&config);
_PyCoreConfig_InitCompatConfig(&config);
config.install_signal_handlers = 0;
/* FIXME: test use_environment */
@ -676,7 +717,7 @@ static int test_preinit_isolated1(void)
_PyInitError err;
_PyPreConfig preconfig;
_PyPreConfig_Init(&preconfig);
_PyPreConfig_InitCompatConfig(&preconfig);
preconfig.isolated = 1;
err = _Py_PreInitialize(&preconfig);
@ -685,7 +726,7 @@ static int test_preinit_isolated1(void)
}
_PyCoreConfig config;
_PyCoreConfig_Init(&config);
_PyCoreConfig_InitCompatConfig(&config);
config.program_name = L"./_testembed";
set_all_env_vars();
@ -705,7 +746,7 @@ static int test_preinit_isolated2(void)
_PyInitError err;
_PyPreConfig preconfig;
_PyPreConfig_Init(&preconfig);
_PyPreConfig_InitCompatConfig(&preconfig);
preconfig.isolated = 0;
err = _Py_PreInitialize(&preconfig);
@ -715,7 +756,7 @@ static int test_preinit_isolated2(void)
/* Test _PyCoreConfig.isolated=1 */
_PyCoreConfig config;
_PyCoreConfig_Init(&config);
_PyCoreConfig_InitCompatConfig(&config);
Py_IsolatedFlag = 0;
config.isolated = 1;
@ -885,12 +926,14 @@ static int check_preinit_isolated_config(int preinit)
_PyCoreConfig config;
err = _PyCoreConfig_InitIsolatedConfig(&config);
if (_PyInitError_Failed(err)) {
_PyCoreConfig_Clear(&config);
_Py_ExitInitError(err);
}
config.program_name = L"./_testembed";
err = _Py_InitializeFromConfig(&config);
if (_PyInitError_Failed(err)) {
_PyCoreConfig_Clear(&config);
_Py_ExitInitError(err);
}
@ -1207,7 +1250,9 @@ static struct TestCase TestCases[] = {
{ "bpo20891", test_bpo20891 },
{ "initialize_twice", test_initialize_twice },
{ "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_from_config", test_init_from_config },
{ "init_parse_argv", test_init_parse_argv },