Skip to content

Commit 6241d0d

Browse files
authored
[3.14] gh-153300: Set global configuration variables in PyConfig_Set() (#153301) (#153359)
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. (cherry picked from commit 9fb713f)
1 parent 762eb2e commit 6241d0d

4 files changed

Lines changed: 165 additions & 83 deletions

File tree

Lib/test/test_capi/test_config.py

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

1212
_testcapi = import_helper.import_module('_testcapi')
13+
_testinternalcapi = import_helper.import_module('_testinternalcapi')
1314

1415

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

381+
def test_config_set_global_vars(self):
382+
# Test PyConfig_Set() with global configuration variables
383+
config_get = _testcapi.config_get
384+
config_set = _testcapi.config_set
385+
get_configs = _testinternalcapi.get_configs
386+
new_values = (0, 1, 5)
387+
388+
for name, global_name, not_value in (
389+
('bytes_warning', 'Py_BytesWarningFlag', False),
390+
('inspect', 'Py_InspectFlag', False),
391+
('interactive', 'Py_InteractiveFlag', False),
392+
('optimization_level', 'Py_OptimizeFlag', False),
393+
('parser_debug', 'Py_DebugFlag', False),
394+
('quiet', 'Py_QuietFlag', False),
395+
('use_environment', 'Py_IgnoreEnvironmentFlag', True),
396+
('verbose', 'Py_VerboseFlag', False),
397+
('write_bytecode', 'Py_DontWriteBytecodeFlag', True),
398+
399+
# Read-only variables
400+
#('buffered_stdio', 'Py_UnbufferedStdioFlag', True),
401+
#('isolated', 'Py_IsolatedFlag', False),
402+
#('pathconfig_warnings', 'Py_FrozenFlag', True),
403+
#('site_import', 'Py_NoSiteFlag', True),
404+
#('user_site_directory', 'Py_NoUserSiteDirectory', True),
405+
# Windows only
406+
#('legacy_windows_stdio', 'Py_LegacyWindowsStdioFlag', False)
407+
):
408+
with self.subTest(name=name):
409+
old_value = config_get(name)
410+
try:
411+
for value in new_values:
412+
config_set(name, value)
413+
global_config = get_configs()['global_config']
414+
expected = value
415+
if not_value:
416+
expected = int(not value)
417+
self.assertEqual(global_config[global_name], expected)
418+
finally:
419+
config_set(name, old_value)
420+
380421
def test_config_set_cpu_count(self):
381422
config_get = _testcapi.config_get
382423
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
@@ -531,11 +531,15 @@ pymain_run_interactive_hook(int *exitcode)
531531
static void
532532
pymain_set_inspect(PyConfig *config, int inspect)
533533
{
534-
config->inspect = inspect;
535-
_Py_COMP_DIAG_PUSH
536-
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
537-
Py_InspectFlag = inspect;
538-
_Py_COMP_DIAG_POP
534+
PyObject *value = PyLong_FromLong(inspect);
535+
if (value == NULL || PyConfig_Set("inspect", value) < 0) {
536+
fprintf(stderr, "Could not set the inspect flag\n");
537+
PyErr_Print();
538+
}
539+
else {
540+
assert(config->inspect == inspect);
541+
}
542+
Py_XDECREF(value);
539543
}
540544

541545

@@ -615,7 +619,7 @@ pymain_run_python(int *exitcode)
615619
{
616620
PyObject *main_importer_path = NULL;
617621
PyInterpreterState *interp = _PyInterpreterState_GET();
618-
/* pymain_run_stdin() modify the config */
622+
/* pymain_repl() and pymain_run_stdin() modify the config */
619623
PyConfig *config = (PyConfig*)_PyInterpreterState_GetConfig(interp);
620624

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

Python/initconfig.c

Lines changed: 111 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -84,118 +84,137 @@ 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(exec_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("exec_prefix")),
115-
SPEC(executable, WSTR_OPT, PUBLIC, SYS_ATTR("executable")),
116-
SPEC(inspect, BOOL, PUBLIC, SYS_FLAG(1)),
117-
SPEC(int_max_str_digits, UINT, PUBLIC, NO_SYS),
118-
SPEC(interactive, BOOL, PUBLIC, SYS_FLAG(2)),
119-
SPEC(module_search_paths, WSTR_LIST, PUBLIC, SYS_ATTR("path")),
120-
SPEC(optimization_level, UINT, PUBLIC, SYS_FLAG(3)),
121-
SPEC(parser_debug, BOOL, PUBLIC, SYS_FLAG(0)),
122-
SPEC(platlibdir, WSTR, PUBLIC, SYS_ATTR("platlibdir")),
123-
SPEC(prefix, WSTR_OPT, PUBLIC, SYS_ATTR("prefix")),
124-
SPEC(pycache_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("pycache_prefix")),
125-
SPEC(quiet, BOOL, PUBLIC, SYS_FLAG(10)),
126-
SPEC(stdlib_dir, WSTR_OPT, PUBLIC, SYS_ATTR("_stdlib_dir")),
127-
SPEC(use_environment, BOOL, PUBLIC, SYS_FLAG_SETTER(7, config_sys_flag_not)),
128-
SPEC(verbose, UINT, PUBLIC, SYS_FLAG(8)),
129-
SPEC(warnoptions, WSTR_LIST, PUBLIC, SYS_ATTR("warnoptions")),
130-
SPEC(write_bytecode, BOOL, PUBLIC, SYS_FLAG_SETTER(4, config_sys_flag_not)),
131-
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(exec_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("exec_prefix"), NO_GLOBAL),
128+
SPEC(executable, WSTR_OPT, PUBLIC, SYS_ATTR("executable"), NO_GLOBAL),
129+
SPEC(inspect, BOOL, PUBLIC, SYS_FLAG(1), GLOBAL(&Py_InspectFlag, 0)),
130+
SPEC(int_max_str_digits, UINT, PUBLIC, NO_SYS, NO_GLOBAL),
131+
SPEC(interactive, BOOL, PUBLIC, SYS_FLAG(2), GLOBAL(&Py_InteractiveFlag, 0)),
132+
SPEC(module_search_paths, WSTR_LIST, PUBLIC, SYS_ATTR("path"), NO_GLOBAL),
133+
SPEC(optimization_level, UINT, PUBLIC, SYS_FLAG(3), GLOBAL(&Py_OptimizeFlag, 0)),
134+
SPEC(parser_debug, BOOL, PUBLIC, SYS_FLAG(0), GLOBAL(&Py_DebugFlag, 0)),
135+
SPEC(platlibdir, WSTR, PUBLIC, SYS_ATTR("platlibdir"), NO_GLOBAL),
136+
SPEC(prefix, WSTR_OPT, PUBLIC, SYS_ATTR("prefix"), NO_GLOBAL),
137+
SPEC(pycache_prefix, WSTR_OPT, PUBLIC, SYS_ATTR("pycache_prefix"), NO_GLOBAL),
138+
SPEC(quiet, BOOL, PUBLIC, SYS_FLAG(10), GLOBAL(&Py_QuietFlag, 0)),
139+
SPEC(stdlib_dir, WSTR_OPT, PUBLIC, SYS_ATTR("_stdlib_dir"), NO_GLOBAL),
140+
SPEC(use_environment, BOOL, PUBLIC,
141+
SYS_FLAG_SETTER(7, config_sys_flag_not), GLOBAL(&Py_IgnoreEnvironmentFlag, 1)),
142+
SPEC(verbose, UINT, PUBLIC, SYS_FLAG(8), GLOBAL(&Py_VerboseFlag, 0)),
143+
SPEC(warnoptions, WSTR_LIST, PUBLIC, SYS_ATTR("warnoptions"), NO_GLOBAL),
144+
SPEC(write_bytecode, BOOL, PUBLIC, SYS_FLAG_SETTER(4, config_sys_flag_not),
145+
GLOBAL(&Py_DontWriteBytecodeFlag, 1)),
146+
SPEC(xoptions, WSTR_LIST, PUBLIC, SYS_ATTR("_xoptions"), NO_GLOBAL),
132147

133148
// --- Read-only options -----------
134149

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

190209
// --- Init-only options -----------
191210

192-
SPEC(_config_init, UINT, INIT_ONLY, NO_SYS),
193-
SPEC(_init_main, BOOL, INIT_ONLY, NO_SYS),
194-
SPEC(_install_importlib, BOOL, INIT_ONLY, NO_SYS),
195-
SPEC(_is_python_build, BOOL, INIT_ONLY, NO_SYS),
196-
SPEC(module_search_paths_set, BOOL, INIT_ONLY, NO_SYS),
197-
SPEC(pythonpath_env, WSTR_OPT, INIT_ONLY, NO_SYS),
198-
SPEC(sys_path_0, WSTR_OPT, INIT_ONLY, NO_SYS),
211+
SPEC(_config_init, UINT, INIT_ONLY, NO_SYS, NO_GLOBAL),
212+
SPEC(_init_main, BOOL, INIT_ONLY, NO_SYS, NO_GLOBAL),
213+
SPEC(_install_importlib, BOOL, INIT_ONLY, NO_SYS, NO_GLOBAL),
214+
SPEC(_is_python_build, BOOL, INIT_ONLY, NO_SYS, NO_GLOBAL),
215+
SPEC(module_search_paths_set, BOOL, INIT_ONLY, NO_SYS, NO_GLOBAL),
216+
SPEC(pythonpath_env, WSTR_OPT, INIT_ONLY, NO_SYS, NO_GLOBAL),
217+
SPEC(sys_path_0, WSTR_OPT, INIT_ONLY, NO_SYS, NO_GLOBAL),
199218

200219
// Array terminator
201220
{NULL, 0, 0, 0, NO_SYS},
@@ -231,11 +250,16 @@ static const PyConfigSpec PYPRECONFIG_SPEC[] = {
231250
{NULL, 0, 0, 0, NO_SYS},
232251
};
233252

253+
// End of ignoring deprecations on global variables
254+
_Py_COMP_DIAG_POP
255+
234256
#undef SPEC
235257
#undef SYS_ATTR
236258
#undef SYS_FLAG_SETTER
237259
#undef SYS_FLAG
238260
#undef NO_SYS
261+
#undef GLOBAL
262+
#undef NO_GLOBAL
239263

240264

241265
// Forward declarations
@@ -4729,6 +4753,16 @@ PyConfig_Set(const char *name, PyObject *value)
47294753
Py_UNREACHABLE();
47304754
}
47314755

4756+
// Set the global variable
4757+
if (spec->global_var.ptr != NULL) {
4758+
assert(has_int_value);
4759+
int value = int_value;
4760+
if (spec->global_var.not) {
4761+
value = !value;
4762+
}
4763+
*spec->global_var.ptr = value;
4764+
}
4765+
47324766
if (spec->sys.attr != NULL) {
47334767
// Set the sys attribute, but don't set PyInterpreterState.config
47344768
// to keep the code simple.

0 commit comments

Comments
 (0)