mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	bpo-36763: PyConfig_Read() handles PySys_AddXOption() (GH-15431)
PyConfig_Read() is now responsible to handle early calls to PySys_AddXOption() and PySys_AddWarnOption(). Options added by PySys_AddXOption() are now handled the same way than PyConfig.xoptions and command line -X options. For example, PySys_AddXOption(L"faulthandler") enables faulthandler as expected.
This commit is contained in:
		
							parent
							
								
									1beb7c3de9
								
							
						
					
					
						commit
						120b707a6d
					
				
					 6 changed files with 115 additions and 30 deletions
				
			
		|  | @ -2037,36 +2037,43 @@ _clear_preinit_entries(_Py_PreInitEntry *optionlist) | |||
|     PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc); | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| _clear_all_preinit_options(void) | ||||
| 
 | ||||
| PyStatus | ||||
| _PySys_ReadPreinitWarnOptions(PyConfig *config) | ||||
| { | ||||
|     PyStatus status; | ||||
|     _Py_PreInitEntry entry; | ||||
| 
 | ||||
|     for (entry = _preinit_warnoptions; entry != NULL; entry = entry->next) { | ||||
|         status = PyWideStringList_Append(&config->warnoptions, entry->value); | ||||
|         if (_PyStatus_EXCEPTION(status)) { | ||||
|             return status; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     _clear_preinit_entries(&_preinit_warnoptions); | ||||
|     _clear_preinit_entries(&_preinit_xoptions); | ||||
|     return _PyStatus_OK(); | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| sys_read_preinit_options(PyThreadState *tstate) | ||||
| 
 | ||||
| PyStatus | ||||
| _PySys_ReadPreinitXOptions(PyConfig *config) | ||||
| { | ||||
|     /* Rerun the add commands with the actual sys module available */ | ||||
|     if (tstate == NULL) { | ||||
|         /* Still don't have a thread state, so something is wrong! */ | ||||
|         return -1; | ||||
|     } | ||||
|     _Py_PreInitEntry entry = _preinit_warnoptions; | ||||
|     while (entry != NULL) { | ||||
|         PySys_AddWarnOption(entry->value); | ||||
|         entry = entry->next; | ||||
|     } | ||||
|     entry = _preinit_xoptions; | ||||
|     while (entry != NULL) { | ||||
|         PySys_AddXOption(entry->value); | ||||
|         entry = entry->next; | ||||
|     PyStatus status; | ||||
|     _Py_PreInitEntry entry; | ||||
| 
 | ||||
|     for (entry = _preinit_xoptions; entry != NULL; entry = entry->next) { | ||||
|         status = PyWideStringList_Append(&config->xoptions, entry->value); | ||||
|         if (_PyStatus_EXCEPTION(status)) { | ||||
|             return status; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     _clear_all_preinit_options(); | ||||
|     return 0; | ||||
|     _clear_preinit_entries(&_preinit_xoptions); | ||||
|     return _PyStatus_OK(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static PyObject * | ||||
| get_warnoptions(PyThreadState *tstate) | ||||
| { | ||||
|  | @ -2235,9 +2242,7 @@ PySys_AddXOption(const wchar_t *s) | |||
|     } | ||||
|     if (_PySys_AddXOptionWithError(s) < 0) { | ||||
|         /* No return value, therefore clear error state if possible */ | ||||
|         if (tstate) { | ||||
|             _PyErr_Clear(tstate); | ||||
|         } | ||||
|         _PyErr_Clear(tstate); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -2898,11 +2903,6 @@ _PySys_InitMain(_PyRuntimeState *runtime, PyThreadState *tstate) | |||
|     if (get_xoptions(tstate) == NULL) | ||||
|         return -1; | ||||
| 
 | ||||
|     /* Transfer any sys.warnoptions and sys._xoptions set directly
 | ||||
|      * by an embedding application from the linked list to the module. */ | ||||
|     if (sys_read_preinit_options(tstate) != 0) | ||||
|         return -1; | ||||
| 
 | ||||
|     if (_PyErr_Occurred(tstate)) { | ||||
|         goto err_occurred; | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Stinner
						Victor Stinner