Skip to content

Commit 72ec319

Browse files
authored
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()
1 parent f394ee5 commit 72ec319

1 file changed

Lines changed: 71 additions & 85 deletions

File tree

Modules/main.c

Lines changed: 71 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -300,43 +300,6 @@ pymain_run_command(wchar_t *command, PyCompilerFlags *cf)
300300
}
301301

302302

303-
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 */
341304

342305
typedef struct {
@@ -1101,17 +1064,43 @@ pymain_import_readline(_PyMain *pymain)
11011064
}
11021065

11031066

1104-
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+
}
11081074

1109-
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");
11101099
if (fp == NULL) {
11111100
char *cfilename_buffer;
11121101
const char *cfilename;
11131102
int err = errno;
1114-
cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL);
1103+
cfilename_buffer = _Py_EncodeLocaleRaw(filename, NULL);
11151104
if (cfilename_buffer != NULL)
11161105
cfilename = cfilename_buffer;
11171106
else
@@ -1120,13 +1109,12 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
11201109
config->program, cfilename, err, strerror(err));
11211110
PyMem_RawFree(cfilename_buffer);
11221111
pymain->status = 2;
1123-
return NULL;
1112+
return;
11241113
}
11251114

11261115
if (pymain->skip_first_line) {
11271116
int ch;
1128-
/* Push back first newline so line numbers
1129-
remain the same */
1117+
/* Push back first newline so line numbers remain the same */
11301118
while ((ch = getc(fp)) != EOF) {
11311119
if (ch == '\n') {
11321120
(void)ungetc(ch, fp);
@@ -1136,70 +1124,65 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
11361124
}
11371125

11381126
struct _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)) {
11411128
fprintf(stderr,
11421129
"%ls: '%ls' is a directory, cannot continue\n",
1143-
config->program, pymain->filename);
1144-
fclose(fp);
1130+
config->program, filename);
11451131
pymain->status = 1;
1146-
return NULL;
1132+
goto done;
11471133
}
11481134

1149-
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
}
11601141

1161-
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;
11661144

1167-
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 {
11701154
PyErr_Clear();
1171-
return;
1155+
filename_str = "<filename encoding error>";
11721156
}
11731157

1174-
(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:
11761163
fclose(fp);
11771164
}
11781165

11791166

11801167
static 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) {
11851171
Py_InspectFlag = 0; /* do exit on SystemExit */
11861172
config->inspect = 0;
11871173
pymain_run_startup(pymain, config, cf);
11881174
pymain_run_interactive_hook();
11891175
}
11901176

1191-
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
}
12011183

1202-
pymain->status = pymain_run_file(fp, pymain->filename, cf);
1184+
int run = PyRun_AnyFileExFlags(stdin, "<stdin>", 0, cf);
1185+
pymain->status = (run != 0);
12031186
}
12041187

12051188

@@ -1618,8 +1601,11 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp)
16181601
int sts = pymain_run_module(L"__main__", 0);
16191602
pymain->status = (sts != 0);
16201603
}
1604+
else if (pymain->filename != NULL) {
1605+
pymain_run_file(pymain, config, &cf);
1606+
}
16211607
else {
1622-
pymain_run_filename(pymain, config, &cf);
1608+
pymain_run_stdin(pymain, config, &cf);
16231609
}
16241610

16251611
pymain_repl(pymain, config, &cf);

0 commit comments

Comments
 (0)