@@ -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+
8792typedef 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
105118static 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