Skip to content

Commit 2b822a0

Browse files
authored
bpo-32652: Defer pymain_set_global_config() call (#5303)
In Py_Main(), don't call pymain_set_global_config() early: only call it when the whole configuration has been read. Add an unit test to prevent future regression.
1 parent cab0b2b commit 2b822a0

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

Lib/test/test_utf8_mode.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,21 @@ def check(utf8_opt, expected, **kw):
223223
c_arg = arg_ascii
224224
check('utf8=0', [c_arg], LC_ALL='C')
225225

226+
def test_optim_level(self):
227+
# CPython: check that Py_Main() doesn't increment Py_OptimizeFlag
228+
# twice when -X utf8 requires to parse the configuration twice (when
229+
# the encoding changes after reading the configuration, the
230+
# configuration is read again with the new encoding).
231+
code = 'import sys; print(sys.flags.optimize)'
232+
out = self.get_output('-X', 'utf8', '-O', '-c', code)
233+
self.assertEqual(out, '1')
234+
out = self.get_output('-X', 'utf8', '-OO', '-c', code)
235+
self.assertEqual(out, '2')
236+
237+
code = 'import sys; print(sys.flags.ignore_environment)'
238+
out = self.get_output('-X', 'utf8', '-E', '-c', code)
239+
self.assertEqual(out, '1')
240+
226241

227242
if __name__ == "__main__":
228243
unittest.main()

Modules/main.c

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1909,22 +1909,24 @@ pymain_read_conf_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
19091909
return -1;
19101910
}
19111911

1912-
/* Global configuration variables should be set to read the core
1913-
configuration, and then get again to get updated values.
1914-
1915-
_PyPathConfig_Init() tests !Py_FrozenFlag to avoid some warnings.
1916-
Moreover, on Windows, it modifies Py_IsolatedFlag and Py_NoSiteFlag
1917-
variables if a "._pth" file is found. */
1918-
pymain_set_global_config(pymain, cmdline);
1912+
/* On Windows, _PyPathConfig_Init() modifies Py_IsolatedFlag and
1913+
Py_NoSiteFlag variables if a "._pth" file is found. */
1914+
int init_isolated = Py_IsolatedFlag;
1915+
int init_no_site = Py_NoSiteFlag;
1916+
Py_IsolatedFlag = cmdline->isolated;
1917+
Py_NoSiteFlag = cmdline->no_site_import;
19191918

19201919
err = _PyCoreConfig_Read(config);
1920+
1921+
cmdline->isolated = Py_IsolatedFlag;
1922+
cmdline->no_site_import = Py_NoSiteFlag;
1923+
Py_IsolatedFlag = init_isolated;
1924+
Py_NoSiteFlag = init_no_site;
1925+
19211926
if (_Py_INIT_FAILED(err)) {
19221927
pymain->err = err;
19231928
return -1;
19241929
}
1925-
1926-
Py_UTF8Mode = pymain->config.utf8_mode;
1927-
pymain_get_global_config(pymain, cmdline);
19281930
return 0;
19291931
}
19301932

@@ -1948,8 +1950,6 @@ pymain_read_conf(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
19481950
int locale_coerced = 0;
19491951
int loops = 0;
19501952
int init_ignore_env = pymain->config.ignore_environment;
1951-
int init_isolated = cmdline->isolated;
1952-
int init_no_site = cmdline->no_site_import;
19531953

19541954
while (1) {
19551955
int utf8_mode = pymain->config.utf8_mode;
@@ -2011,8 +2011,6 @@ pymain_read_conf(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
20112011
modified by _PyCoreConfig_Read(). */
20122012
Py_UTF8Mode = pymain->config.utf8_mode;
20132013
Py_IgnoreEnvironmentFlag = init_ignore_env;
2014-
Py_IsolatedFlag = init_isolated;
2015-
Py_NoSiteFlag = init_no_site;
20162014
_PyCoreConfig_Clear(&pymain->config);
20172015
pymain_clear_cmdline(pymain, cmdline);
20182016
pymain_get_global_config(pymain, cmdline);

0 commit comments

Comments
 (0)