]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix fastsearch for UCS2 and UCS4
authorVictor Stinner <victor.stinner@haypocalc.com>
Tue, 11 Oct 2011 21:22:22 +0000 (23:22 +0200)
committerVictor Stinner <victor.stinner@haypocalc.com>
Tue, 11 Oct 2011 21:22:22 +0000 (23:22 +0200)
 * If needle is 0, try (p[0] >> 16) & 0xff for UCS4
 * Disable fastsearch_memchr_1char() if needle is zero for UCS2 and UCS4

Objects/stringlib/asciilib.h
Objects/stringlib/fastsearch.h
Objects/stringlib/stringdefs.h
Objects/stringlib/ucs1lib.h
Objects/stringlib/ucs2lib.h
Objects/stringlib/ucs4lib.h
Objects/stringlib/undef.h
Objects/stringlib/unicodedefs.h

index 935a9c741c414d4fd932dca55cccdc33c6eaaede..bfd5d75a3c89a1d7a23b2c17a0967541c236355f 100644 (file)
@@ -6,6 +6,7 @@
 #define FASTSEARCH               asciilib_fastsearch
 #define STRINGLIB(F)             asciilib_##F
 #define STRINGLIB_OBJECT         PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR    1
 #define STRINGLIB_CHAR           Py_UCS1
 #define STRINGLIB_TYPE_NAME      "unicode"
 #define STRINGLIB_PARSE_CODE     "U"
index 33ab6ff94e6ff44510effc26f5b5e2b7eb809a05..085ec6a3d2b8333089d6d4ea5d5cf0bafe426c63 100644 (file)
@@ -115,11 +115,17 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
             unsigned char needle;
             int use_needle = 1;
             needle = p[0] & 0xff;
-            if (needle == 0 && sizeof(STRINGLIB_CHAR) > 1) {
+#if STRINGLIB_SIZEOF_CHAR > 1
+            if (needle == 0) {
                 needle = (p[0] >> 8) & 0xff;
-                if (needle >= 32)
+#if STRINGLIB_SIZEOF_CHAR > 2
+                if (needle == 0)
+                    needle = (p[0] >> 16) & 0xff;
+#endif
+                if (needle >= 32 || needle == 0)
                     use_needle = 0;
             }
+#endif
             if (use_needle)
                 return STRINGLIB(fastsearch_memchr_1char)
                        (s, n, p[0], needle, maxcount, mode);
index 96193322c3d683dc052b2b2362809f60b346782b..41449fce4e74762995639672c572d74895006fe8 100644 (file)
@@ -9,6 +9,7 @@
 #define FASTSEARCH fastsearch
 #define STRINGLIB(F) stringlib_##F
 #define STRINGLIB_OBJECT         PyBytesObject
+#define STRINGLIB_SIZEOF_CHAR    1
 #define STRINGLIB_CHAR           char
 #define STRINGLIB_TYPE_NAME      "string"
 #define STRINGLIB_PARSE_CODE     "S"
index c0f7adf3adb2db45ceb9b6854300d8bfbfcd3099..0b82a84e97d2563018ad9391c8690c7ed6a87026 100644 (file)
@@ -6,6 +6,7 @@
 #define FASTSEARCH               ucs1lib_fastsearch
 #define STRINGLIB(F)             ucs1lib_##F
 #define STRINGLIB_OBJECT         PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR    1
 #define STRINGLIB_CHAR           Py_UCS1
 #define STRINGLIB_TYPE_NAME      "unicode"
 #define STRINGLIB_PARSE_CODE     "U"
index fc62fb7b3b5345572b97317e7605af9bc59f5050..18117ef5e652d47fc537273a0b8b26f6eb58e35a 100644 (file)
@@ -6,6 +6,7 @@
 #define FASTSEARCH               ucs2lib_fastsearch
 #define STRINGLIB(F)             ucs2lib_##F
 #define STRINGLIB_OBJECT         PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR    2
 #define STRINGLIB_CHAR           Py_UCS2
 #define STRINGLIB_TYPE_NAME      "unicode"
 #define STRINGLIB_PARSE_CODE     "U"
index be1206a6d5fe17025dd42ea48e8d815759d9b188..988ddc08d8f5ebe7ea4da69369a8944467dd6186 100644 (file)
@@ -6,6 +6,7 @@
 #define FASTSEARCH               ucs4lib_fastsearch
 #define STRINGLIB(F)             ucs4lib_##F
 #define STRINGLIB_OBJECT         PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR    4
 #define STRINGLIB_CHAR           Py_UCS4
 #define STRINGLIB_TYPE_NAME      "unicode"
 #define STRINGLIB_PARSE_CODE     "U"
index 40b4391cd665e151c92da59184d617e284f0330f..fd87e56d360af3922803301986854fc02a8e2734 100644 (file)
@@ -1,5 +1,6 @@
 #undef  FASTSEARCH
 #undef  STRINGLIB
+#undef  STRINGLIB_SIZEOF_CHAR
 #undef  STRINGLIB_CHAR
 #undef  STRINGLIB_STR
 #undef  STRINGLIB_LEN
index 0c40b801e35954440cf130cac7d7089ea77af2af..5c0761a74c4bf3b560432973f0f6dc6601e3da6e 100644 (file)
@@ -9,6 +9,7 @@
 #define FASTSEARCH               fastsearch
 #define STRINGLIB(F)             stringlib_##F
 #define STRINGLIB_OBJECT         PyUnicodeObject
+#define STRINGLIB_SIZEOF_CHAR    Py_UNICODE_SIZE
 #define STRINGLIB_CHAR           Py_UNICODE
 #define STRINGLIB_TYPE_NAME      "unicode"
 #define STRINGLIB_PARSE_CODE     "U"