@@ -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+
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 (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