@@ -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
342305typedef 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
11801167static 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