]> granicus.if.org Git - python/commitdiff
Issue #17615: Comparing two Unicode strings now uses wmemcmp() when possible
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 8 Apr 2013 20:43:44 +0000 (22:43 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Mon, 8 Apr 2013 20:43:44 +0000 (22:43 +0200)
wmemcmp() is twice faster than a dummy loop (342 usec vs 744 usec) on Fedora
18/x86_64, GCC 4.7.2.

Objects/unicodeobject.c
PC/pyconfig.h
configure
configure.ac
pyconfig.h.in

index d450b4df506b969a5b02fe87e754199c54b62631..e9153c0de8ceb87f4a3cf52d566de882aa4855a4 100644 (file)
@@ -10304,8 +10304,19 @@ unicode_compare(PyObject *str1, PyObject *str2)
             COMPARE(Py_UCS2, Py_UCS1);
             break;
         case PyUnicode_2BYTE_KIND:
+        {
+#if defined(HAVE_WMEMCMP) && SIZEOF_WCHAR_T == 2
+            int cmp = wmemcmp((wchar_t *)data1, (wchar_t *)data2, len);
+            /* normalize result of wmemcmp() into the range [-1; 1] */
+            if (cmp < 0)
+                return -1;
+            if (cmp > 0)
+                return 1;
+#else
             COMPARE(Py_UCS2, Py_UCS2);
+#endif
             break;
+        }
         case PyUnicode_4BYTE_KIND:
             COMPARE(Py_UCS2, Py_UCS4);
             break;
@@ -10324,8 +10335,19 @@ unicode_compare(PyObject *str1, PyObject *str2)
             COMPARE(Py_UCS4, Py_UCS2);
             break;
         case PyUnicode_4BYTE_KIND:
+        {
+#if defined(HAVE_WMEMCMP) && SIZEOF_WCHAR_T == 4
+            int cmp = wmemcmp((wchar_t *)data1, (wchar_t *)data2, len);
+            /* normalize result of wmemcmp() into the range [-1; 1] */
+            if (cmp < 0)
+                return -1;
+            if (cmp > 0)
+                return 1;
+#else
             COMPARE(Py_UCS4, Py_UCS4);
+#endif
             break;
+        }
         default:
             assert(0);
         }
index c5f16e580ff8cc0850c893cc0c2360c8abf697b6..1284db8610e599640ccc873a406664ac153dcc24 100644 (file)
@@ -645,6 +645,9 @@ Py_NO_ENABLE_SHARED to find out.  Also support MS_NO_COREDLL for b/w compat */
 #define HAVE_WCSXFRM 1
 #endif
 
+/* Define to 1 if you have the `wmemcmp' function. */
+#define HAVE_WMEMCMP 1
+
 /* Define if the zlib library has inflateCopy */
 #define HAVE_ZLIB_COPY 1
 
index 7d8a65526ace7096436f8d08acc8c8de3eafc75a..53d38908af4e1c69edb1f447b13d54141b77c11b 100755 (executable)
--- a/configure
+++ b/configure
@@ -10273,7 +10273,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
  sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \
  sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
  truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \
- wcscoll wcsftime wcsxfrm writev _getpty
+ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
index caef808348f698c50663e06fd914ffec279467d7..053e4a46b4032c1f525291d163c949cebfd1dc78 100644 (file)
@@ -2816,7 +2816,7 @@ AC_CHECK_FUNCS(alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
  sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \
  sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
  truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \
- wcscoll wcsftime wcsxfrm writev _getpty)
+ wcscoll wcsftime wcsxfrm wmemcmp writev _getpty)
 
 AC_CHECK_DECL(dirfd,
     AC_DEFINE(HAVE_DIRFD, 1,
index 231146a666e24083ae2b7c9328418e1187d967df..4f252dc100c60791ea4524b4cc25021c50487d67 100644 (file)
 /* Define to 1 if you have the `wcsxfrm' function. */
 #undef HAVE_WCSXFRM
 
+/* Define to 1 if you have the `wmemcmp' function. */
+#undef HAVE_WMEMCMP
+
 /* Define if tzset() actually switches the local timezone in a meaningful way.
    */
 #undef HAVE_WORKING_TZSET
 /* Define if setpgrp() must be called as setpgrp(0, 0). */
 #undef SETPGRP_HAVE_ARG
 
-/* Define this to be extension of shared libraries (including the dot!). */
-#undef SHLIB_EXT
-
 /* Define if i>>j for signed int i does not extend the sign bit when i < 0 */
 #undef SIGNED_RIGHT_SHIFT_ZERO_FILLS