Mercurial > cpython-lru_cache-weakref
diff Objects/stringobject.c @ 12615:67233df13037 legacy-trunk
Trent Mick:
Fix the string methods that implement slice-like semantics with
optional args (count, find, endswith, etc.) to properly handle
indeces outside [INT_MIN, INT_MAX]. Previously the "i" formatter
for PyArg_ParseTuple was used to get the indices. These could overflow.
This patch changes the string methods to use the "O&" formatter with
the slice_index() function from ceval.c which is used to do the same
job for Python code slices (e.g. 'abcabcabc'[0:1000000000L]). slice_index()
is renamed _PyEval_SliceIndex() and is now exported. As well, the return
values for success/fail were changed to make slice_index directly
usable as required by the "O&" formatter.
[GvR: shouldn't a similar patch be applied to unicodeobject.c?]
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Mon, 08 May 2000 14:08:05 +0000 |
| parents | 54274beb244d |
| children | 4272b368bf69 |
line wrap: on
line diff
--- a/Objects/stringobject.c Mon May 08 14:06:50 2000 +0000 +++ b/Objects/stringobject.c Mon May 08 14:08:05 2000 +0000 @@ -822,8 +822,8 @@ int n, i = 0, last = INT_MAX; PyObject *subobj; - if (!PyArg_ParseTuple(args, "O|ii:find/rfind/index/rindex", - &subobj, &i, &last)) + if (!PyArg_ParseTuple(args, "O|O&O&:find/rfind/index/rindex", + &subobj, _PyEval_SliceIndex, &i, _PyEval_SliceIndex, &last)) return -2; if (PyString_Check(subobj)) { sub = PyString_AS_STRING(subobj); @@ -1194,8 +1194,10 @@ int m, r; PyObject *subobj; - if (!PyArg_ParseTuple(args, "O|ii:count", &subobj, &i, &last)) + if (!PyArg_ParseTuple(args, "O|O&O&:count", &subobj, + _PyEval_SliceIndex, &i, _PyEval_SliceIndex, &last)) return NULL; + if (PyString_Check(subobj)) { sub = PyString_AS_STRING(subobj); n = PyString_GET_SIZE(subobj); @@ -1617,7 +1619,8 @@ int end = -1; PyObject *subobj; - if (!PyArg_ParseTuple(args, "O|ii:startswith", &subobj, &start, &end)) + if (!PyArg_ParseTuple(args, "O|O&O&:startswith", &subobj, + _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; if (PyString_Check(subobj)) { prefix = PyString_AS_STRING(subobj); @@ -1671,7 +1674,8 @@ int lower, upper; PyObject *subobj; - if (!PyArg_ParseTuple(args, "O|ii:endswith", &subobj, &start, &end)) + if (!PyArg_ParseTuple(args, "O|O&O&:endswith", &subobj, + _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end)) return NULL; if (PyString_Check(subobj)) { suffix = PyString_AS_STRING(subobj);
