Merged revisions 81170 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r81170 | victor.stinner | 2010-05-14 18:35:39 +0200 (ven., 14 mai 2010) | 6 lines

  posix_listdir(), posix_readlink(): avoid temporary PyBytes object

  Use directly PyUnicode_DecodeFSDefaultAndSize() instead of
  PyBytes_FromStringAndSize() + PyUnicode_FromEncodedObject() if the argument is
  unicode.
........
This commit is contained in:
Victor Stinner 2010-05-14 16:39:10 +00:00
parent 9076f9e187
commit 26a968d8fe
1 changed files with 10 additions and 38 deletions

View File

@ -2515,33 +2515,17 @@ posix_listdir(PyObject *self, PyObject *args)
(NAMLEN(ep) == 1 || (NAMLEN(ep) == 1 ||
(ep->d_name[1] == '.' && NAMLEN(ep) == 2))) (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
continue; continue;
v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep)); if (arg_is_unicode)
v = PyUnicode_DecodeFSDefaultAndSize(ep->d_name, NAMLEN(ep));
else
v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep));
if (v == NULL) { if (v == NULL) {
Py_DECREF(d); Py_CLEAR(d);
d = NULL;
break; break;
} }
if (arg_is_unicode) {
PyObject *w;
w = PyUnicode_FromEncodedObject(v,
Py_FileSystemDefaultEncoding,
"surrogateescape");
Py_DECREF(v);
if (w != NULL)
v = w;
else {
/* Encoding failed to decode ASCII bytes.
Raise exception. */
Py_DECREF(d);
d = NULL;
break;
}
}
if (PyList_Append(d, v) != 0) { if (PyList_Append(d, v) != 0) {
Py_DECREF(v); Py_DECREF(v);
Py_DECREF(d); Py_CLEAR(d);
d = NULL;
break; break;
} }
Py_DECREF(v); Py_DECREF(v);
@ -4676,22 +4660,10 @@ posix_readlink(PyObject *self, PyObject *args)
return posix_error_with_allocated_filename(opath); return posix_error_with_allocated_filename(opath);
release_bytes(opath); release_bytes(opath);
v = PyBytes_FromStringAndSize(buf, n); if (arg_is_unicode)
if (arg_is_unicode) { return PyUnicode_DecodeFSDefaultAndSize(buf, n);
PyObject *w; else
return PyBytes_FromStringAndSize(buf, n);
w = PyUnicode_FromEncodedObject(v,
Py_FileSystemDefaultEncoding,
"surrogateescape");
if (w != NULL) {
Py_DECREF(v);
v = w;
}
else {
v = NULL;
}
}
return v;
} }
#endif /* HAVE_READLINK */ #endif /* HAVE_READLINK */