diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-08-07 16:34:25 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-08-07 16:34:25 (GMT) |
commit | 0a3ddad666d3c30f3b232a1825dc6d8e2de04b47 (patch) | |
tree | 8af4a1e1ccb7528f5215626efb2aaab837a5f916 | |
parent | af43e9a288b98c6434ce3ee6fc2b9eb766775774 (diff) | |
download | cpython-0a3ddad666d3c30f3b232a1825dc6d8e2de04b47.zip cpython-0a3ddad666d3c30f3b232a1825dc6d8e2de04b47.tar.gz cpython-0a3ddad666d3c30f3b232a1825dc6d8e2de04b47.tar.bz2 |
Issue #9425: Create run_file() subfunction
* Call Py_MakePendingCalls() before converting the filename from
wchar_t* to char*
* Use PyUnicode_AsUTF8String() instead of _PyUnicode_AsString()
-rw-r--r-- | Modules/main.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/Modules/main.c b/Modules/main.c index bebaab5..7929b05 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -275,6 +275,40 @@ error: return 1; } +static int +run_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf) +{ + PyObject *unicode, *bytes = NULL; + 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_AsUTF8String(unicode); + Py_DECREF(unicode); + } + if (bytes != NULL) + filename_str = PyBytes_AsString(bytes); + else { + PyErr_Clear(); + filename_str = "<decoding error>"; + } + } + else + filename_str = "<stdin>"; + + run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf); + Py_XDECREF(bytes); + return run != 0; +} + /* Main program */ @@ -644,30 +678,8 @@ Py_Main(int argc, wchar_t **argv) } } - if (sts==-1) { - PyObject *filenameObj = NULL; - char *p_cfilename = "<stdin>"; - if (filename) { - filenameObj = PyUnicode_FromWideChar( - filename, wcslen(filename)); - if (filenameObj != NULL) - p_cfilename = _PyUnicode_AsString(filenameObj); - else - p_cfilename = "<decoding error>"; - } - /* call pending calls like signal handlers (SIGINT) */ - if (Py_MakePendingCalls() == -1) { - PyErr_Print(); - sts = 1; - } else { - sts = PyRun_AnyFileExFlags( - fp, - p_cfilename, - filename != NULL, &cf) != 0; - } - Py_XDECREF(filenameObj); - } - + if (sts == -1) + sts = run_file(fp, filename, &cf); } /* Check this environment variable at the end, to give programs the |