[Python-checkins] bpo-34523: Use _PyCoreConfig instead of globals (GH-9005)

Victor Stinner webhook-mailer at python.org
Wed Aug 29 18:50:52 EDT 2018


https://github.com/python/cpython/commit/fbca90856d96273fd87c0b126f6e7966af7fbf7b
commit: fbca90856d96273fd87c0b126f6e7966af7fbf7b
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018-08-30T00:50:45+02:00
summary:

bpo-34523: Use _PyCoreConfig instead of globals (GH-9005)

Use the core configuration of the interpreter, rather
than using global configuration variables. For example, replace
Py_QuietFlag with core_config->quiet.

files:
M Include/pylifecycle.h
M Include/pystate.h
M Modules/main.c
M Python/bltinmodule.c
M Python/pylifecycle.c
M Python/sysmodule.c

diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h
index b84568e54c1a..04e672e96e17 100644
--- a/Include/pylifecycle.h
+++ b/Include/pylifecycle.h
@@ -123,7 +123,7 @@ PyAPI_FUNC(const char *) _Py_gitversion(void);
 #ifndef Py_LIMITED_API
 PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void);
 PyAPI_FUNC(_PyInitError) _PySys_BeginInit(PyObject **sysmod);
-PyAPI_FUNC(int) _PySys_EndInit(PyObject *sysdict, _PyMainInterpreterConfig *config);
+PyAPI_FUNC(int) _PySys_EndInit(PyObject *sysdict, PyInterpreterState *interp);
 PyAPI_FUNC(_PyInitError) _PyImport_Init(PyInterpreterState *interp);
 PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod);
 PyAPI_FUNC(_PyInitError) _PyImportHooks_Init(void);
diff --git a/Include/pystate.h b/Include/pystate.h
index e410665e35d4..80ee0d112daa 100644
--- a/Include/pystate.h
+++ b/Include/pystate.h
@@ -249,7 +249,9 @@ PyAPI_FUNC(void) PyInterpreterState_Delete(PyInterpreterState *);
 PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_Get(void);
 #endif
 #ifdef Py_BUILD_CORE
-   /* Macro which should only be used for performance critical code */
+   /* Macro which should only be used for performance critical code.
+      Need "#include "internal/pystate.h". See also _PyInterpreterState_Get()
+      and _PyGILState_GetInterpreterStateUnsafe(). */
 #  define _PyInterpreterState_GET_UNSAFE() (PyThreadState_GET()->interp)
 #endif
 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000
@@ -369,7 +371,9 @@ PyAPI_FUNC(int) PyGILState_Check(void);
    GILState implementation.
 
    Return NULL before _PyGILState_Init() is called and after _PyGILState_Fini()
-   is called. */
+   is called.
+
+   See also _PyInterpreterState_Get() and _PyInterpreterState_GET_UNSAFE(). */
 PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void);
 #endif   /* !Py_LIMITED_API */
 
diff --git a/Modules/main.c b/Modules/main.c
index bf7290a54a45..1ab555b42de4 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -951,18 +951,18 @@ pymain_init_stdio(_PyMain *pymain, _PyCoreConfig *config)
 
 
 static void
