[Python-checkins] r85307 - in python/branches/py3k: Include/fileutils.h Python/fileutils.c

victor.stinner python-checkins at python.org
Fri Oct 8 00:23:11 CEST 2010


Author: victor.stinner
Date: Fri Oct 8 00:23:10 2010
New Revision: 85307
Log:
_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.
Modified:
 python/branches/py3k/Include/fileutils.h
 python/branches/py3k/Python/fileutils.c
Modified: python/branches/py3k/Include/fileutils.h
==============================================================================
--- python/branches/py3k/Include/fileutils.h	(original)
+++ python/branches/py3k/Include/fileutils.h	Fri Oct 8 00:23:10 2010
@@ -19,7 +19,7 @@
 
 #ifdef HAVE_STAT
 PyAPI_FUNC(int) _Py_stat(
- PyObject *unicode,
+ PyObject *path,
 struct stat *statbuf);
 #endif
 
@@ -28,7 +28,7 @@
 const wchar_t *mode);
 
 PyAPI_FUNC(FILE*) _Py_fopen(
- PyObject *unicode,
+ PyObject *path,
 const char *mode);
 
 #ifdef HAVE_READLINK
Modified: python/branches/py3k/Python/fileutils.c
==============================================================================
--- python/branches/py3k/Python/fileutils.c	(original)
+++ python/branches/py3k/Python/fileutils.c	Fri Oct 8 00:23:10 2010
@@ -215,24 +215,19 @@
 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 @@
 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);


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /