1. mirror
  2. cpython

Commits

Victor Stinner  committed 0e95b61

Close #15534: Fix a typo in the fast search function of the string library (_s => s)

Replace _s with ptr to avoid future confusion. Add also non regression tests.

  • Participants
  • Parent commits 61a56e9
  • Branches default

Comments (0)

Files changed (3)

File Lib/test/string_tests.py

View file
         # issue 7458
         self.checkequal(-1, 'ab', 'rfind', 'xxx', sys.maxsize + 1, 0)
 
+        # issue #15534
+        self.checkequal(0, '<......\u043c...', "rfind", "<")
+
     def test_index(self):
         self.checkequal(0, 'abcdefghiabc', 'index', '')
         self.checkequal(3, 'abcdefghiabc', 'index', 'def')
         EQ("ReyKKjavik", "Reykjavik", "replace", "k", "KK", 1)
         EQ("Reykjavik", "Reykjavik", "replace", "k", "KK", 0)
         EQ("A----B----C----", "A.B.C.", "replace", ".", "----")
+        # issue #15534
+        EQ('...\u043c......&lt;', '...\u043c......<', "replace", "<", "&lt;")
 
         EQ("Reykjavik", "Reykjavik", "replace", "q", "KK")
 
         self.assertRaisesRegex(TypeError, r'^endswith\(', s.endswith,
                                 x, None, None, None)
 
+        # issue #15534
+        self.checkequal(10, "...\u043c......<", "find", "<")
+
 
 class MixinStrUnicodeTest:
     # Additional tests that only work with str and unicode.

File Misc/NEWS

View file
 Core and Builtins
 -----------------
 
+- Issue #15534: Fix the fast-search function for non-ASCII Unicode strings.
+
 - Issue #15508: Fix the docstring for __import__ to have the proper default
   value of 0 for 'level' and to not mention negative levels since they are
   not supported.
 
 - Issue #15499: Launching a webbrowser in Unix used to sleep for a few
   seconds.  Original patch by Anton Barkovsky.
-  
+
 - Issue #15463: the faulthandler module truncates strings to 500 characters,
   instead of 100, to be able to display long file paths
 

File Objects/stringlib/fastsearch.h

View file
     } while (0)
 
     if (mode == FAST_SEARCH) {
-        const STRINGLIB_CHAR *_s = s;
+        const STRINGLIB_CHAR *ptr = s;
         const STRINGLIB_CHAR *e = s + n;
-        while (_s < e) {
-            DO_MEMCHR(memchr, _s, needle, e - _s);
+        while (ptr < e) {
+            DO_MEMCHR(memchr, ptr, needle, e - ptr);
             if (found == NULL)
                 return -1;
             if (sizeof(STRINGLIB_CHAR) == 1 || *found == ch)
-                return (found - _s);
+                return (found - s);
             /* False positive */
-            _s = found + 1;
+            ptr = found + 1;
         }
         return -1;
     }