Skip to content

Commit 9fb713f

Browse files
authored
gh-153300: Set global configuration variables in PyConfig_Set() (#153301)
PyConfig_Set() now also set global configuration variables. For example, PyConfig_Set("inspect", value) now also sets Py_InspectFlag. Use PyConfig_Set() in main.c to set the inspect flag. Python code can now see the updated sys.flags.inspect value.
1 parent c9687b4 commit 9fb713f

4 files changed

Lines changed: 167 additions & 85 deletions

File tree

Lib/test/test_capi/test_config.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from test.support import import_helper
1010

1111
_testcapi = import_helper.import_module('_testcapi')
12+
_testinternalcapi = import_helper.import_module('_testinternalcapi')
1213

1314

1415
# Is the Py_STATS macro defined?
@@ -378,6 +379,46 @@ def expect_bool_not(value):
378379
finally:
379380
config_set(name, old_value)
380381

382+
def test_config_set_global_vars(self):
383+
# Test PyConfig_Set() with global configuration variables
384+
config_get = _testcapi.config_get
385+
config_set = _testcapi.config_set
386+
get_configs = _testinternalcapi.get_configs
387+
new_values = (0, 1, 5)
388+
389+
for name, global_name, not_value in (
390+
('bytes_warning', 'Py_BytesWarningFlag', False),
391+
('inspect', 'Py_InspectFlag', False),
392+
('interactive', 'Py_InteractiveFlag', False),
393+
('optimization_level', 'Py_OptimizeFlag', False),
394+
('parser_debug', 'Py_DebugFlag', False),
395+
('quiet', 'Py_QuietFlag', False),
396+
('use_environment', 'Py_IgnoreEnvironmentFlag', True),
397+
('verbose', 'Py_VerboseFlag', False),
398+
('write_bytecode', 'Py_DontWriteBytecodeFlag', True),
399+
400+
# Read-only variables
401+
#('buffered_stdio', 'Py_UnbufferedStdioFlag', True),
402+
#('isolated', 'Py_IsolatedFlag', False),
403+
#('pathconfig_warnings', 'Py_FrozenFlag', True),
404+
#('site_import', 'Py_NoSiteFlag', True),
405+
#('user_site_directory', 'Py_NoUserSiteDirectory', True),
406+
# Windows only
407+
#('legacy_windows_stdio', 'Py_LegacyWindowsStdioFlag', False)
408+
):
409+
with self.subTest(name=name):
410+
old_value = config_get(name)
411+
try:
412+
for value in new_values:
413+
config_set(name, value)
414+
global_config = get_configs()['global_config']
415+
expected = value
416+
if not_value:
417+
expected = int(not value)
418+
self.assertEqual(global_config[global_name], expected)
419+
finally:
420+
config_set(name, old_value)
421+
381422
def test_config_set_cpu_count(self):
382423
config_get = _testcapi.config_get
383424
config_set = _testcapi.config_set
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:c:func:`PyConfig_Set()` now also set global configuration variables. For
2+
example, ``PyConfig_Set("inspect", value)`` now also sets
3+
:c:var:`Py_InspectFlag`. Patch by Victor Stinner.

Modules/main.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -529,11 +529,15 @@ pymain_run_interactive_hook(int *exitcode)
529529
static void
530530
pymain_set_inspect(PyConfig *config, int inspect)
531531
{
532-
config->inspect = inspect;
533-
_Py_COMP_DIAG_PUSH
534-
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
535-
Py_InspectFlag = inspect;
536-
_Py_COMP_DIAG_POP
532+
PyObject *value = PyLong_FromLong(inspect);
533+
if (value == NULL || PyConfig_Set("inspect", value) < 0) {
534+
fprintf(stderr, "Could not set the inspect flag\n");
535+
PyErr_Print();
536+
}
537+
else {
538+
assert(config->inspect == inspect);
539+
}
540+
Py_XDECREF(value);
537541
}
538542

539543

@@ -635,7 +639,7 @@ pymain_run_python(int *exitcode)
635639
{
636640
PyObject *main_importer_path = NULL;
637641
PyInterpreterState *interp = _PyInterpreterState_GET();
638-
/* pymain_run_stdin() modify the config */
642+
/* pymain_repl() and pymain_run_stdin() modify the config */
639643
PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp);
640644

641645
/* ensure path config is written into global variables */

Python/initconfig.c

Lines changed: 113 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -84,120 +84,139 @@ typedef struct {
8484
config_sys_flag_setter flag_setter;
8585
} PyConfigSysSpec;
8686

87+
typedef struct {
88+
int *ptr;
89+
int not;
90+
} PyConfigGlobalVar;
91+
8792
typedef struct {
8893
const char *name;
8994
size_t offset;
9095
PyConfigMemberType type;
9196
PyConfigMemberVisibility visibility;
9297
PyConfigSysSpec sys;
98+
PyConfigGlobalVar global_var;
9399
} PyConfigSpec;
94100

95-
#define SPEC(MEMBER, TYPE, VISIBILITY, sys) \
101+
#define SPEC(MEMBER, TYPE, VISIBILITY, sys, global_var) \
96102
{#MEMBER, offsetof(PyConfig, MEMBER), \
97-
PyConfig_MEMBER_##TYPE, PyConfig_MEMBER_##VISIBILITY, sys}
103+
PyConfig_MEMBER_##TYPE, PyConfig_MEMBER_##VISIBILITY, sys, global_var}
98104

99105
#define SYS_ATTR(name) {name, -1, NULL}
100106
#define SYS_FLAG_SETTER(index, setter) {NULL, index, setter}
101107
#define SYS_FLAG(index) SYS_FLAG_SETTER(index, NULL)
102108
#define NO_SYS SYS_ATTR(NULL)
103109

110+
#define GLOBAL(ptr, not) {ptr, not}
111+
#define NO_GLOBAL GLOBAL(NULL, 0)
112+
113+
// Ignore deprecations on global variables such as Py_IsolatedFlag
114+
_Py_COMP_DIAG_PUSH
115+
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
116+
104117
// Update _test_embed_set_config when adding new members
105118
static const PyConfigSpec PYCONFIG_SPEC[] = {
106119
// --- Public options -----------
107120

108-
SPEC(argv, WSTR_LIST, PUBLIC, SYS_ATTR("argv")),
109-
SPEC(base_exec_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("base_exec_prefix")),
110-
SPEC(base_executable, WSTR_OPT, PUBLIC, SYS_ATTR("_base_executable")),
111-
SPEC(base_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("base_prefix")),
112-
SPEC(bytes_warning, UINT, PUBLIC, SYS_FLAG(9)),
113-
SPEC(cpu_count, INT, PUBLIC, NO_SYS),
114-
SPEC(lazy_imports, INT, PUBLIC, NO_SYS),
115-
SPEC(exec_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("exec_prefix")),
116-
SPEC(executable, WSTR_OPT, PUBLIC, SYS_ATTR("executable")),
117-
SPEC(inspect, BOOL, PUBLIC, SYS_FLAG(1)),
118-
SPEC(int_max_str_digits, UINT, PUBLIC, NO_SYS),
119-
SPEC(interactive, BOOL, PUBLIC, SYS_FLAG(2)),
120-
SPEC(module_search_paths, WSTR_LIST, PUBLIC, SYS_ATTR("path")),
121-
SPEC(optimization_level, UINT, PUBLIC, SYS_FLAG(3)),
122-
SPEC(parser_debug, BOOL, PUBLIC, SYS_FLAG(0)),
123-
SPEC(platlibdir, WSTR, PUBLIC, SYS_ATTR("platlibdir")),
124-
SPEC(prefix, WSTR_OPT, PUBLIC, SYS_ATTR("prefix")),
125-
SPEC(pycache_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("pycache_prefix")),
126-
SPEC(quiet, BOOL, PUBLIC, SYS_FLAG(10)),
127-
SPEC(stdlib_dir, WSTR_OPT, PUBLIC, SYS_ATTR("_stdlib_dir")),
128-
SPEC(use_environment, BOOL, PUBLIC, SYS_FLAG_SETTER(7, config_sys_flag_not)),
129-
SPEC(verbose, UINT, PUBLIC, SYS_FLAG(8)),
130-
SPEC(warnoptions, WSTR_LIST, PUBLIC, SYS_ATTR("warnoptions")),
131-
SPEC(write_bytecode, BOOL, PUBLIC, SYS_FLAG_SETTER(4, config_sys_flag_not)),
132-
SPEC(xoptions, WSTR_LIST, PUBLIC, SYS_ATTR("_xoptions")),
121+
SPEC(argv, WSTR_LIST, PUBLIC, SYS_ATTR("argv"), NO_GLOBAL),
122+
SPEC(base_exec_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("base_exec_prefix"), NO_GLOBAL),
123+
SPEC(base_executable, WSTR_OPT, PUBLIC, SYS_ATTR("_base_executable"), NO_GLOBAL),
124+
SPEC(base_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("base_prefix"), NO_GLOBAL),
125+
SPEC(bytes_warning, UINT, PUBLIC, SYS_FLAG(9), GLOBAL(&Py_BytesWarningFlag, 0)),
126+
SPEC(cpu_count, INT, PUBLIC, NO_SYS, NO_GLOBAL),
127+
SPEC(lazy_imports, INT, PUBLIC, NO_SYS, NO_GLOBAL),
128+
SPEC(exec_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("exec_prefix"), NO_GLOBAL),
129+
SPEC(executable, WSTR_OPT, PUBLIC, SYS_ATTR("executable"), NO_GLOBAL),
130+
SPEC(inspect, BOOL, PUBLIC, SYS_FLAG(1), GLOBAL(&Py_InspectFlag, 0)),
131+
SPEC(int_max_str_digits, UINT, PUBLIC, NO_SYS, NO_GLOBAL),
132+
SPEC(interactive, BOOL, PUBLIC, SYS_FLAG(2), GLOBAL(&Py_InteractiveFlag, 0)),
133+
SPEC(module_search_paths, WSTR_LIST, PUBLIC, SYS_ATTR("path"), NO_GLOBAL),
134+
SPEC(optimization_level, UINT, PUBLIC, SYS_FLAG(3), GLOBAL(&Py_OptimizeFlag, 0)),
135+
SPEC(parser_debug, BOOL, PUBLIC, SYS_FLAG(0), GLOBAL(&Py_DebugFlag, 0)),
136+
SPEC(platlibdir, WSTR, PUBLIC, SYS_ATTR("platlibdir"), NO_GLOBAL),
137+
SPEC(prefix, WSTR_OPT, PUBLIC, SYS_ATTR("prefix"), NO_GLOBAL),
138+
SPEC(pycache_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("pycache_prefix"), NO_GLOBAL),
139+
SPEC(quiet, BOOL, PUBLIC, SYS_FLAG(10), GLOBAL(&Py_QuietFlag, 0)),
140+
SPEC(stdlib_dir, WSTR_OPT, PUBLIC, SYS_ATTR("_stdlib_dir"), NO_GLOBAL),
141+
SPEC(use_environment, BOOL, PUBLIC,
142+
SYS_FLAG_SETTER(7, config_sys_flag_not), GLOBAL(&Py_IgnoreEnvironmentFlag, 1)),
143+
SPEC(verbose, UINT, PUBLIC, SYS_FLAG(8), GLOBAL(&Py_VerboseFlag, 0)),
144+
SPEC(warnoptions, WSTR_LIST, PUBLIC, SYS_ATTR("warnoptions"), NO_GLOBAL),
145+
SPEC(write_bytecode, BOOL, PUBLIC, SYS_FLAG_SETTER(4, config_sys_flag_not),
146+
GLOBAL(&Py_DontWriteBytecodeFlag, 1)),
147+
SPEC(xoptions, WSTR_LIST, PUBLIC, SYS_ATTR("_xoptions"), NO_GLOBAL),
133148

134149
// --- Read-only options -----------
135150

136151
#ifdef Py_STATS
137-
SPEC(_pystats, BOOL, READ_ONLY, NO_SYS),
152+
SPEC(_pystats, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
138153
#endif
139-
SPEC(buffered_stdio, BOOL, READ_ONLY, NO_SYS),
140-
SPEC(check_hash_pycs_mode, WSTR, READ_ONLY, NO_SYS),
141-
SPEC(code_debug_ranges, BOOL, READ_ONLY, NO_SYS),
142-
SPEC(configure_c_stdio, BOOL, READ_ONLY, NO_SYS),
143-
SPEC(dev_mode, BOOL, READ_ONLY, NO_SYS), // sys.flags.dev_mode
144-
SPEC(dump_refs, BOOL, READ_ONLY, NO_SYS),
145-
SPEC(dump_refs_file, WSTR_OPT, READ_ONLY, NO_SYS),
154+
SPEC(buffered_stdio, BOOL, READ_ONLY, NO_SYS,
155+
GLOBAL(&Py_UnbufferedStdioFlag, 1)),
156+
SPEC(check_hash_pycs_mode, WSTR, READ_ONLY, NO_SYS, NO_GLOBAL),
157+
SPEC(code_debug_ranges, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
158+
SPEC(configure_c_stdio, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
159+
SPEC(dev_mode, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL), // sys.flags.dev_mode
160+
SPEC(dump_refs, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
161+
SPEC(dump_refs_file, WSTR_OPT, READ_ONLY, NO_SYS, NO_GLOBAL),
146162
#ifdef Py_GIL_DISABLED
147-
SPEC(enable_gil, INT, READ_ONLY, NO_SYS),
148-
SPEC(tlbc_enabled, INT, READ_ONLY, NO_SYS),
163+
SPEC(enable_gil, INT, READ_ONLY, NO_SYS, NO_GLOBAL),
164+
SPEC(tlbc_enabled, INT, READ_ONLY, NO_SYS, NO_GLOBAL),
149165
#endif
150-
SPEC(faulthandler, BOOL, READ_ONLY, NO_SYS),
151-
SPEC(filesystem_encoding, WSTR, READ_ONLY, NO_SYS),
152-
SPEC(filesystem_errors, WSTR, READ_ONLY, NO_SYS),
153-
SPEC(hash_seed, ULONG, READ_ONLY, NO_SYS),
154-
SPEC(home, WSTR_OPT, READ_ONLY, NO_SYS),
155-
SPEC(thread_inherit_context, INT, READ_ONLY, NO_SYS),
156-
SPEC(context_aware_warnings, INT, READ_ONLY, NO_SYS),
157-
SPEC(import_time, UINT, READ_ONLY, NO_SYS),
158-
SPEC(install_signal_handlers, BOOL, READ_ONLY, NO_SYS),
159-
SPEC(isolated, BOOL, READ_ONLY, NO_SYS), // sys.flags.isolated
166+
SPEC(faulthandler, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
167+
SPEC(filesystem_encoding, WSTR, READ_ONLY, NO_SYS, NO_GLOBAL),
168+
SPEC(filesystem_errors, WSTR, READ_ONLY, NO_SYS, NO_GLOBAL),
169+
SPEC(hash_seed, ULONG, READ_ONLY, NO_SYS, NO_GLOBAL),
170+
SPEC(home, WSTR_OPT, READ_ONLY, NO_SYS, NO_GLOBAL),
171+
SPEC(thread_inherit_context, INT, READ_ONLY, NO_SYS, NO_GLOBAL),
172+
SPEC(context_aware_warnings, INT, READ_ONLY, NO_SYS, NO_GLOBAL),
173+
SPEC(import_time, UINT, READ_ONLY, NO_SYS, NO_GLOBAL),
174+
SPEC(install_signal_handlers, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
175+
SPEC(isolated, BOOL, READ_ONLY, NO_SYS, GLOBAL(&Py_IsolatedFlag, 0)), // sys.flags.isolated
160176
#ifdef MS_WINDOWS
161-
SPEC(legacy_windows_stdio, BOOL, READ_ONLY, NO_SYS),
177+
SPEC(legacy_windows_stdio, BOOL, READ_ONLY, NO_SYS,
178+
GLOBAL(&Py_LegacyWindowsStdioFlag, 0)),
162179
#endif
163-
SPEC(malloc_stats, BOOL, READ_ONLY, NO_SYS),
164-
SPEC(pymalloc_hugepages, BOOL, READ_ONLY, NO_SYS),
165-
SPEC(orig_argv, WSTR_LIST, READ_ONLY, SYS_ATTR("orig_argv")),
166-
SPEC(parse_argv, BOOL, READ_ONLY, NO_SYS),
167-
SPEC(pathconfig_warnings, BOOL, READ_ONLY, NO_SYS),
168-
SPEC(perf_profiling, UINT, READ_ONLY, NO_SYS),
169-
SPEC(remote_debug, BOOL, READ_ONLY, NO_SYS),
170-
SPEC(program_name, WSTR, READ_ONLY, NO_SYS),
171-
SPEC(run_command, WSTR_OPT, READ_ONLY, NO_SYS),
172-
SPEC(run_filename, WSTR_OPT, READ_ONLY, NO_SYS),
173-
SPEC(run_module, WSTR_OPT, READ_ONLY, NO_SYS),
180+
SPEC(malloc_stats, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
181+
SPEC(pymalloc_hugepages, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
182+
SPEC(orig_argv, WSTR_LIST, READ_ONLY, SYS_ATTR("orig_argv"), NO_GLOBAL),
183+
SPEC(parse_argv, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
184+
SPEC(pathconfig_warnings, BOOL, READ_ONLY, NO_SYS,
185+
GLOBAL(&Py_FrozenFlag, 1)),
186+
SPEC(perf_profiling, UINT, READ_ONLY, NO_SYS, NO_GLOBAL),
187+
SPEC(remote_debug, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
188+
SPEC(program_name, WSTR, READ_ONLY, NO_SYS, NO_GLOBAL),
189+
SPEC(run_command, WSTR_OPT, READ_ONLY, NO_SYS, NO_GLOBAL),
190+
SPEC(run_filename, WSTR_OPT, READ_ONLY, NO_SYS, NO_GLOBAL),
191+
SPEC(run_module, WSTR_OPT, READ_ONLY, NO_SYS, NO_GLOBAL),
174192
#ifdef Py_DEBUG
175-
SPEC(run_presite, WSTR_OPT, READ_ONLY, NO_SYS),
193+
SPEC(run_presite, WSTR_OPT, READ_ONLY, NO_SYS, NO_GLOBAL),
176194
#endif
177-
SPEC(safe_path, BOOL, READ_ONLY, NO_SYS),
178-
SPEC(show_ref_count, BOOL, READ_ONLY, NO_SYS),
179-
SPEC(site_import, BOOL, READ_ONLY, NO_SYS), // sys.flags.no_site
180-
SPEC(skip_source_first_line, BOOL, READ_ONLY, NO_SYS),
181-
SPEC(stdio_encoding, WSTR, READ_ONLY, NO_SYS),
182-
SPEC(stdio_errors, WSTR, READ_ONLY, NO_SYS),
183-
SPEC(tracemalloc, UINT, READ_ONLY, NO_SYS),
184-
SPEC(use_frozen_modules, BOOL, READ_ONLY, NO_SYS),
185-
SPEC(use_hash_seed, BOOL, READ_ONLY, NO_SYS),
195+
SPEC(safe_path, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
196+
SPEC(show_ref_count, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
197+
SPEC(site_import, BOOL, READ_ONLY, NO_SYS, GLOBAL(&Py_NoSiteFlag, 1)), // sys.flags.no_site
198+
SPEC(skip_source_first_line, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
199+
SPEC(stdio_encoding, WSTR, READ_ONLY, NO_SYS, NO_GLOBAL),
200+
SPEC(stdio_errors, WSTR, READ_ONLY, NO_SYS, NO_GLOBAL),
201+
SPEC(tracemalloc, UINT, READ_ONLY, NO_SYS, NO_GLOBAL),
202+
SPEC(use_frozen_modules, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
203+
SPEC(use_hash_seed, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
186204
#ifdef __APPLE__
187-
SPEC(use_system_logger, BOOL, READ_ONLY, NO_SYS),
205+
SPEC(use_system_logger, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
188206
#endif
189-
SPEC(user_site_directory, BOOL, READ_ONLY, NO_SYS), // sys.flags.no_user_site
190-
SPEC(warn_default_encoding, BOOL, READ_ONLY, NO_SYS),
207+
SPEC(user_site_directory, BOOL, READ_ONLY, NO_SYS,
208+
GLOBAL(&Py_NoUserSiteDirectory, 1)), // sys.flags.no_user_site
209+
SPEC(warn_default_encoding, BOOL, READ_ONLY, NO_SYS, NO_GLOBAL),
191210

192211
// --- Init-only options -----------
193212

194-
SPEC(_config_init, UINT, INIT_ONLY, NO_SYS),
195-
SPEC(_init_main, BOOL, INIT_ONLY, NO_SYS),
196-
SPEC(_install_importlib, BOOL, INIT_ONLY, NO_SYS),
197-
SPEC(_is_python_build, BOOL, INIT_ONLY, NO_SYS),
198-
SPEC(module_search_paths_set, BOOL, INIT_ONLY, NO_SYS),
199-
SPEC(pythonpath_env, WSTR_OPT, INIT_ONLY, NO_SYS),
200-
SPEC(sys_path_0, WSTR_OPT, INIT_ONLY, NO_SYS),
213+
SPEC(_config_init, UINT, INIT_ONLY, NO_SYS, NO_GLOBAL),
214+
SPEC(_init_main, BOOL, INIT_ONLY, NO_SYS, NO_GLOBAL),
215+
SPEC(_install_importlib, BOOL, INIT_ONLY, NO_SYS, NO_GLOBAL),
216+
SPEC(_is_python_build, BOOL, INIT_ONLY, NO_SYS, NO_GLOBAL),
217+
SPEC(module_search_paths_set, BOOL, INIT_ONLY, NO_SYS, NO_GLOBAL),
218+
SPEC(pythonpath_env, WSTR_OPT, INIT_ONLY, NO_SYS, NO_GLOBAL),
219+
SPEC(sys_path_0, WSTR_OPT, INIT_ONLY, NO_SYS, NO_GLOBAL),
201220

202221
// Array terminator
203222
{NULL, 0, 0, 0, NO_SYS},
@@ -233,11 +252,16 @@ static const PyConfigSpec PYPRECONFIG_SPEC[] = {
233252
{NULL, 0, 0, 0, NO_SYS},
234253
};
235254

255+
// End of ignoring deprecations on global variables
256+
_Py_COMP_DIAG_POP
257+
236258
#undef SPEC
237259
#undef SYS_ATTR
238260
#undef SYS_FLAG_SETTER
239261
#undef SYS_FLAG
240262
#undef NO_SYS
263+
#undef GLOBAL
264+
#undef NO_GLOBAL
241265

242266

243267
// Forward declarations
@@ -4996,6 +5020,16 @@ PyConfig_Set(const char *name, PyObject *value)
49965020
Py_UNREACHABLE();
49975021
}
49985022

5023+
// Set the global variable
5024+
if (spec->global_var.ptr != NULL) {
5025+
assert(has_int_value);
5026+
int value = int_value;
5027+
if (spec->global_var.not) {
5028+
value = !value;
5029+
}
5030+
*spec->global_var.ptr = value;
5031+
}
5032+
49995033
if (spec->sys.attr != NULL) {
50005034
// Set the sys attribute, but don't set PyInterpreterState.config
50015035
// to keep the code simple.

0 commit comments

Comments
 (0)