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

341304342305

typedef 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");

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

}

1125111411261115

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

}

1137112511381126

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

}

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 {

11701154

PyErr_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:

11761163

fclose(fp);

11771164

}

117811651179116611801167

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

}

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)

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

}

1624161016251611

pymain_repl(pymain, config, &cf);