]> granicus.if.org Git - python/commitdiff
needforspeed: use a macro to fix slice indexes
authorFredrik Lundh <fredrik@pythonware.com>
Fri, 26 May 2006 19:33:03 +0000 (19:33 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Fri, 26 May 2006 19:33:03 +0000 (19:33 +0000)
Objects/unicodeobject.c

index 0f791c06024db5525964f64235114fa90026ff29..2732c2ccaf1a319bb6300948ada47707e4324860 100644 (file)
@@ -3874,6 +3874,19 @@ STRINGLIB_CMP(const Py_UNICODE* str, const Py_UNICODE* other, Py_ssize_t len)
 #include "stringlib/find.h"
 #include "stringlib/partition.h"
 
+/* helper macro to fixup start/end slice values */
+#define FIX_START_END(obj)                      \
+    if (start < 0)                              \
+        start += (obj)->length;                 \
+    if (start < 0)                              \
+        start = 0;                              \
+    if (end > (obj)->length)                    \
+        end = (obj)->length;                    \
+    if (end < 0)                                \
+        end += (obj)->length;                   \
+    if (end < 0)                                \
+        end = 0;
+
 Py_ssize_t PyUnicode_Count(PyObject *str,
                            PyObject *substr,
                            Py_ssize_t start,
@@ -3892,16 +3905,7 @@ Py_ssize_t PyUnicode_Count(PyObject *str,
        return -1;
     }
 
-    if (start < 0)
-        start += str_obj->length;
-    if (start < 0)
-        start = 0;
-    if (end > str_obj->length)
-        end = str_obj->length;
-    if (end < 0)
-        end += str_obj->length;
-    if (end < 0)
-        end = 0;
+    FIX_START_END(str_obj);
 
     result = stringlib_count(
         str_obj->str + start, end - start, sub_obj->str, sub_obj->length
@@ -3919,17 +3923,7 @@ static Py_ssize_t findstring(PyUnicodeObject *self,
               Py_ssize_t end,
               int direction)
 {
-    if (start < 0)
-        start += self->length;
-    if (start < 0)
-        start = 0;
-
-    if (end > self->length)
-        end = self->length;
-    if (end < 0)
-        end += self->length;
-    if (end < 0)
-        end = 0;
+    FIX_START_END(self);
 
     if (substring->length == 0)
        return (direction > 0) ? start : end;
@@ -3969,16 +3963,7 @@ Py_ssize_t PyUnicode_Find(PyObject *str,
        return -2;
     }
 
-    if (start < 0)
-        start += str_obj->length;
-    if (start < 0)
-        start = 0;
-    if (end > str_obj->length)
-        end = str_obj->length;
-    if (end < 0)
-        end += str_obj->length;
-    if (end < 0)
-        end = 0;
+    FIX_START_END(str_obj);
 
     if (direction > 0)
         result = stringlib_find(
@@ -4004,20 +3989,10 @@ int tailmatch(PyUnicodeObject *self,
              Py_ssize_t end,
              int direction)
 {
-    if (start < 0)
-        start += self->length;
-    if (start < 0)
-        start = 0;
-
     if (substring->length == 0)
         return 1;
 
-    if (end > self->length)
-        end = self->length;
-    if (end < 0)
-        end += self->length;
-    if (end < 0)
-        end = 0;
+    FIX_START_END(self);
 
     end -= substring->length;
     if (end < start)
@@ -5172,16 +5147,7 @@ unicode_count(PyUnicodeObject *self, PyObject *args)
     if (substring == NULL)
        return NULL;
 
-    if (start < 0)
-        start += self->length;
-    if (start < 0)
-        start = 0;
-    if (end > self->length)
-        end = self->length;
-    if (end < 0)
-        end += self->length;
-    if (end < 0)
-        end = 0;
+    FIX_START_END(self);
 
     result = PyInt_FromSsize_t(
         stringlib_count(self->str + start, end - start,