]> granicus.if.org Git - python/commitdiff
Issue #25207, #14626: Fix my commit.
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 21 Sep 2015 23:29:33 +0000 (01:29 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Mon, 21 Sep 2015 23:29:33 +0000 (01:29 +0200)
It doesn't work to use #define XXX defined(YYY)" and then "#ifdef XXX"
to check YYY.

Modules/posixmodule.c
Objects/unicodeobject.c

index e5b47929cd29985d486d164ece14953eb3371913..467ce2c576b38b2cf43322f0e47ececb577bf128 100644 (file)
@@ -4605,9 +4605,9 @@ utime_fd(utime_t *ut, int fd)
     #define PATH_UTIME_HAVE_FD 0
 #endif
 
-
-#define UTIME_HAVE_NOFOLLOW_SYMLINKS \
-        (defined(HAVE_UTIMENSAT) || defined(HAVE_LUTIMES))
+#if defined(HAVE_UTIMENSAT) || defined(HAVE_LUTIMES)
+#  define UTIME_HAVE_NOFOLLOW_SYMLINKS
+#endif
 
 #ifdef UTIME_HAVE_NOFOLLOW_SYMLINKS
 
index d0b285abac07d5f38cbb46c5641270b1710406fc..63a627fc9a34813e5d95af268aacdc336c9489d1 100644 (file)
@@ -4709,8 +4709,9 @@ PyUnicode_DecodeUTF8Stateful(const char *s,
     Py_ssize_t startinpos;
     Py_ssize_t endinpos;
     const char *errmsg = "";
-    PyObject *errorHandler = NULL;
+    PyObject *error_handler_obj = NULL;
     PyObject *exc = NULL;
+    _Py_error_handler error_handler = _Py_ERROR_UNKNOWN;
 
     if (size == 0) {
         if (consumed)
@@ -4773,24 +4774,57 @@ PyUnicode_DecodeUTF8Stateful(const char *s,
             continue;
         }
 
-        if (unicode_decode_call_errorhandler_writer(
-                errors, &errorHandler,
-                "utf-8", errmsg,
-                &starts, &end, &startinpos, &endinpos, &exc, &s,
-                &writer))
-            goto onError;
+        /* undecodable byte: call the error handler */
+
+        if (error_handler == _Py_ERROR_UNKNOWN)
+            error_handler = get_error_handler(errors);
+
+        switch (error_handler)
+        {
+        case _Py_ERROR_REPLACE:
+        case _Py_ERROR_SURROGATEESCAPE:
+        {
+            unsigned char ch = (unsigned char)*s;
+
+            /* Fast-path: the error handler only writes one character,
+               but we may switch to UCS2 at the first write */
+            if (_PyUnicodeWriter_PrepareKind(&writer, PyUnicode_2BYTE_KIND) < 0)
+                goto onError;
+            kind = writer.kind;
+
+            if (error_handler == _Py_ERROR_REPLACE)
+                PyUnicode_WRITE(kind, writer.data, writer.pos, 0xfffd);
+            else
+                PyUnicode_WRITE(kind, writer.data, writer.pos, ch + 0xdc00);
+            writer.pos++;
+            ++s;
+            break;
+        }
+
+        case _Py_ERROR_IGNORE:
+            s++;
+            break;
+
+        default:
+            if (unicode_decode_call_errorhandler_writer(
+                    errors, &error_handler_obj,
+                    "utf-8", errmsg,
+                    &starts, &end, &startinpos, &endinpos, &exc, &s,
+                    &writer))
+                goto onError;
+        }
     }
 
 End:
     if (consumed)
         *consumed = s - starts;
 
-    Py_XDECREF(errorHandler);
+    Py_XDECREF(error_handler_obj);
     Py_XDECREF(exc);
     return _PyUnicodeWriter_Finish(&writer);
 
 onError:
-    Py_XDECREF(errorHandler);
+    Py_XDECREF(error_handler_obj);
     Py_XDECREF(exc);
     _PyUnicodeWriter_Dealloc(&writer);
     return NULL;