LCOV - code coverage report
Current view: top level - Objects/stringlib - replace.h (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 22 22 100.0 %
Date: 2022-07-20 13:12:14 Functions: 3 3 100.0 %
Branches: 16 16 100.0 %

           Branch data     Line data    Source code
       1                 :            : /* stringlib: replace implementation */
       2                 :            : 
       3                 :            : #ifndef STRINGLIB_FASTSEARCH_H
       4                 :            : #error must include "stringlib/fastsearch.h" before including this module
       5                 :            : #endif
       6                 :            : 
       7                 :            : Py_LOCAL_INLINE(void)
       8                 :      47239 : STRINGLIB(replace_1char_inplace)(STRINGLIB_CHAR* s, STRINGLIB_CHAR* end,
       9                 :            :                                  Py_UCS4 u1, Py_UCS4 u2, Py_ssize_t maxcount)
      10                 :            : {
      11                 :      47239 :     *s = u2;
      12   [ +  +  +  + ]:     133645 :     while (--maxcount && ++s != end) {
      13                 :            :         /* Find the next character to be replaced.
      14                 :            : 
      15                 :            :            If it occurs often, it is faster to scan for it using an inline
      16                 :            :            loop.  If it occurs seldom, it is faster to scan for it using a
      17                 :            :            function call; the overhead of the function call is amortized
      18                 :            :            across the many characters that call covers.  We start with an
      19                 :            :            inline loop and use a heuristic to determine whether to fall back
      20                 :            :            to a function call. */
      21         [ +  + ]:     133151 :         if (*s != u1) {
      22                 :     121202 :             int attempts = 10;
      23                 :            :             /* search u1 in a dummy loop */
      24                 :            :             while (1) {
      25         [ +  + ]:     893222 :                 if (++s == end)
      26                 :      27651 :                     return;
      27         [ +  + ]:     865571 :                 if (*s == u1)
      28                 :      55823 :                     break;
      29         [ +  + ]:     809748 :                 if (!--attempts) {
      30                 :            :                     /* if u1 was not found for attempts iterations,
      31                 :            :                        use FASTSEARCH() or memchr() */
      32                 :            : #ifdef STRINGLIB_FAST_MEMCHR
      33                 :      37722 :                     s++;
      34                 :      37722 :                     s = STRINGLIB_FAST_MEMCHR(s, u1, end - s);
      35         [ +  + ]:      37722 :                     if (s == NULL)
      36                 :      19092 :                         return;
      37                 :            : #else
      38                 :            :                     Py_ssize_t i;
      39                 :          6 :                     STRINGLIB_CHAR ch1 = (STRINGLIB_CHAR) u1;
      40                 :          6 :                     s++;
      41                 :          6 :                     i = FASTSEARCH(s, end - s, &ch1, 1, 0, FAST_SEARCH);
      42         [ +  + ]:          6 :                     if (i < 0)
      43                 :          2 :                         return;
      44                 :          4 :                     s += i;
      45                 :            : #endif
      46                 :            :                     /* restart the dummy loop */
      47                 :      18634 :                     break;
      48                 :            :                 }
      49                 :            :             }
      50                 :            :         }
      51                 :      86406 :         *s = u2;
      52                 :            :     }
      53                 :            : }

Generated by: LCOV version 1.14