From: Victor Stinner Date: Tue, 11 Oct 2011 21:22:22 +0000 (+0200) Subject: Fix fastsearch for UCS2 and UCS4 X-Git-Tag: v3.3.0a1~1213 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8cc70dcf7020f1e5c286fed5b2a1034f5ba36afe;p=thirdparty%2FPython%2Fcpython.git Fix fastsearch for UCS2 and UCS4 * If needle is 0, try (p[0] >> 16) & 0xff for UCS4 * Disable fastsearch_memchr_1char() if needle is zero for UCS2 and UCS4 --- diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h index 935a9c741c41..bfd5d75a3c89 100644 --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -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" diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h index 33ab6ff94e6f..085ec6a3d2b8 100644 --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -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); diff --git a/Objects/stringlib/stringdefs.h b/Objects/stringlib/stringdefs.h index 96193322c3d6..41449fce4e74 100644 --- a/Objects/stringlib/stringdefs.h +++ b/Objects/stringlib/stringdefs.h @@ -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" diff --git a/Objects/stringlib/ucs1lib.h b/Objects/stringlib/ucs1lib.h index c0f7adf3adb2..0b82a84e97d2 100644 --- a/Objects/stringlib/ucs1lib.h +++ b/Objects/stringlib/ucs1lib.h @@ -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" diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h index fc62fb7b3b53..18117ef5e652 100644 --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -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" diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h index be1206a6d5fe..988ddc08d8f5 100644 --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -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" diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h index 40b4391cd665..fd87e56d360a 100644 --- a/Objects/stringlib/undef.h +++ b/Objects/stringlib/undef.h @@ -1,5 +1,6 @@ #undef FASTSEARCH #undef STRINGLIB +#undef STRINGLIB_SIZEOF_CHAR #undef STRINGLIB_CHAR #undef STRINGLIB_STR #undef STRINGLIB_LEN diff --git a/Objects/stringlib/unicodedefs.h b/Objects/stringlib/unicodedefs.h index 0c40b801e359..5c0761a74c4b 100644 --- a/Objects/stringlib/unicodedefs.h +++ b/Objects/stringlib/unicodedefs.h @@ -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"