From 550e4673be538d98b6ddf5550b3922539cf5c4b2 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 9 Dec 2020 00:32:54 +0100 Subject: [PATCH] bpo-32381: Add _PyRun_SimpleFileObject() (GH-23709) pymain_run_startup() now pass the filename as a Python object to _PyRun_SimpleFileObject(). --- Include/cpython/pythonrun.h | 5 +++++ Modules/main.c | 45 +++++++++++++------------------------ Python/pythonrun.c | 8 +++---- 3 files changed, 25 insertions(+), 33 deletions(-) diff --git a/Include/cpython/pythonrun.h b/Include/cpython/pythonrun.h index 4945d924558..febda73f3ec 100644 --- a/Include/cpython/pythonrun.h +++ b/Include/cpython/pythonrun.h @@ -3,6 +3,11 @@ #endif PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); +PyAPI_FUNC(int) _PyRun_SimpleFileObject( + FILE *fp, + PyObject *filename, + int closeit, + PyCompilerFlags *flags); PyAPI_FUNC(int) PyRun_AnyFileExFlags( FILE *fp, const char *filename, /* decoded from the filesystem encoding */ diff --git a/Modules/main.c b/Modules/main.c index 2cc891f61aa..3aa4d91c9a3 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -380,64 +380,51 @@ static int pymain_run_startup(PyConfig *config, PyCompilerFlags *cf, int *exitcode) { int ret; - PyObject *startup_obj = NULL; if (!config->use_environment) { return 0; } + PyObject *startup = NULL; #ifdef MS_WINDOWS - const wchar_t *wstartup = _wgetenv(L"PYTHONSTARTUP"); - if (wstartup == NULL || wstartup[0] == L'\0') { + const wchar_t *env = _wgetenv(L"PYTHONSTARTUP"); + if (env == NULL || env[0] == L'\0') { return 0; } - PyObject *startup_bytes = NULL; - startup_obj = PyUnicode_FromWideChar(wstartup, wcslen(wstartup)); - if (startup_obj == NULL) { - goto error; - } - startup_bytes = PyUnicode_EncodeFSDefault(startup_obj); - if (startup_bytes == NULL) { - goto error; - } - const char *startup = PyBytes_AS_STRING(startup_bytes); -#else - const char *startup = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP"); + startup = PyUnicode_FromWideChar(env, wcslen(env)); if (startup == NULL) { + goto error; + } +#else + const char *env = _Py_GetEnv(config->use_environment, "PYTHONSTARTUP"); + if (env == NULL) { return 0; } - startup_obj = PyUnicode_DecodeFSDefault(startup); - if (startup_obj == NULL) { + startup = PyUnicode_DecodeFSDefault(env); + if (startup == NULL) { goto error; } #endif - if (PySys_Audit("cpython.run_startup", "O", startup_obj) < 0) { + if (PySys_Audit("cpython.run_startup", "O", startup) < 0) { goto error; } -#ifdef MS_WINDOWS - FILE *fp = _Py_wfopen(wstartup, L"r"); -#else - FILE *fp = _Py_fopen(startup, "r"); -#endif + FILE *fp = _Py_fopen_obj(startup, "r"); if (fp == NULL) { int save_errno = errno; PyErr_Clear(); PySys_WriteStderr("Could not open PYTHONSTARTUP\n"); errno = save_errno; - PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, startup_obj, NULL); + PyErr_SetFromErrnoWithFilenameObjects(PyExc_OSError, startup, NULL); goto error; } - (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); + (void) _PyRun_SimpleFileObject(fp, startup, 0, cf); PyErr_Clear(); fclose(fp); ret = 0; done: -#ifdef MS_WINDOWS - Py_XDECREF(startup_bytes); -#endif - Py_XDECREF(startup_obj); + Py_XDECREF(startup); return ret; error: diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 330b822d707..15e407d9195 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -350,9 +350,9 @@ set_main_loader(PyObject *d, PyObject *filename, const char *loader_name) } -static int -pyrun_simple_file(FILE *fp, PyObject *filename, int closeit, - PyCompilerFlags *flags) +int +_PyRun_SimpleFileObject(FILE *fp, PyObject *filename, int closeit, + PyCompilerFlags *flags) { PyObject *m, *d, *v; int set_file_name = 0, ret = -1; @@ -441,7 +441,7 @@ PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, if (filename_obj == NULL) { return -1; } - int res = pyrun_simple_file(fp, filename_obj, closeit, flags); + int res = _PyRun_SimpleFileObject(fp, filename_obj, closeit, flags); Py_DECREF(filename_obj); return res; }