diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-10-07 22:23:10 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-10-07 22:23:10 (GMT) |
commit | a4a759515e2e0114d41acdada3642265c01270ac (patch) | |
tree | 1929fc7dd922e10ec6d710a390b4f0fdcffaa1db /Python | |
parent | b306d7594ff0ed5ba666dbb26491a269abfbc9d7 (diff) | |
download | cpython-a4a759515e2e0114d41acdada3642265c01270ac.zip cpython-a4a759515e2e0114d41acdada3642265c01270ac.tar.gz cpython-a4a759515e2e0114d41acdada3642265c01270ac.tar.bz2 |
_Py_stat() and _Py_fopen(): avoid PyUnicode_AsWideCharString() on Windows
On Windows, Py_UNICODE is wchar_t, so we can avoid the expensive Py_UNICODE*
=> wchar_t* conversion.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/fileutils.c | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/Python/fileutils.c b/Python/fileutils.c index 5d01867..bd6ab5d 100644 --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -215,24 +215,19 @@ _Py_wstat(const wchar_t* path, struct stat *buf) PyErr_Occurred()) unicode error. */ int -_Py_stat(PyObject *unicode, struct stat *statbuf) +_Py_stat(PyObject *path, struct stat *statbuf) { #ifdef MS_WINDOWS - wchar_t *path; int err; struct _stat wstatbuf; - path = PyUnicode_AsWideCharString(unicode, NULL); - if (path == NULL) - return -1; - err = _wstat(path, &wstatbuf); - PyMem_Free(path); + err = _wstat(PyUnicode_AS_UNICODE(path), &wstatbuf); if (!err) statbuf->st_mode = wstatbuf.st_mode; return err; #else int ret; - PyObject *bytes = PyUnicode_EncodeFSDefault(unicode); + PyObject *bytes = PyUnicode_EncodeFSDefault(path); if (bytes == NULL) return -1; ret = stat(PyBytes_AS_STRING(bytes), statbuf); @@ -270,27 +265,20 @@ _Py_wfopen(const wchar_t *path, const wchar_t *mode) PyErr_Occurred()) on unicode error */ FILE* -_Py_fopen(PyObject *unicode, const char *mode) +_Py_fopen(PyObject *path, const char *mode) { #ifdef MS_WINDOWS - wchar_t *path; wchar_t wmode[10]; int usize; - FILE *f; usize = MultiByteToWideChar(CP_ACP, 0, mode, -1, wmode, sizeof(wmode)); if (usize == 0) return NULL; - path = PyUnicode_AsWideCharString(unicode, NULL); - if (path == NULL) - return NULL; - f = _wfopen(path, wmode); - PyMem_Free(path); - return f; + return _wfopen(PyUnicode_AS_UNICODE(path), wmode); #else FILE *f; - PyObject *bytes = PyUnicode_EncodeFSDefault(unicode); + PyObject *bytes = PyUnicode_EncodeFSDefault(path); if (bytes == NULL) return NULL; f = fopen(PyBytes_AS_STRING(bytes), mode); |