summaryrefslogtreecommitdiff
path: root/Python/sysmodule.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-08-23 18:03:08 +0100
committerGitHub <noreply@github.com>2019-08-23 18:03:08 +0100
commit120b707a6d43452e067daa55a8fdca69f9424abc (patch)
tree1a58f651b55fde0a820646fdbf8b568657883273 /Python/sysmodule.c
parent1beb7c3de9c3d0e802e4267a11d937e8f024d661 (diff)
downloadcpython-git-120b707a6d43452e067daa55a8fdca69f9424abc.tar.gz
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.
Diffstat (limited to 'Python/sysmodule.c')
-rw-r--r--Python/sysmodule.c58
1 files changed, 29 insertions, 29 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 738bbc826f..0635e9d834 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -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;
}