Commit d4ea03c7 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #24284: The startswith and endswith methods of the str class no longer

return True when finding the empty string and the indexes are completely out
of range.
parent 3d4a4576
......@@ -1049,6 +1049,10 @@ Changes in the Python API
program depends on patching the module level variable to capture the debug
output, you will need to update it to capture sys.stderr instead.
* The :meth:`str.startswith` and :meth:`str.endswith` methods no longer return
``True`` when finding the empty string and the indexes are completely out of
range. See :issue:`24284`.
Changes in the C API
--------------------
......
......@@ -976,6 +976,9 @@ class MixinStrUnicodeUserStringTest:
self.checkequal(True, 'helloworld', 'startswith', 'lowo', 3)
self.checkequal(True, 'helloworld', 'startswith', 'lowo', 3, 7)
self.checkequal(False, 'helloworld', 'startswith', 'lowo', 3, 6)
self.checkequal(True, '', 'startswith', '', 0, 1)
self.checkequal(True, '', 'startswith', '', 0, 0)
self.checkequal(False, '', 'startswith', '', 1, 0)
# test negative indices
self.checkequal(True, 'hello', 'startswith', 'he', 0, -1)
......@@ -1022,6 +1025,9 @@ class MixinStrUnicodeUserStringTest:
self.checkequal(False, 'helloworld', 'endswith', 'lowo', 3, 8)
self.checkequal(False, 'ab', 'endswith', 'ab', 0, 1)
self.checkequal(False, 'ab', 'endswith', 'ab', 0, 0)
self.checkequal(True, '', 'endswith', '', 0, 1)
self.checkequal(True, '', 'endswith', '', 0, 0)
self.checkequal(False, '', 'endswith', '', 1, 0)
# test negative indices
self.checkequal(True, 'hello', 'endswith', 'lo', -2)
......
......@@ -10,6 +10,10 @@ Release date: 2015-07-05
Core and Builtins
-----------------
- Issue #24284: The startswith and endswith methods of the str class no longer
return True when finding the empty string and the indexes are completely out
of range.
- Issue #24115: Update uses of PyObject_IsTrue(), PyObject_Not(),
PyObject_IsInstance(), PyObject_RichCompareBool() and _PyDict_Contains()
to check for and handle errors correctly.
......
......@@ -9280,14 +9280,14 @@ tailmatch(PyObject *self,
PyUnicode_READY(substring) == -1)
return -1;
if (PyUnicode_GET_LENGTH(substring) == 0)
return 1;
ADJUST_INDICES(start, end, PyUnicode_GET_LENGTH(self));
end -= PyUnicode_GET_LENGTH(substring);
if (end < start)
return 0;
if (PyUnicode_GET_LENGTH(substring) == 0)
return 1;
kind_self = PyUnicode_KIND(self);
data_self = PyUnicode_DATA(self);
kind_sub = PyUnicode_KIND(substring);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment