]> granicus.if.org Git - python/commitdiff
needforspeed: replace improvements, changed to Py_LOCAL_INLINE
authorFredrik Lundh <fredrik@pythonware.com>
Sat, 27 May 2006 14:58:20 +0000 (14:58 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Sat, 27 May 2006 14:58:20 +0000 (14:58 +0000)
where appropriate

Objects/stringlib/count.h
Objects/stringlib/fastsearch.h
Objects/stringlib/find.h
Objects/stringlib/partition.h
Objects/stringobject.c
Objects/unicodeobject.c

index 0036f634241bcaf603b303768011c1d8c22f9fa0..0bd02b59746f7393ff450f67ec04bb064176f32e 100644 (file)
@@ -7,7 +7,7 @@
 #error must include "stringlib/fastsearch.h" before including this module
 #endif
 
-Py_LOCAL(Py_ssize_t)
+Py_LOCAL_INLINE(Py_ssize_t)
 stringlib_count(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
                 const STRINGLIB_CHAR* sub, Py_ssize_t sub_len)
 {
index 3d2f92aa5425d6345f8f8bc1b6397ae947a133a4..8f79c360d34ecbb2acd7e950e9b39db8d985d19e 100644 (file)
@@ -17,7 +17,7 @@
 #define FAST_COUNT 0
 #define FAST_SEARCH 1
 
-Py_LOCAL(Py_ssize_t)
+Py_LOCAL_INLINE(Py_ssize_t)
 fastsearch(const STRINGLIB_CHAR* s, Py_ssize_t n,
            const STRINGLIB_CHAR* p, Py_ssize_t m,
            int mode)
index 9db633dd3a5f6b58846d35fc5f872e31d37d1318..9f010c74ea8c62ee67c6c58c0e1966dc86bf042e 100644 (file)
@@ -7,7 +7,7 @@
 #error must include "stringlib/fastsearch.h" before including this module
 #endif
 
-Py_LOCAL(Py_ssize_t)
+Py_LOCAL_INLINE(Py_ssize_t)
 stringlib_find(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
                const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
                Py_ssize_t offset)
@@ -25,7 +25,7 @@ stringlib_find(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
     return pos;
 }
 
-Py_LOCAL(Py_ssize_t)
+Py_LOCAL_INLINE(Py_ssize_t)
 stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
                 const STRINGLIB_CHAR* sub, Py_ssize_t sub_len,
                 Py_ssize_t offset)
@@ -50,7 +50,7 @@ stringlib_rfind(const STRINGLIB_CHAR* str, Py_ssize_t str_len,
 
 #ifdef STRINGLIB_STR
 
-Py_LOCAL(Py_ssize_t)
+Py_LOCAL_INLINE(Py_ssize_t)
 stringlib_find_obj(PyObject* str, PyObject* sub,
                    Py_ssize_t start, Py_ssize_t end)
 {
@@ -60,7 +60,7 @@ stringlib_find_obj(PyObject* str, PyObject* sub,
         );
 }
 
-Py_LOCAL(int)
+Py_LOCAL_INLINE(int)
 stringlib_contains_obj(PyObject* str, PyObject* sub)
 {
     return stringlib_find(
@@ -69,7 +69,7 @@ stringlib_contains_obj(PyObject* str, PyObject* sub)
         ) != -1;
 }
 
-Py_LOCAL(Py_ssize_t)
+Py_LOCAL_INLINE(Py_ssize_t)
 stringlib_rfind_obj(PyObject* str, PyObject* sub,
                     Py_ssize_t start, Py_ssize_t end)
 {
index 11a12c6f46dfa04bcbaa9f332177481b24612a47..14863475d4951c5d0b3a5d38fc04393733a668f3 100644 (file)
@@ -7,7 +7,7 @@
 #error must include "stringlib/fastsearch.h" before including this module
 #endif
 
-Py_LOCAL(PyObject*)
+Py_LOCAL_INLINE(PyObject*)
 stringlib_partition(
     PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len,
     PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len
@@ -51,7 +51,7 @@ stringlib_partition(
     return out;
 }
 
-Py_LOCAL(PyObject*)
+Py_LOCAL_INLINE(PyObject*)
 stringlib_rpartition(
     PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len,
     PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len
index 37c7214289c4c25a92efbb4c6dc44e34c5d0abd7..7eab4bd9de70ab6d0ead12b509260690b705c6e8 100644 (file)
@@ -1371,7 +1371,7 @@ static const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"};
 #define RSKIP_SPACE(s, i)        { while (i>=0  &&  isspace(Py_CHARMASK(s[i]))) i--; }
 #define RSKIP_NONSPACE(s, i)     { while (i>=0  && !isspace(Py_CHARMASK(s[i]))) i--; }
 
-Py_LOCAL(PyObject *)
+Py_LOCAL_INLINE(PyObject *)
 split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit)
 {
        Py_ssize_t i, j, count=0;
@@ -1405,7 +1405,7 @@ split_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit)
        return NULL;
 }
 
-Py_LOCAL(PyObject *)
+Py_LOCAL_INLINE(PyObject *)
 split_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
 {
        register Py_ssize_t i, j, count=0;
@@ -1578,7 +1578,7 @@ string_rpartition(PyStringObject *self, PyObject *sep_obj)
                );
 }
 
-Py_LOCAL(PyObject *)
+Py_LOCAL_INLINE(PyObject *)
 rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit)
 {
        Py_ssize_t i, j, count=0;
@@ -1614,7 +1614,7 @@ rsplit_whitespace(const char *s, Py_ssize_t len, Py_ssize_t maxsplit)
        return NULL;
 }
 
-Py_LOCAL(PyObject *)
+Py_LOCAL_INLINE(PyObject *)
 rsplit_char(const char *s, Py_ssize_t len, char ch, Py_ssize_t maxcount)
 {
        register Py_ssize_t i, j, count=0;
@@ -1828,7 +1828,7 @@ _PyString_Join(PyObject *sep, PyObject *x)
        return string_join((PyStringObject *)sep, x);
 }
 
-Py_LOCAL(void)
+Py_LOCAL_INLINE(void)
 string_adjust_indices(Py_ssize_t *start, Py_ssize_t *end, Py_ssize_t len)
 {
        if (*end > len)
@@ -1843,7 +1843,7 @@ string_adjust_indices(Py_ssize_t *start, Py_ssize_t *end, Py_ssize_t len)
                *start = 0;
 }
 
-Py_LOCAL(Py_ssize_t)
+Py_LOCAL_INLINE(Py_ssize_t)
 string_find_internal(PyStringObject *self, PyObject *args, int dir)
 {
        const char *s = PyString_AS_STRING(self), *sub;
@@ -1953,7 +1953,7 @@ string_rindex(PyStringObject *self, PyObject *args)
 }
 
 
-Py_LOCAL(PyObject *)
+Py_LOCAL_INLINE(PyObject *)
 do_xstrip(PyStringObject *self, int striptype, PyObject *sepobj)
 {
        char *s = PyString_AS_STRING(self);
@@ -1986,7 +1986,7 @@ do_xstrip(PyStringObject *self, int striptype, PyObject *sepobj)
 }
 
 
-Py_LOCAL(PyObject *)
+Py_LOCAL_INLINE(PyObject *)
 do_strip(PyStringObject *self, int striptype)
 {
        char *s = PyString_AS_STRING(self);
@@ -2016,7 +2016,7 @@ do_strip(PyStringObject *self, int striptype)
 }
 
 
-Py_LOCAL(PyObject *)
+Py_LOCAL_INLINE(PyObject *)
 do_argstrip(PyStringObject *self, int striptype, PyObject *args)
 {
        PyObject *sep = NULL;
@@ -2460,7 +2460,7 @@ return_self(PyStringObject *self)
                PyString_GET_SIZE(self));
 }
 
