[Python-checkins] r81173 - python/branches/release31-maint/Modules/posixmodule.c

victor.stinner python-checkins at python.org
Fri May 14 20:07:39 CEST 2010


Author: victor.stinner
Date: Fri May 14 20:07:39 2010
New Revision: 81173

Log:
Revert r81171 (posix_listdir(), posix_readlink(): avoid temporary PyBytes object)

PyUnicode_DecodeFSDefault*() doesn't use surrogateescape error handler, and so
PyUnicode_FromEncodedObject(v, Py_FileSystemDefaultEncoding, "surrogateescape")
cannot be replaced by PyUnicode_DecodeFSDefault().

It's a bad idea to try to fix surrogates things in Python 3.1...


Modified:
   python/branches/release31-maint/Modules/posixmodule.c

Modified: python/branches/release31-maint/Modules/posixmodule.c
==============================================================================
--- python/branches/release31-maint/Modules/posixmodule.c	(original)
+++ python/branches/release31-maint/Modules/posixmodule.c	Fri May 14 20:07:39 2010
@@ -2515,17 +2515,33 @@
             (NAMLEN(ep) == 1 ||
              (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
             continue;
-        if (arg_is_unicode)
-            v = PyUnicode_DecodeFSDefaultAndSize(ep->d_name, NAMLEN(ep));
-        else
-            v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep));
+        v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep));
         if (v == NULL) {
-            Py_CLEAR(d);
+            Py_DECREF(d);
+            d = NULL;
             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) {
             Py_DECREF(v);
-            Py_CLEAR(d);
+            Py_DECREF(d);
+            d = NULL;
             break;
         }
         Py_DECREF(v);
@@ -4660,10 +4676,22 @@
         return posix_error_with_allocated_filename(opath);
 
     release_bytes(opath);
-    if (arg_is_unicode)
-        return PyUnicode_DecodeFSDefaultAndSize(buf, n);
-    else
-        return PyBytes_FromStringAndSize(buf, n);
+    v = PyBytes_FromStringAndSize(buf, n);
+    if (arg_is_unicode) {
+        PyObject *w;
+
+        w = PyUnicode_FromEncodedObject(v,
+                                        Py_FileSystemDefaultEncoding,
+                                        "surrogateescape");
+        if (w != NULL) {
+            Py_DECREF(v);
+            v = w;
+        }
+        else {
+            v = NULL;
+        }
+    }
+    return v;
 }
 #endif /* HAVE_READLINK */
 


More information about the Python-checkins mailing list