summaryrefslogtreecommitdiffstats
path: root/Modules/main.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2018-08-02 17:34:20 (GMT)
committerGitHub <noreply@github.com>2018-08-02 17:34:20 (GMT)
commit72ec3193b5118a2ccc8be8bf03d7b74691c6a264 (patch)
tree5a9289587cfc42443d97ee39b3e57cd3b6de5305 /Modules/main.c
parentf394ee5eaf6d6d8f45e0478e77d4dbff25c6bea7 (diff)
downloadcpython-72ec3193b5118a2ccc8be8bf03d7b74691c6a264.zip
cpython-72ec3193b5118a2ccc8be8bf03d7b74691c6a264.tar.gz
cpython-72ec3193b5118a2ccc8be8bf03d7b74691c6a264.tar.bz2
bpo-34170: Cleanup pymain_run_filename() (GH-8631)
* Inline pymain_run_file() and pymain_open_filename() into pymain_run_filename() * Created pymain_run_stdin() which is pymain_run_filename() with filename=NULL * Rename pymain_run_filename() to pymain_run_file()
Diffstat (limited to 'Modules/main.c')
-rw-r--r--Modules/main.c156
1 files changed, 71 insertions, 85 deletions
diff --git a/Modules/main.c b/Modules/main.c
index f99ff86..06aa112 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -300,43 +300,6 @@ error:
}
-static int
-pymain_run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
-{
- PyObject *unicode, *bytes = NULL;
- const char *filename_str;
- int run;
-
- /* call pending calls like signal handlers (SIGINT) */
- if (Py_MakePendingCalls() == -1) {
- PyErr_Print();
- return 1;
- }
-
- if (filename) {
- unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
- if (unicode != NULL) {
- bytes = PyUnicode_EncodeFSDefault(unicode);
- Py_DECREF(unicode);
- }
- if (bytes != NULL) {
- filename_str = PyBytes_AsString(bytes);
- }
- else {
- PyErr_Clear();
- filename_str = "<encoding error>";
- }
- }
- else {
- filename_str = "<stdin>";
- }
-
- run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
- Py_XDECREF(bytes);
- return run != 0;
-}
-
-
/* Main program */
typedef struct {
@@ -1101,17 +1064,43 @@ pymain_import_readline(_PyMain *pymain)
}
-static FILE*
-pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
+static void
+pymain_run_startup(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
{
- FILE* fp;
+ const char *startup = _PyCoreConfig_GetEnv(config, "PYTHONSTARTUP");
+ if (startup == NULL) {
+ return;
+ }
- fp = _Py_wfopen(pymain->filename, L"r");
+ FILE *fp = _Py_fopen(startup, "r");
+ if (fp == NULL) {
+ int save_errno = errno;
+ PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
+ errno = save_errno;
+
+ PyErr_SetFromErrnoWithFilename(PyExc_OSError,
+ startup);
+ PyErr_Print();
+ PyErr_Clear();
+ return;
+ }
+
+ (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
+ PyErr_Clear();
+ fclose(fp);
+}
+
+
+static void
+pymain_run_file(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
+{
+ const wchar_t *filename = pymain->filename;
+ FILE *fp = _Py_wfopen(filename, L"r");
if (fp == NULL) {
char *cfilename_buffer;
const char *cfilename;
int err = errno;
- cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL);
+ cfilename_buffer = _Py_EncodeLocaleRaw(filename, NULL);
if (cfilename_buffer != NULL)
cfilename = cfilename_buffer;
else
@@ -1120,13 +1109,12 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
config->program, cfilename, err, strerror(err));
PyMem_RawFree(cfilename_buffer);
pymain->status = 2;
- return NULL;
+ return;
}
if (pymain->skip_first_line) {
int ch;
- /* Push back first newline so line numbers
- remain the same */
+ /* Push back first newline so line numbers remain the same */
while ((ch = getc(fp)) != EOF) {
if (ch == '\n') {
(void)ungetc(ch, fp);
@@ -1136,70 +1124,65 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
}
struct _Py_stat_struct sb;
- if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
- S_ISDIR(sb.st_mode)) {
+ if (_Py_fstat_noraise(fileno(fp), &sb) == 0 && S_ISDIR(sb.st_mode)) {
fprintf(stderr,
"%ls: '%ls' is a directory, cannot continue\n",
- config->program, pymain->filename);
- fclose(fp);
+ config->program, filename);
pymain->status = 1;
- return NULL;
+ goto done;
}
- return fp;
-}
-
-
-static void
-pymain_run_startup(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
-{
- const char *startup = _PyCoreConfig_GetEnv(config, "PYTHONSTARTUP");
- if (startup == NULL) {
- return;
+ /* call pending calls like signal handlers (SIGINT) */
+ if (Py_MakePendingCalls() == -1) {
+ PyErr_Print();
+ pymain->status = 1;
+ goto done;
}
- FILE *fp = _Py_fopen(startup, "r");
- if (fp == NULL) {
- int save_errno = errno;
- PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
- errno = save_errno;
+ PyObject *unicode, *bytes = NULL;
+ const char *filename_str;
- PyErr_SetFromErrnoWithFilename(PyExc_OSError,
- startup);
- PyErr_Print();
+ unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
+ if (unicode != NULL) {
+ bytes = PyUnicode_EncodeFSDefault(unicode);
+ Py_DECREF(unicode);
+ }
+ if (bytes != NULL) {
+ filename_str = PyBytes_AsString(bytes);
+ }
+ else {
PyErr_Clear();
- return;
+ filename_str = "<filename encoding error>";
}
- (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
- PyErr_Clear();
+ int run = PyRun_AnyFileExFlags(fp, filename_str, 0, cf);
+ Py_XDECREF(bytes);
+ pymain->status = (run != 0);
+
+done:
fclose(fp);
}
static void
-pymain_run_filename(_PyMain *pymain, _PyCoreConfig *config,
- PyCompilerFlags *cf)
+pymain_run_stdin(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
{
- if (pymain->filename == NULL && pymain->stdin_is_interactive) {
+ if (pymain->stdin_is_interactive) {
Py_InspectFlag = 0; /* do exit on SystemExit */
config->inspect = 0;
pymain_run_startup(pymain, config, cf);
pymain_run_interactive_hook();
}
- FILE *fp;
- if (pymain->filename != NULL) {
- fp = pymain_open_filename(pymain, config);
- if (fp == NULL) {
- return;
- }
- }
- else {
- fp = stdin;
+ /* call pending calls like signal handlers (SIGINT) */
+ if (Py_MakePendingCalls() == -1) {
+ PyErr_Print();
+ pymain->status = 1;
+ return;
}
- pymain->status = pymain_run_file(fp, pymain->filename, cf);
+ int run = PyRun_AnyFileExFlags(stdin, "<stdin>", 0, cf);
+ pymain->status = (run != 0);
}
@@ -1618,8 +1601,11 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp)
int sts = pymain_run_module(L"__main__", 0);
pymain->status = (sts != 0);
}
+ else if (pymain->filename != NULL) {
+ pymain_run_file(pymain, config, &cf);
+ }
else {
- pymain_run_filename(pymain, config, &cf);
+ pymain_run_stdin(pymain, config, &cf);
}
pymain_repl(pymain, config, &cf);