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.
This commit is contained in:
Victor Stinner 2018-08-30 00:50:45 +02:00 committed by GitHub
parent de42755674
commit fbca90856d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 50 additions and 40 deletions

View file

@ -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;

View file

@ -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)

View file

@ -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;