[Python-checkins] cpython (merge 3.3 -> default): Check for NULL before the pointer aligning in fastsearch_memchr_1char.

serhiy.storchaka python-checkins at python.org
Tue Jan 15 12:33:36 CET 2013


http://hg.python.org/cpython/rev/1f66fc397c8d
changeset:   81512:1f66fc397c8d
parent:      81510:525407d89277
parent:      81511:ad9b5c69b8b6
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Tue Jan 15 13:32:41 2013 +0200
summary:
  Check for NULL before the pointer aligning in fastsearch_memchr_1char.
There is no guarantee that NULL is aligned.

files:
  Objects/stringlib/fastsearch.h |  25 ++++++++-------------
  1 files changed, 10 insertions(+), 15 deletions(-)


diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h
--- a/Objects/stringlib/fastsearch.h
+++ b/Objects/stringlib/fastsearch.h
@@ -38,25 +38,18 @@
                                    STRINGLIB_CHAR ch, unsigned char needle,
                                    Py_ssize_t maxcount, int mode)
 {
-    void *candidate;
-    const STRINGLIB_CHAR *found;
-
-#define DO_MEMCHR(memchr, s, needle, nchars) do { \
-    candidate = memchr((const void *) (s), (needle), (nchars) * sizeof(STRINGLIB_CHAR)); \
-    found = (const STRINGLIB_CHAR *) _Py_ALIGN_DOWN(candidate, sizeof(STRINGLIB_CHAR)); \
-    } while (0)
-
     if (mode == FAST_SEARCH) {
         const STRINGLIB_CHAR *ptr = s;
         const STRINGLIB_CHAR *e = s + n;
         while (ptr < e) {
-            DO_MEMCHR(memchr, ptr, needle, e - ptr);
-            if (found == NULL)
+            void *candidate = memchr((const void *) ptr, needle, (e - ptr) * sizeof(STRINGLIB_CHAR));
+            if (candidate == NULL)
                 return -1;
-            if (sizeof(STRINGLIB_CHAR) == 1 || *found == ch)
-                return (found - s);
+            ptr = (const STRINGLIB_CHAR *) _Py_ALIGN_DOWN(candidate, sizeof(STRINGLIB_CHAR));
+            if (sizeof(STRINGLIB_CHAR) == 1 || *ptr == ch)
+                return (ptr - s);
             /* False positive */
-            ptr = found + 1;
+            ptr++;
         }
         return -1;
     }
@@ -66,9 +59,11 @@
        faster than our hand-written loop in FASTSEARCH below */
     else if (mode == FAST_RSEARCH) {
         while (n > 0) {
-            DO_MEMCHR(memrchr, s, needle, n);
-            if (found == NULL)
+            const STRINGLIB_CHAR *found;
+            void *candidate = memrchr((const void *) s, needle, n * sizeof(STRINGLIB_CHAR));
+            if (candidate == NULL)
                 return -1;
+            found = (const STRINGLIB_CHAR *) _Py_ALIGN_DOWN(candidate, sizeof(STRINGLIB_CHAR));
             n = found - s;
             if (sizeof(STRINGLIB_CHAR) == 1 || *found == ch)
                 return n;

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


More information about the Python-checkins mailing list