bpo-42002: Clean up initialization of the sys module. (GH-22642)

Makes the code clearer and make errors handling more correct.
This commit is contained in:
Serhiy Storchaka 2020-10-11 15:30:43 +03:00 committed by GitHub
parent 0ff8a3b374
commit fa1d83db62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 44 additions and 106 deletions

View File

@ -2649,18 +2649,7 @@ static struct PyModuleDef sysmodule = {
};
/* Updating the sys namespace, returning NULL pointer on error */
#define SET_SYS_FROM_STRING_BORROW(key, value) \
do { \
PyObject *v = (value); \
if (v == NULL) { \
goto err_occurred; \
} \
res = PyDict_SetItemString(sysdict, key, v); \
if (res < 0) { \
goto err_occurred; \
} \
} while (0)
#define SET_SYS_FROM_STRING(key, value) \
#define SET_SYS(key, value) \
do { \
PyObject *v = (value); \
if (v == NULL) { \
@ -2673,6 +2662,9 @@ static struct PyModuleDef sysmodule = {
} \
} while (0)
#define SET_SYS_FROM_STRING(key, value) \
SET_SYS(key, PyUnicode_FromString(value))
static PyStatus
_PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
{
@ -2681,65 +2673,48 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
/* stdin/stdout/stderr are set in pylifecycle.c */
SET_SYS_FROM_STRING_BORROW("__displayhook__",
PyDict_GetItemString(sysdict, "displayhook"));
SET_SYS_FROM_STRING_BORROW("__excepthook__",
PyDict_GetItemString(sysdict, "excepthook"));
SET_SYS_FROM_STRING_BORROW(
"__breakpointhook__",
PyDict_GetItemString(sysdict, "breakpointhook"));
SET_SYS_FROM_STRING_BORROW("__unraisablehook__",
PyDict_GetItemString(sysdict, "unraisablehook"));
#define COPY_SYS_ATTR(tokey, fromkey) \
SET_SYS(tokey, PyMapping_GetItemString(sysdict, fromkey))
SET_SYS_FROM_STRING("version",
PyUnicode_FromString(Py_GetVersion()));
SET_SYS_FROM_STRING("hexversion",
PyLong_FromLong(PY_VERSION_HEX));
SET_SYS_FROM_STRING("_git",
Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(),
COPY_SYS_ATTR("__displayhook__", "displayhook");
COPY_SYS_ATTR("__excepthook__", "excepthook");
COPY_SYS_ATTR("__breakpointhook__", "breakpointhook");
COPY_SYS_ATTR("__unraisablehook__", "unraisablehook");
#undef COPY_SYS_ATTR
SET_SYS_FROM_STRING("version", Py_GetVersion());
SET_SYS("hexversion", PyLong_FromLong(PY_VERSION_HEX));
SET_SYS("_git", Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(),
_Py_gitversion()));
SET_SYS_FROM_STRING("_framework", PyUnicode_FromString(_PYTHONFRAMEWORK));
SET_SYS_FROM_STRING("api_version",
PyLong_FromLong(PYTHON_API_VERSION));
SET_SYS_FROM_STRING("copyright",
PyUnicode_FromString(Py_GetCopyright()));
SET_SYS_FROM_STRING("platform",
PyUnicode_FromString(Py_GetPlatform()));
SET_SYS_FROM_STRING("maxsize",
PyLong_FromSsize_t(PY_SSIZE_T_MAX));
SET_SYS_FROM_STRING("float_info",
PyFloat_GetInfo());
SET_SYS_FROM_STRING("int_info",
PyLong_GetInfo());
SET_SYS_FROM_STRING("_framework", _PYTHONFRAMEWORK);
SET_SYS("api_version", PyLong_FromLong(PYTHON_API_VERSION));
SET_SYS_FROM_STRING("copyright", Py_GetCopyright());
SET_SYS_FROM_STRING("platform", Py_GetPlatform());
SET_SYS("maxsize", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
SET_SYS("float_info", PyFloat_GetInfo());
SET_SYS("int_info", PyLong_GetInfo());
/* initialize hash_info */
if (Hash_InfoType.tp_name == NULL) {
if (PyStructSequence_InitType2(&Hash_InfoType, &hash_info_desc) < 0) {
goto type_init_failed;
}
}
SET_SYS_FROM_STRING("hash_info",
get_hash_info(tstate));
SET_SYS_FROM_STRING("maxunicode",
PyLong_FromLong(0x10FFFF));
SET_SYS_FROM_STRING("builtin_module_names",
list_builtin_module_names());
SET_SYS("hash_info", get_hash_info(tstate));
SET_SYS("maxunicode", PyLong_FromLong(0x10FFFF));
SET_SYS("builtin_module_names", list_builtin_module_names());
#if PY_BIG_ENDIAN
SET_SYS_FROM_STRING("byteorder",
PyUnicode_FromString("big"));
SET_SYS_FROM_STRING("byteorder", "big");
#else
SET_SYS_FROM_STRING("byteorder",
PyUnicode_FromString("little"));
SET_SYS_FROM_STRING("byteorder", "little");
#endif
#ifdef MS_COREDLL
SET_SYS_FROM_STRING("dllhandle",
PyLong_FromVoidPtr(PyWin_DLLhModule));
SET_SYS_FROM_STRING("winver",
PyUnicode_FromString(PyWin_DLLVersionString));
SET_SYS("dllhandle", PyLong_FromVoidPtr(PyWin_DLLhModule));
SET_SYS_FROM_STRING("winver", PyWin_DLLVersionString);
#endif
#ifdef ABIFLAGS
SET_SYS_FROM_STRING("abiflags",
PyUnicode_FromString(ABIFLAGS));
SET_SYS_FROM_STRING("abiflags", ABIFLAGS);
#endif
/* version_info */
@ -2750,7 +2725,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
}
}
version_info = make_version_info(tstate);
SET_SYS_FROM_STRING("version_info", version_info);
SET_SYS("version_info", version_info);
/* prevent user from creating new instances */
VersionInfoType.tp_init = NULL;
VersionInfoType.tp_new = NULL;
@ -2760,7 +2735,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
}
/* implementation */
SET_SYS_FROM_STRING("implementation", make_impl_info(version_info));
SET_SYS("implementation", make_impl_info(version_info));
/* flags */
if (FlagsType.tp_name == 0) {
@ -2769,7 +2744,7 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
}
}
/* Set flags to their default values (updated by _PySys_InitMain()) */
SET_SYS_FROM_STRING("flags", make_flags(tstate));
SET_SYS("flags", make_flags(tstate));
#if defined(MS_WINDOWS)
/* getwindowsversion */
@ -2790,14 +2765,12 @@ _PySys_InitCore(PyThreadState *tstate, PyObject *sysdict)
/* float repr style: 0.03 (short) vs 0.029999999999999999 (legacy) */
#ifndef PY_NO_SHORT_FLOAT_REPR
SET_SYS_FROM_STRING("float_repr_style",
PyUnicode_FromString("short"));
SET_SYS_FROM_STRING("float_repr_style", "short");
#else
SET_SYS_FROM_STRING("float_repr_style",
PyUnicode_FromString("legacy"));
SET_SYS_FROM_STRING("float_repr_style", "legacy");
#endif
SET_SYS_FROM_STRING("thread_info", PyThread_GetInfo());
SET_SYS("thread_info", PyThread_GetInfo());
/* initialize asyncgen_hooks */
if (AsyncGenHooksType.tp_name == NULL) {
@ -2819,20 +2792,6 @@ err_occurred:
return _PyStatus_ERR("can't initialize sys module");
}
/* Updating the sys namespace, returning integer error codes */
#define SET_SYS_FROM_STRING_INT_RESULT(key, value) \
do { \
PyObject *v = (value); \
if (v == NULL) \
return -1; \
res = PyDict_SetItemString(sysdict, key, v); \
Py_DECREF(v); \
if (res < 0) { \
return res; \
} \
} while (0)
static int
sys_add_xoption(PyObject *opts, const wchar_t *s)
{
@ -2895,24 +2854,10 @@ _PySys_InitMain(PyThreadState *tstate)
int res;
#define COPY_LIST(KEY, VALUE) \
do { \
PyObject *list = _PyWideStringList_AsList(&(VALUE)); \
if (list == NULL) { \
return -1; \
} \
SET_SYS_FROM_STRING_BORROW(KEY, list); \
Py_DECREF(list); \
} while (0)
SET_SYS(KEY, _PyWideStringList_AsList(&(VALUE)));
#define SET_SYS_FROM_WSTR(KEY, VALUE) \
do { \
PyObject *str = PyUnicode_FromWideChar(VALUE, -1); \
if (str == NULL) { \
return -1; \
} \
SET_SYS_FROM_STRING_BORROW(KEY, str); \
Py_DECREF(str); \
} while (0)
SET_SYS(KEY, PyUnicode_FromWideChar(VALUE, -1));
COPY_LIST("path", config->module_search_paths);
@ -2934,19 +2879,14 @@ _PySys_InitMain(PyThreadState *tstate)
COPY_LIST("orig_argv", config->orig_argv);
COPY_LIST("warnoptions", config->warnoptions);
PyObject *xoptions = sys_create_xoptions_dict(config);
if (xoptions == NULL) {
return -1;
}
SET_SYS_FROM_STRING_BORROW("_xoptions", xoptions);
Py_DECREF(xoptions);
SET_SYS("_xoptions", sys_create_xoptions_dict(config));
#undef COPY_LIST
#undef SET_SYS_FROM_WSTR
/* Set flags to their final values */
SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags(tstate));
SET_SYS("flags", make_flags(tstate));
/* prevent user from creating new instances */
FlagsType.tp_init = NULL;
FlagsType.tp_new = NULL;
@ -2958,8 +2898,7 @@ _PySys_InitMain(PyThreadState *tstate)
_PyErr_Clear(tstate);
}
SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode",
PyBool_FromLong(!config->write_bytecode));
SET_SYS("dont_write_bytecode", PyBool_FromLong(!config->write_bytecode));
if (get_warnoptions(tstate) == NULL) {
return -1;
@ -2978,9 +2917,8 @@ err_occurred:
return -1;
}
#undef SET_SYS
#undef SET_SYS_FROM_STRING
#undef SET_SYS_FROM_STRING_BORROW
#undef SET_SYS_FROM_STRING_INT_RESULT
/* Set up a preliminary stderr printer until we have enough