summaryrefslogtreecommitdiff
path: root/Python/sysmodule.c
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2017-05-22 21:36:03 -0700
committerGitHub <noreply@github.com>2017-05-22 21:36:03 -0700
commit6b4be195cd8868b76eb6fbe166acc39beee8ce36 (patch)
treebbab44fad32c576b9eb7e4b83368e200adc33f00 /Python/sysmodule.c
parentf9169ce6b48c7cc7cc62d9eb5e4ee1ac7066d14b (diff)
downloadcpython-git-6b4be195cd8868b76eb6fbe166acc39beee8ce36.tar.gz
bpo-22257: Small changes for PEP 432. (#1728)
PEP 432 specifies a number of large changes to interpreter startup code, including exposing a cleaner C-API. The major changes depend on a number of smaller changes. This patch includes all those smaller changes.
Diffstat (limited to 'Python/sysmodule.c')
-rw-r--r--Python/sysmodule.c133
1 files changed, 91 insertions, 42 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 2da77025b0..a7b7508f4a 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -1900,16 +1900,7 @@ static struct PyModuleDef sysmodule = {
NULL
};
-PyObject *
-_PySys_Init(void)
-{
- PyObject *m, *sysdict, *version_info;
- int res;
-
- m = PyModule_Create(&sysmodule);
- if (m == NULL)
- return NULL;
- sysdict = PyModule_GetDict(m);
+/* Updating the sys namespace, returning NULL pointer on error */
#define SET_SYS_FROM_STRING_BORROW(key, value) \
do { \
PyObject *v = (value); \
@@ -1932,6 +1923,17 @@ _PySys_Init(void)
} \
} while (0)
+PyObject *
+_PySys_BeginInit(void)
+{
+ PyObject *m, *sysdict, *version_info;
+ int res;
+
+ m = PyModule_Create(&sysmodule);
+ if (m == NULL)
+ return NULL;
+ sysdict = PyModule_GetDict(m);
+
/* Check that stdin is not a directory
Using shell redirection, you can redirect stdin to a directory,
crashing the Python interpreter. Catch this common mistake here
@@ -1963,25 +1965,12 @@ _PySys_Init(void)
SET_SYS_FROM_STRING("_git",
Py_BuildValue("(szz)", "CPython", _Py_gitidentifier(),
_Py_gitversion()));
- SET_SYS_FROM_STRING("dont_write_bytecode",
- PyBool_FromLong(Py_DontWriteBytecodeFlag));
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("executable",
- PyUnicode_FromWideChar(
- Py_GetProgramFullPath(), -1));
- SET_SYS_FROM_STRING("prefix",
- PyUnicode_FromWideChar(Py_GetPrefix(), -1));
- SET_SYS_FROM_STRING("exec_prefix",
- PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
- SET_SYS_FROM_STRING("base_prefix",
- PyUnicode_FromWideChar(Py_GetPrefix(), -1));
- SET_SYS_FROM_STRING("base_exec_prefix",
- PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
SET_SYS_FROM_STRING("maxsize",
PyLong_FromSsize_t(PY_SSIZE_T_MAX));
SET_SYS_FROM_STRING("float_info",
@@ -2017,17 +2006,6 @@ _PySys_Init(void)
SET_SYS_FROM_STRING("abiflags",
PyUnicode_FromString(ABIFLAGS));
#endif
- if (warnoptions == NULL) {
- warnoptions = PyList_New(0);
- if (warnoptions == NULL)
- return NULL;
- }
- else {
- Py_INCREF(warnoptions);
- }
- SET_SYS_FROM_STRING_BORROW("warnoptions", warnoptions);
-
- SET_SYS_FROM_STRING_BORROW("_xoptions", get_xoptions());
/* version_info */
if (VersionInfoType.tp_name == NULL) {
@@ -2052,13 +2030,8 @@ _PySys_Init(void)
if (PyStructSequence_InitType2(&FlagsType, &flags_desc) < 0)
return NULL;
}
+ /* Set flags to their default values */
SET_SYS_FROM_STRING("flags", make_flags());
- /* prevent user from creating new instances */
- FlagsType.tp_init = NULL;
- FlagsType.tp_new = NULL;
- res = PyDict_DelItemString(FlagsType.tp_dict, "__new__");
- if (res < 0 && PyErr_ExceptionMatches(PyExc_KeyError))
- PyErr_Clear();
#if defined(MS_WINDOWS)
/* getwindowsversion */
@@ -2095,13 +2068,89 @@ _PySys_Init(void)
}
}
-#undef SET_SYS_FROM_STRING
-#undef SET_SYS_FROM_STRING_BORROW
if (PyErr_Occurred())
return NULL;
return m;
}
+#undef SET_SYS_FROM_STRING
+#undef SET_SYS_FROM_STRING_BORROW
+
+/* Updating the sys namespace, returning integer error codes */
+#define SET_SYS_FROM_STRING_BORROW_INT_RESULT(key, value) \
+ do { \
+ PyObject *v = (value); \
+ if (v == NULL) \
+ return -1; \
+ res = PyDict_SetItemString(sysdict, key, v); \
+ if (res < 0) { \
+ return res; \
+ } \
+ } while (0)
+#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)
+
+int
+_PySys_EndInit(PyObject *sysdict)
+{
+ int res;
+
+ /* Set flags to their final values */
+ SET_SYS_FROM_STRING_INT_RESULT("flags", make_flags());
+ /* prevent user from creating new instances */
+ FlagsType.tp_init = NULL;
+ FlagsType.tp_new = NULL;
+ res = PyDict_DelItemString(FlagsType.tp_dict, "__new__");
+ if (res < 0) {
+ if (!PyErr_ExceptionMatches(PyExc_KeyError)) {
+ return res;
+ }
+ PyErr_Clear();
+ }
+
+ SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode",
+ PyBool_FromLong(Py_DontWriteBytecodeFlag));
+ SET_SYS_FROM_STRING_INT_RESULT("executable",
+ PyUnicode_FromWideChar(
+ Py_GetProgramFullPath(), -1));
+ SET_SYS_FROM_STRING_INT_RESULT("prefix",
+ PyUnicode_FromWideChar(Py_GetPrefix(), -1));
+ SET_SYS_FROM_STRING_INT_RESULT("exec_prefix",
+ PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
+ SET_SYS_FROM_STRING_INT_RESULT("base_prefix",
+ PyUnicode_FromWideChar(Py_GetPrefix(), -1));
+ SET_SYS_FROM_STRING_INT_RESULT("base_exec_prefix",
+ PyUnicode_FromWideChar(Py_GetExecPrefix(), -1));
+
+ if (warnoptions == NULL) {
+ warnoptions = PyList_New(0);
+ if (warnoptions == NULL)
+ return -1;
+ }
+ else {
+ Py_INCREF(warnoptions);
+ }
+ SET_SYS_FROM_STRING_BORROW_INT_RESULT("warnoptions", warnoptions);
+
+ SET_SYS_FROM_STRING_BORROW_INT_RESULT("_xoptions", get_xoptions());
+
+ if (PyErr_Occurred())
+ return -1;
+ return 0;
+}
+
+#undef SET_SYS_FROM_STRING_INT_RESULT
+#undef SET_SYS_FROM_STRING_BORROW_INT_RESULT
+
static PyObject *
makepathobject(const wchar_t *path, wchar_t delim)
{