diff options
-rw-r--r-- | Include/pythonrun.h | 4 | ||||
-rw-r--r-- | Modules/main.c | 7 | ||||
-rw-r--r-- | Python/bltinmodule.c | 5 | ||||
-rw-r--r-- | Python/pythonrun.c | 40 |
4 files changed, 41 insertions, 15 deletions
diff --git a/Include/pythonrun.h b/Include/pythonrun.h index 0528702..bbf2903a 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -29,9 +29,11 @@ DL_IMPORT(PyThreadState *) Py_NewInterpreter(void); DL_IMPORT(void) Py_EndInterpreter(PyThreadState *); DL_IMPORT(int) PyRun_AnyFile(FILE *, char *); +DL_IMPORT(int) PyRun_AnyFileEx(FILE *, char *, int); DL_IMPORT(int) PyRun_SimpleString(char *); DL_IMPORT(int) PyRun_SimpleFile(FILE *, char *); +DL_IMPORT(int) PyRun_SimpleFileEx(FILE *, char *, int); DL_IMPORT(int) PyRun_InteractiveOne(FILE *, char *); DL_IMPORT(int) PyRun_InteractiveLoop(FILE *, char *); @@ -40,6 +42,8 @@ DL_IMPORT(struct _node *) PyParser_SimpleParseFile(FILE *, char *, int); DL_IMPORT(PyObject *) PyRun_String(char *, int, PyObject *, PyObject *); DL_IMPORT(PyObject *) PyRun_File(FILE *, char *, int, PyObject *, PyObject *); +DL_IMPORT(PyObject *) PyRun_FileEx(FILE *, char *, int, + PyObject *, PyObject *, int); DL_IMPORT(PyObject *) Py_CompileString(char *, char *, int); diff --git a/Modules/main.c b/Modules/main.c index 34e99b9..9afe80b 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -268,11 +268,10 @@ Py_Main(int argc, char **argv) } } } - sts = PyRun_AnyFile( + sts = PyRun_AnyFileEx( fp, - filename == NULL ? "<stdin>" : filename) != 0; - if (filename != NULL) - fclose(fp); + filename == NULL ? "<stdin>" : filename, + filename != NULL) != 0; } if (inspect && stdin_is_interactive && diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index ea1269e..c2a7499 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -815,10 +815,7 @@ builtin_execfile(PyObject *self, PyObject *args) PyErr_SetFromErrno(PyExc_IOError); return NULL; } - res = PyRun_File(fp, filename, Py_file_input, globals, locals); - Py_BEGIN_ALLOW_THREADS - fclose(fp); - Py_END_ALLOW_THREADS + res = PyRun_FileEx(fp, filename, Py_file_input, globals, locals, 1); return res; } diff --git a/Python/pythonrun.c b/Python/pythonrun.c index e951ccd..56b3ba8 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -450,12 +450,22 @@ initsite(void) int PyRun_AnyFile(FILE *fp, char *filename) { + return PyRun_AnyFileEx(fp, filename, 0); +} + +int +PyRun_AnyFileEx(FILE *fp, char *filename, int closeit) +{ if (filename == NULL) filename = "???"; - if (Py_FdIsInteractive(fp, filename)) - return PyRun_InteractiveLoop(fp, filename); + if (Py_FdIsInteractive(fp, filename)) { + int err = PyRun_InteractiveLoop(fp, filename); + if (closeit) + fclose(fp); + return err; + } else - return PyRun_SimpleFile(fp, filename); + return PyRun_SimpleFileEx(fp, filename, closeit); } int @@ -542,6 +552,12 @@ PyRun_InteractiveOne(FILE *fp, char *filename) int PyRun_SimpleFile(FILE *fp, char *filename) { + return PyRun_SimpleFileEx(fp, filename, 0); +} + +int +PyRun_SimpleFileEx(FILE *fp, char *filename, int closeit) +{ PyObject *m, *d, *v; char *ext; @@ -558,7 +574,8 @@ PyRun_SimpleFile(FILE *fp, char *filename) #endif /* macintosh */ ) { /* Try to run a pyc file. First, re-open in binary */ - /* Don't close, done in main: fclose(fp); */ + if (closeit) + fclose(fp); if( (fp = fopen(filename, "rb")) == NULL ) { fprintf(stderr, "python: Can't reopen .pyc file\n"); return -1; @@ -568,7 +585,7 @@ PyRun_SimpleFile(FILE *fp, char *filename) Py_OptimizeFlag = 1; v = run_pyc_file(fp, filename, d, d); } else { - v = PyRun_File(fp, filename, Py_file_input, d, d); + v = PyRun_FileEx(fp, filename, Py_file_input, d, d, closeit); } if (v == NULL) { PyErr_Print(); @@ -845,8 +862,17 @@ PyObject * PyRun_File(FILE *fp, char *filename, int start, PyObject *globals, PyObject *locals) { - return run_err_node(PyParser_SimpleParseFile(fp, filename, start), - filename, globals, locals); + PyRun_FileEx(fp, filename, start, globals, locals, 0); +} + +PyObject * +PyRun_FileEx(FILE *fp, char *filename, int start, PyObject *globals, + PyObject *locals, int closeit) +{ + node *n = PyParser_SimpleParseFile(fp, filename, start); + if (closeit) + fclose(fp); + return run_err_node(n, filename, globals, locals); } static PyObject * |