bpo-34170: Cleanup pymain_run_filename() (GH-8631) · python/cpython@72ec319
@@ -300,43 +300,6 @@ pymain_run_command(wchar_t *command, PyCompilerFlags *cf)
300300}
301301302302303-static int
304-pymain_run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
305-{
306-PyObject *unicode, *bytes = NULL;
307-const char *filename_str;
308-int run;
309-310-/* call pending calls like signal handlers (SIGINT) */
311-if (Py_MakePendingCalls() == -1) {
312-PyErr_Print();
313-return 1;
314- }
315-316-if (filename) {
317-unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
318-if (unicode != NULL) {
319-bytes = PyUnicode_EncodeFSDefault(unicode);
320-Py_DECREF(unicode);
321- }
322-if (bytes != NULL) {
323-filename_str = PyBytes_AsString(bytes);
324- }
325-else {
326-PyErr_Clear();
327-filename_str = "<encoding error>";
328- }
329- }
330-else {
331-filename_str = "<stdin>";
332- }
333-334-run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
335-Py_XDECREF(bytes);
336-return run != 0;
337-}
338-339-340303/* Main program */
341304342305typedef struct {
@@ -1101,17 +1064,43 @@ pymain_import_readline(_PyMain *pymain)
11011064}
11021065110310661104-static FILE*
1105-pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
1067+static void
1068+pymain_run_startup(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
11061069{
1107-FILE* fp;
1070+const char *startup = _PyCoreConfig_GetEnv(config, "PYTHONSTARTUP");
1071+if (startup == NULL) {
1072+return;
1073+ }
110810741109-fp = _Py_wfopen(pymain->filename, L"r");
1075+FILE *fp = _Py_fopen(startup, "r");
1076+if (fp == NULL) {
1077+int save_errno = errno;
1078+PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
1079+errno = save_errno;
1080+1081+PyErr_SetFromErrnoWithFilename(PyExc_OSError,
1082+startup);
1083+PyErr_Print();
1084+PyErr_Clear();
1085+return;
1086+ }
1087+1088+ (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
1089+PyErr_Clear();
1090+fclose(fp);
1091+}
1092+1093+1094+static void
1095+pymain_run_file(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
1096+{
1097+const wchar_t *filename = pymain->filename;
1098+FILE *fp = _Py_wfopen(filename, L"r");
11101099if (fp == NULL) {
11111100char *cfilename_buffer;
11121101const char *cfilename;
11131102int err = errno;
1114-cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL);
1103+cfilename_buffer = _Py_EncodeLocaleRaw(filename, NULL);
11151104if (cfilename_buffer != NULL)
11161105cfilename = cfilename_buffer;
11171106else
@@ -1120,13 +1109,12 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
11201109config->program, cfilename, err, strerror(err));
11211110PyMem_RawFree(cfilename_buffer);
11221111pymain->status = 2;
1123-return NULL;
1112+return;
11241113 }
1125111411261115if (pymain->skip_first_line) {
11271116int ch;
1128-/* Push back first newline so line numbers
1129- remain the same */
1117+/* Push back first newline so line numbers remain the same */
11301118while ((ch = getc(fp)) != EOF) {
11311119if (ch == '\n') {
11321120 (void)ungetc(ch, fp);
@@ -1136,70 +1124,65 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
11361124 }
1137112511381126struct _Py_stat_struct sb;
1139-if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
1140-S_ISDIR(sb.st_mode)) {
1127+if (_Py_fstat_noraise(fileno(fp), &sb) == 0 && S_ISDIR(sb.st_mode)) {
11411128fprintf(stderr,
11421129"%ls: '%ls' is a directory, cannot continue\n",
1143-config->program, pymain->filename);
1144-fclose(fp);
1130+config->program, filename);
11451131pymain->status = 1;
1146-return NULL;
1132+goto done;
11471133 }
114811341149-return fp;
1150-}
1151-1152-1153-static void
1154-pymain_run_startup(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
1155-{
1156-const char *startup = _PyCoreConfig_GetEnv(config, "PYTHONSTARTUP");
1157-if (startup == NULL) {
1158-return;
1135+/* call pending calls like signal handlers (SIGINT) */
1136+if (Py_MakePendingCalls() == -1) {
1137+PyErr_Print();
1138+pymain->status = 1;
1139+ goto done;
11591140 }
116011411161-FILE *fp = _Py_fopen(startup, "r");
1162-if (fp == NULL) {
1163-int save_errno = errno;
1164-PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
1165-errno = save_errno;
1142+PyObject *unicode, *bytes = NULL;
1143+const char *filename_str;
116611441167-PyErr_SetFromErrnoWithFilename(PyExc_OSError,
1168-startup);
1169-PyErr_Print();
1145+unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
1146+if (unicode != NULL) {
1147+bytes = PyUnicode_EncodeFSDefault(unicode);
1148+Py_DECREF(unicode);
1149+ }
1150+if (bytes != NULL) {
1151+filename_str = PyBytes_AsString(bytes);
1152+ }
1153+else {
11701154PyErr_Clear();
1171-return;
1155+filename_str = "<filename encoding error>";
11721156 }
117311571174- (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
1175-PyErr_Clear();
1158+int run = PyRun_AnyFileExFlags(fp, filename_str, 0, cf);
1159+Py_XDECREF(bytes);
1160+pymain->status = (run != 0);
1161+1162+done:
11761163fclose(fp);
11771164}
117811651179116611801167static void
1181-pymain_run_filename(_PyMain *pymain, _PyCoreConfig *config,
1182-PyCompilerFlags *cf)
1168+pymain_run_stdin(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
11831169{
1184-if (pymain->filename == NULL && pymain->stdin_is_interactive) {
1170+if (pymain->stdin_is_interactive) {
11851171Py_InspectFlag = 0; /* do exit on SystemExit */
11861172config->inspect = 0;
11871173pymain_run_startup(pymain, config, cf);
11881174pymain_run_interactive_hook();
11891175 }
119011761191-FILE *fp;
1192-if (pymain->filename != NULL) {
1193-fp = pymain_open_filename(pymain, config);
1194-if (fp == NULL) {
1195-return;
1196- }
1197- }
1198-else {
1199-fp = stdin;
1177+/* call pending calls like signal handlers (SIGINT) */
1178+if (Py_MakePendingCalls() == -1) {
1179+PyErr_Print();
1180+pymain->status = 1;
1181+return;
12001182 }
120111831202-pymain->status = pymain_run_file(fp, pymain->filename, cf);
1184+int run = PyRun_AnyFileExFlags(stdin, "<stdin>", 0, cf);
1185+pymain->status = (run != 0);
12031186}
1204118712051188@@ -1618,8 +1601,11 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp)
16181601int sts = pymain_run_module(L"__main__", 0);
16191602pymain->status = (sts != 0);
16201603 }
1604+else if (pymain->filename != NULL) {
1605+pymain_run_file(pymain, config, &cf);
1606+ }
16211607else {
1622-pymain_run_filename(pymain, config, &cf);
1608+pymain_run_stdin(pymain, config, &cf);
16231609 }
1624161016251611pymain_repl(pymain, config, &cf);