Unverified Kaydet (Commit) 72ec3193 authored tarafından Victor Stinner's avatar Victor Stinner Kaydeden (comit) GitHub

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()
üst f394ee5e
...@@ -300,43 +300,6 @@ error: ...@@ -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 */ /* Main program */
typedef struct { typedef struct {
...@@ -1101,17 +1064,43 @@ pymain_import_readline(_PyMain *pymain) ...@@ -1101,17 +1064,43 @@ pymain_import_readline(_PyMain *pymain)
} }
static FILE* static void
pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config) 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) { if (fp == NULL) {
char *cfilename_buffer; char *cfilename_buffer;
const char *cfilename; const char *cfilename;
int err = errno; int err = errno;
cfilename_buffer = _Py_EncodeLocaleRaw(pymain->filename, NULL); cfilename_buffer = _Py_EncodeLocaleRaw(filename, NULL);
if (cfilename_buffer != NULL) if (cfilename_buffer != NULL)
cfilename = cfilename_buffer; cfilename = cfilename_buffer;
else else
...@@ -1120,13 +1109,12 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config) ...@@ -1120,13 +1109,12 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
config->program, cfilename, err, strerror(err)); config->program, cfilename, err, strerror(err));
PyMem_RawFree(cfilename_buffer); PyMem_RawFree(cfilename_buffer);
pymain->status = 2; pymain->status = 2;
return NULL; return;
} }
if (pymain->skip_first_line) { if (pymain->skip_first_line) {
int ch; int ch;
/* Push back first newline so line numbers /* Push back first newline so line numbers remain the same */
remain the same */
while ((ch = getc(fp)) != EOF) { while ((ch = getc(fp)) != EOF) {
if (ch == '\n') { if (ch == '\n') {
(void)ungetc(ch, fp); (void)ungetc(ch, fp);
...@@ -1136,70 +1124,65 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config) ...@@ -1136,70 +1124,65 @@ pymain_open_filename(_PyMain *pymain, _PyCoreConfig *config)
} }
struct _Py_stat_struct sb; struct _Py_stat_struct sb;
if (_Py_fstat_noraise(fileno(fp), &sb) == 0 && if (_Py_fstat_noraise(fileno(fp), &sb) == 0 && S_ISDIR(sb.st_mode)) {
S_ISDIR(sb.st_mode)) {
fprintf(stderr, fprintf(stderr,
"%ls: '%ls' is a directory, cannot continue\n", "%ls: '%ls' is a directory, cannot continue\n",
config->program, pymain->filename); config->program, filename);
fclose(fp);
pymain->status = 1; pymain->status = 1;
return NULL; goto done;
} }
return fp; /* call pending calls like signal handlers (SIGINT) */
} if (Py_MakePendingCalls() == -1) {
PyErr_Print();
pymain->status = 1;
static void goto done;
pymain_run_startup(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
{
const char *startup = _PyCoreConfig_GetEnv(config, "PYTHONSTARTUP");
if (startup == NULL) {
return;
} }
FILE *fp = _Py_fopen(startup, "r"); PyObject *unicode, *bytes = NULL;
if (fp == NULL) { const char *filename_str;
int save_errno = errno;
PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
errno = save_errno;
PyErr_SetFromErrnoWithFilename(PyExc_OSError, unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
startup); if (unicode != NULL) {
PyErr_Print(); bytes = PyUnicode_EncodeFSDefault(unicode);
Py_DECREF(unicode);
}
if (bytes != NULL) {
filename_str = PyBytes_AsString(bytes);
}
else {
PyErr_Clear(); PyErr_Clear();
return; filename_str = "<filename encoding error>";
} }
(void) PyRun_SimpleFileExFlags(fp, startup, 0, cf); int run = PyRun_AnyFileExFlags(fp, filename_str, 0, cf);
PyErr_Clear(); Py_XDECREF(bytes);
pymain->status = (run != 0);
done:
fclose(fp); fclose(fp);
} }
static void static void
pymain_run_filename(_PyMain *pymain, _PyCoreConfig *config, pymain_run_stdin(_PyMain *pymain, _PyCoreConfig *config, PyCompilerFlags *cf)
PyCompilerFlags *cf)
{ {
if (pymain->filename == NULL && pymain->stdin_is_interactive) { if (pymain->stdin_is_interactive) {
Py_InspectFlag = 0; /* do exit on SystemExit */ Py_InspectFlag = 0; /* do exit on SystemExit */
config->inspect = 0; config->inspect = 0;
pymain_run_startup(pymain, config, cf); pymain_run_startup(pymain, config, cf);
pymain_run_interactive_hook(); pymain_run_interactive_hook();
} }
FILE *fp; /* call pending calls like signal handlers (SIGINT) */
if (pymain->filename != NULL) { if (Py_MakePendingCalls() == -1) {
fp = pymain_open_filename(pymain, config); PyErr_Print();
if (fp == NULL) { pymain->status = 1;
return; return;
}
}
else {
fp = stdin;
} }
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) ...@@ -1618,8 +1601,11 @@ pymain_run_python(_PyMain *pymain, PyInterpreterState *interp)
int sts = pymain_run_module(L"__main__", 0); int sts = pymain_run_module(L"__main__", 0);
pymain->status = (sts != 0); pymain->status = (sts != 0);
} }
else if (pymain->filename != NULL) {
pymain_run_file(pymain, config, &cf);
}
else { else {
pymain_run_filename(pymain, config, &cf); pymain_run_stdin(pymain, config, &cf);
} }
pymain_repl(pymain, config, &cf); pymain_repl(pymain, config, &cf);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment