From 8cc70dcf7020f1e5c286fed5b2a1034f5ba36afe Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 11 Oct 2011 23:22:22 +0200 Subject: [PATCH] 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 --- Objects/stringlib/asciilib.h | 1 + Objects/stringlib/fastsearch.h | 10 ++++++++-- Objects/stringlib/stringdefs.h | 1 + Objects/stringlib/ucs1lib.h | 1 + Objects/stringlib/ucs2lib.h | 1 + Objects/stringlib/ucs4lib.h | 1 + Objects/stringlib/undef.h | 1 + Objects/stringlib/unicodedefs.h | 1 + 8 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h index 935a9c741c4..bfd5d75a3c8 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 33ab6ff94e6..085ec6a3d2b 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 96193322c3d..41449fce4e7 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 c0f7adf3adb..0b82a84e97d 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 fc62fb7b3b5..18117ef5e65 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 be1206a6d5f..988ddc08d8f 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 40b4391cd66..fd87e56d360 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 0c40b801e35..5c0761a74c4 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"