From fbca90856d96273fd87c0b126f6e7966af7fbf7b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 30 Aug 2018 00:50:45 +0200 Subject: 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. --- Include/pylifecycle.h | 2 +- Include/pystate.h | 8 ++++++-- Modules/main.c | 18 +++++++++--------- Python/bltinmodule.c | 5 ++++- Python/pylifecycle.c | 19 ++++++++++--------- Python/sysmodule.c | 38 ++++++++++++++++++++------------------ 6 files changed, 50 insertions(+), 40 deletions(-) diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index b84568e..04e672e 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 e410665..80ee0d1 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 bf7290a..1ab555b 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 8aa1ba0..a23bdc1 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 ad55b2c..7d17f2e 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, "", + std = create_stdio(config, iomod, fd, 0, "", 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, "", + std = create_stdio(config, iomod, fd, 1, "", 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, "", + std = create_stdio(config, iomod, fd, 1, "", config->stdio_encoding, "backslashreplace"); if (std == NULL) diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 91df4b0..58ea605 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 @@ err_occurred: } 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; -- cgit v0.12