-Py_LOCAL(Py_ssize_t)
+Py_LOCAL_INLINE(Py_ssize_t)
 countchar(char *target, int target_len, char c, Py_ssize_t maxcount)
 {
        Py_ssize_t count=0;
@@ -2514,7 +2514,7 @@ findstring(char *target, Py_ssize_t target_len,
        return -1;
 }
 
-Py_LOCAL(Py_ssize_t)
+Py_LOCAL_INLINE(Py_ssize_t)
 countstring(char *target, Py_ssize_t target_len,
            char *pattern, Py_ssize_t pattern_len,
            Py_ssize_t start,
@@ -3335,7 +3335,7 @@ string_expandtabs(PyStringObject *self, PyObject *args)
     return u;
 }
 
-Py_LOCAL(PyObject *)
+Py_LOCAL_INLINE(PyObject *)
 pad(PyStringObject *self, Py_ssize_t left, Py_ssize_t right, char fill)
 {
     PyObject *u;
@@ -4096,7 +4096,7 @@ _PyString_Resize(PyObject **pv, Py_ssize_t newsize)
 
 /* Helpers for formatstring */
 
-Py_LOCAL(PyObject *)
+Py_LOCAL_INLINE(PyObject *)
 getnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx)
 {
        Py_ssize_t argidx = *p_argidx;
@@ -4125,7 +4125,7 @@ getnextarg(PyObject *args, Py_ssize_t arglen, Py_ssize_t *p_argidx)
 #define F_ALT  (1<<3)
 #define F_ZERO (1<<4)
 
-Py_LOCAL(int)
+Py_LOCAL_INLINE(int)
 formatfloat(char *buf, size_t buflen, int flags,
             int prec, int type, PyObject *v)
 {
@@ -4312,7 +4312,7 @@ _PyString_FormatLong(PyObject *val, int flags, int prec, int type,
        return result;
 }
 
-Py_LOCAL(int)
+Py_LOCAL_INLINE(int)
 formatint(char *buf, size_t buflen, int flags,
           int prec, int type, PyObject *v)
 {
@@ -4384,7 +4384,7 @@ formatint(char *buf, size_t buflen, int flags,
        return (int)strlen(buf);
 }
 
-Py_LOCAL(int)
+Py_LOCAL_INLINE(int)
 formatchar(char *buf, size_t buflen, PyObject *v)
 {
        /* presume that the buffer is at least 2 characters long */
index 1711b2db7355e28543d3b36d0276e23aaea7e065..3a855b6c823e978e25118c3706342e2e168fa20b 100644 (file)
@@ -141,7 +141,7 @@ static BLOOM_MASK bloom_linebreak;
 #define BLOOM_LINEBREAK(ch)\
     (BLOOM(bloom_linebreak, (ch)) && Py_UNICODE_ISLINEBREAK((ch)))
 
-Py_LOCAL(BLOOM_MASK) make_bloom_mask(Py_UNICODE* ptr, Py_ssize_t len)
+Py_LOCAL_INLINE(BLOOM_MASK) make_bloom_mask(Py_UNICODE* ptr, Py_ssize_t len)
 {
     /* calculate simple bloom-style bitmask for a given unicode string */
 
@@ -155,7 +155,7 @@ Py_LOCAL(BLOOM_MASK) make_bloom_mask(Py_UNICODE* ptr, Py_ssize_t len)
     return mask;
 }
 
-Py_LOCAL(int) unicode_member(Py_UNICODE chr, Py_UNICODE* set, Py_ssize_t setlen)
+Py_LOCAL_INLINE(int) unicode_member(Py_UNICODE chr, Py_UNICODE* set, Py_ssize_t setlen)
 {
     Py_ssize_t i;
 
@@ -2015,7 +2015,7 @@ onError:
 
 */
 
-Py_LOCAL(const Py_UNICODE *) findchar(const Py_UNICODE *s,
+Py_LOCAL_INLINE(const Py_UNICODE *) findchar(const Py_UNICODE *s,
                                       Py_ssize_t size,
                                       Py_UNICODE ch)
 {
@@ -3860,7 +3860,7 @@ int PyUnicode_EncodeDecimal(Py_UNICODE *s,
 #define STRINGLIB_NEW PyUnicode_FromUnicode
 #define STRINGLIB_STR PyUnicode_AS_UNICODE
 
-Py_LOCAL(int)
+Py_LOCAL_INLINE(int)
 STRINGLIB_CMP(const Py_UNICODE* str, const Py_UNICODE* other, Py_ssize_t len)
 {
     if (str[0] != other[0])
@@ -4710,7 +4710,7 @@ PyObject *replace(PyUnicodeObject *self,
         }
     } else {
 
-        Py_ssize_t n, i;
+        Py_ssize_t n, i, j, e;
         Py_ssize_t product, new_size, delta;
         Py_UNICODE *p;
 
@@ -4743,21 +4743,35 @@ PyObject *replace(PyUnicodeObject *self,
             return NULL;
         i = 0;
         p = u->str;
+        e = self->length - str1->length;
         if (str1->length > 0) {
-            while (i <= self->length - str1->length)
-                if (Py_UNICODE_MATCH(self, i, str1)) {
-                    /* replace string segment */
+            while (n-- > 0) {
+                /* look for next match */
+                j = i;
+                while (j <= e) {
+                    if (Py_UNICODE_MATCH(self, j, str1))
+                        break;
+                    j++;
+                }
+               if (j > i) {
+                    if (j > e)
+                        break;
+                    /* copy unchanged part [i:j] */
+                    Py_UNICODE_COPY(p, self->str+i, j-i);
+                    p += j - i;
+                }
+                /* copy substitution string */
+                if (str2->length > 0) {
                     Py_UNICODE_COPY(p, str2->str, str2->length);
                     p += str2->length;
-                    i += str1->length;
-                    if (--n <= 0) {
-                        /* copy remaining part */
-                        Py_UNICODE_COPY(p, self->str+i, self->length-i);
-                        break;
-                    }
-                } else
-                    *p++ = self->str[i++];
+                }
+                i = j + str1->length;
+            }
+            if (i < self->length)
+                /* copy tail [i:] */
+                Py_UNICODE_COPY(p, self->str+i, self->length-i);
         } else {
+            /* interleave */
             while (n > 0) {
                 Py_UNICODE_COPY(p, str2->str, str2->length);
                 p += str2->length;