[Python-checkins] cpython: Fix fastsearch for UCS2 and UCS4

victor.stinner python-checkins at python.org
Tue Oct 11 23:22:33 CEST 2011


http://hg.python.org/cpython/rev/bfd3fcfb02f3
changeset:   72874:bfd3fcfb02f3
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Tue Oct 11 23:22:22 2011 +0200
summary:
  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

files:
  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
--- 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
--- a/Objects/stringlib/fastsearch.h
+++ b/Objects/stringlib/fastsearch.h
@@ -115,11 +115,17 @@
             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
--- 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
--- 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
--- 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
--- 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
--- 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
--- 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"

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list