-pymain_header(_PyMain *pymain)
+pymain_header(_PyMain *pymain, const _PyCoreConfig *config)
 {
-    if (Py_QuietFlag) {
+    if (config->quiet) {
         return;
     }
 
-    if (!Py_VerboseFlag && (RUN_CODE(pymain) || !pymain->stdin_is_interactive)) {
+    if (!config->verbose && (RUN_CODE(pymain) || !pymain->stdin_is_interactive)) {
         return;
     }
 
     fprintf(stderr, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
-    if (!Py_NoSiteFlag) {
+    if (config->site_import) {
         fprintf(stderr, "%s\n", COPYRIGHT);
     }
 }
@@ -1041,12 +1041,12 @@ wstrlist_as_pylist(int len, wchar_t **list)
 
 
 static void
-pymain_import_readline(_PyMain *pymain)
+pymain_import_readline(_PyMain *pymain, const _PyCoreConfig *config)
 {
-    if (Py_IsolatedFlag) {
+    if (config->isolated) {
         return;
     }
-    if (!Py_InspectFlag && RUN_CODE(pymain)) {
+    if (!config->inspect && RUN_CODE(pymain)) {
         return;
     }
     if (!isatty(fileno(stdin))) {
@@ -1591,8 +1591,8 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp)
 
     PyCompilerFlags cf = {.cf_flags = 0};
 
-    pymain_header(pymain);
-    pymain_import_readline(pymain);
+    pymain_header(pymain, config);
+    pymain_import_readline(pymain, config);
 
     if (pymain->command) {
         pymain->status = pymain_run_command(pymain->command, &cf);
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 8aa1ba01d659..a23bdc1078c9 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -2,6 +2,7 @@
 
 #include "Python.h"
 #include "Python-ast.h"
+#include "internal/pystate.h"
 
 #include "node.h"
 #include "code.h"
@@ -2765,6 +2766,8 @@ _PyBuiltin_Init(void)
 {
     PyObject *mod, *dict, *debug;
 
+    const _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config;
+
     if (PyType_Ready(&PyFilter_Type) < 0 ||
         PyType_Ready(&PyMap_Type) < 0 ||
         PyType_Ready(&PyZip_Type) < 0)
@@ -2823,7 +2826,7 @@ _PyBuiltin_Init(void)
     SETBUILTIN("tuple",                 &PyTuple_Type);
     SETBUILTIN("type",                  &PyType_Type);
     SETBUILTIN("zip",                   &PyZip_Type);
-    debug = PyBool_FromLong(Py_OptimizeFlag == 0);
+    debug = PyBool_FromLong(config->optimization_level == 0);
     if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
         Py_DECREF(debug);
         return NULL;
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index ad55b2c2c787..7d17f2e65e42 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -800,7 +800,7 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp,
         return _Py_INIT_ERR("can't initialize time");
     }
 
-    if (_PySys_EndInit(interp->sysdict, &interp->config) < 0) {
+    if (_PySys_EndInit(interp->sysdict, interp) < 0) {
         return _Py_INIT_ERR("can't finish initializing sys");
     }
 
@@ -1285,7 +1285,7 @@ new_interpreter(PyThreadState **tstate_p)
             goto handle_error;
         Py_INCREF(interp->sysdict);
         PyDict_SetItemString(interp->sysdict, "modules", modules);
-        _PySys_EndInit(interp->sysdict, &interp->config);
+        _PySys_EndInit(interp->sysdict, interp);
     }
 
     bimod = _PyImport_FindBuiltin("builtins", modules);
@@ -1543,7 +1543,7 @@ is_valid_fd(int fd)
 
 /* returns Py_None if the fd is not valid */
 static PyObject*
-create_stdio(PyObject* io,
+create_stdio(const _PyCoreConfig *config, PyObject* io,
     int fd, int write_mode, const char* name,
     const char* encoding, const char* errors)
 {
@@ -1556,6 +1556,7 @@ create_stdio(PyObject* io,
     _Py_IDENTIFIER(isatty);
     _Py_IDENTIFIER(TextIOWrapper);
     _Py_IDENTIFIER(mode);
+    const int buffered_stdio = config->buffered_stdio;
 
     if (!is_valid_fd(fd))
         Py_RETURN_NONE;
@@ -1565,7 +1566,7 @@ create_stdio(PyObject* io,
        depends on the presence of a read1() method which only exists on
        buffered streams.
     */
-    if (Py_UnbufferedStdioFlag && write_mode)
+    if (!buffered_stdio && write_mode)
         buffering = 0;
     else
         buffering = -1;
@@ -1607,11 +1608,11 @@ create_stdio(PyObject* io,
     Py_DECREF(res);
     if (isatty == -1)
         goto error;
-    if (Py_UnbufferedStdioFlag)
+    if (!buffered_stdio)
         write_through = Py_True;
     else
         write_through = Py_False;
-    if (isatty && !Py_UnbufferedStdioFlag)
+    if (isatty && buffered_stdio)
         line_buffering = Py_True;
     else
         line_buffering = Py_False;
@@ -1720,7 +1721,7 @@ init_sys_streams(PyInterpreterState *interp)
      * and fileno() may point to an invalid file descriptor. For example
      * GUI apps don't have valid standard streams by default.
      */
-    std = create_stdio(iomod, fd, 0, "<stdin>",
+    std = create_stdio(config, iomod, fd, 0, "<stdin>",
                        config->stdio_encoding,
                        config->stdio_errors);
     if (std == NULL)
@@ -1731,7 +1732,7 @@ init_sys_streams(PyInterpreterState *interp)
 
     /* Set sys.stdout */
     fd = fileno(stdout);
-    std = create_stdio(iomod, fd, 1, "<stdout>",
+    std = create_stdio(config, iomod, fd, 1, "<stdout>",
                        config->stdio_encoding,
                        config->stdio_errors);
     if (std == NULL)
@@ -1743,7 +1744,7 @@ init_sys_streams(PyInterpreterState *interp)
 #if 1 /* Disable this if you have trouble debugging bootstrap stuff */
     /* Set sys.stderr, replaces the preliminary stderr */
     fd = fileno(stderr);
-    std = create_stdio(iomod, fd, 1, "<stderr>",
+    std = create_stdio(config, iomod, fd, 1, "<stderr>",
                        config->stdio_encoding,
                        "backslashreplace");
     if (std == NULL)
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 91df4b031e32..58ea60595cd3 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -2076,7 +2076,7 @@ make_flags(void)
 {
     int pos = 0;
     PyObject *seq;
-    _PyCoreConfig *core_config = &_PyGILState_GetInterpreterStateUnsafe()->core_config;
+    const _PyCoreConfig *config = &_PyInterpreterState_GET_UNSAFE()->core_config;
 
     seq = PyStructSequence_New(&FlagsType);
     if (seq == NULL)
@@ -2085,23 +2085,23 @@ make_flags(void)
 #define SetFlag(flag) \
     PyStructSequence_SET_ITEM(seq, pos++, PyLong_FromLong(flag))
 
-    SetFlag(Py_DebugFlag);
-    SetFlag(Py_InspectFlag);
-    SetFlag(Py_InteractiveFlag);
-    SetFlag(Py_OptimizeFlag);
-    SetFlag(Py_DontWriteBytecodeFlag);
-    SetFlag(Py_NoUserSiteDirectory);
-    SetFlag(Py_NoSiteFlag);
-    SetFlag(Py_IgnoreEnvironmentFlag);
-    SetFlag(Py_VerboseFlag);
+    SetFlag(config->parser_debug);
+    SetFlag(config->inspect);
+    SetFlag(config->interactive);
+    SetFlag(config->optimization_level);
+    SetFlag(!config->write_bytecode);
+    SetFlag(!config->user_site_directory);
+    SetFlag(!config->site_import);
+    SetFlag(!config->use_environment);
+    SetFlag(config->verbose);
     /* SetFlag(saw_unbuffered_flag); */
     /* SetFlag(skipfirstline); */
-    SetFlag(Py_BytesWarningFlag);
-    SetFlag(Py_QuietFlag);
-    SetFlag(Py_HashRandomizationFlag);
-    SetFlag(Py_IsolatedFlag);
-    PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(core_config->dev_mode));
-    SetFlag(Py_UTF8Mode);
+    SetFlag(config->bytes_warning);
+    SetFlag(config->quiet);
+    SetFlag(config->use_hash_seed == 0 || config->hash_seed != 0);
+    SetFlag(config->isolated);
+    PyStructSequence_SET_ITEM(seq, pos++, PyBool_FromLong(config->dev_mode));
+    SetFlag(config->utf8_mode);
 #undef SetFlag
 
     if (PyErr_Occurred()) {
@@ -2474,8 +2474,10 @@ _PySys_BeginInit(PyObject **sysmod)
     } while (0)
 
 int
-_PySys_EndInit(PyObject *sysdict, _PyMainInterpreterConfig *config)
+_PySys_EndInit(PyObject *sysdict, PyInterpreterState *interp)
 {
+    const _PyCoreConfig *core_config = &interp->core_config;
+    const _PyMainInterpreterConfig *config = &interp->config;
     int res;
 
     /* _PyMainInterpreterConfig_Read() must set all these variables */
@@ -2523,7 +2525,7 @@ _PySys_EndInit(PyObject *sysdict, _PyMainInterpreterConfig *config)
     }
 
     SET_SYS_FROM_STRING_INT_RESULT("dont_write_bytecode",
-                         PyBool_FromLong(Py_DontWriteBytecodeFlag));
+                         PyBool_FromLong(!core_config->write_bytecode));
 
     if (get_warnoptions() == NULL)
         return -1;



More information about the Python-checkins mailing list