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.
This commit is contained in:
Victor Stinner 2012-08-02 23:05:01 +02:00
parent 77821b68a7
commit b3f5501250
3 changed files with 16 additions and 6 deletions

View file

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

View file

@ -10,6 +10,8 @@ What's New in Python 3.3.0 Beta 2?
Core and Builtins 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 - 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 value of 0 for 'level' and to not mention negative levels since they are
not supported. not supported.
@ -83,7 +85,7 @@ Library
- Issue #15499: Launching a webbrowser in Unix used to sleep for a few - Issue #15499: Launching a webbrowser in Unix used to sleep for a few
seconds. Original patch by Anton Barkovsky. seconds. Original patch by Anton Barkovsky.
- Issue #15463: the faulthandler module truncates strings to 500 characters, - Issue #15463: the faulthandler module truncates strings to 500 characters,
instead of 100, to be able to display long file paths instead of 100, to be able to display long file paths

View file

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