bpo-30281: Fix the default value for stop in PySlice_Unpack() (#1480)
This commit is contained in:
parent
305ccbe27e
commit
2ddf5a19c3
|
@ -75,7 +75,7 @@ Slice Objects
|
||||||
Extract the start, stop and step data members from a slice object as
|
Extract the start, stop and step data members from a slice object as
|
||||||
C integers. Silently reduce values larger than ``PY_SSIZE_T_MAX`` to
|
C integers. Silently reduce values larger than ``PY_SSIZE_T_MAX`` to
|
||||||
``PY_SSIZE_T_MAX``, silently boost the start and stop values less than
|
``PY_SSIZE_T_MAX``, silently boost the start and stop values less than
|
||||||
``-PY_SSIZE_T_MAX-1`` to ``-PY_SSIZE_T_MAX-1``, and silently boost the step
|
``PY_SSIZE_T_MIN`` to ``PY_SSIZE_T_MIN``, and silently boost the step
|
||||||
values less than ``-PY_SSIZE_T_MAX`` to ``-PY_SSIZE_T_MAX``.
|
values less than ``-PY_SSIZE_T_MAX`` to ``-PY_SSIZE_T_MAX``.
|
||||||
|
|
||||||
Return ``-1`` on error, ``0`` on success.
|
Return ``-1`` on error, ``0`` on success.
|
||||||
|
|
|
@ -197,6 +197,8 @@ PySlice_Unpack(PyObject *_r,
|
||||||
PySliceObject *r = (PySliceObject*)_r;
|
PySliceObject *r = (PySliceObject*)_r;
|
||||||
/* this is harder to get right than you might think */
|
/* this is harder to get right than you might think */
|
||||||
|
|
||||||
|
Py_BUILD_ASSERT(PY_SSIZE_T_MIN + 1 <= -PY_SSIZE_T_MAX);
|
||||||
|
|
||||||
if (r->step == Py_None) {
|
if (r->step == Py_None) {
|
||||||
*step = 1;
|
*step = 1;
|
||||||
}
|
}
|
||||||
|
@ -217,14 +219,14 @@ PySlice_Unpack(PyObject *_r,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r->start == Py_None) {
|
if (r->start == Py_None) {
|
||||||
*start = *step < 0 ? PY_SSIZE_T_MAX-1 : 0;;
|
*start = *step < 0 ? PY_SSIZE_T_MAX : 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!_PyEval_SliceIndex(r->start, start)) return -1;
|
if (!_PyEval_SliceIndex(r->start, start)) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r->stop == Py_None) {
|
if (r->stop == Py_None) {
|
||||||
*stop = *step < 0 ? -PY_SSIZE_T_MAX : PY_SSIZE_T_MAX;
|
*stop = *step < 0 ? PY_SSIZE_T_MIN : PY_SSIZE_T_MAX;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
|
if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
|
||||||
|
@ -258,7 +260,7 @@ PySlice_AdjustIndices(Py_ssize_t length,
|
||||||
*stop = (step < 0) ? -1 : 0;
|
*stop = (step < 0) ? -1 : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (*stop >= length) {
|
else if (*stop >= length) {
|
||||||
*stop = (step < 0) ? length - 1 : length;
|
*stop = (step < 0) ? length - 1 : length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4889,7 +4889,7 @@ do_call_core(PyObject *func, PyObject *callargs, PyObject *kwdict)
|
||||||
/* Extract a slice index from a PyLong or an object with the
|
/* Extract a slice index from a PyLong or an object with the
|
||||||
nb_index slot defined, and store in *pi.
|
nb_index slot defined, and store in *pi.
|
||||||
Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
|
Silently reduce values larger than PY_SSIZE_T_MAX to PY_SSIZE_T_MAX,
|
||||||
and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1.
|
and silently boost values less than PY_SSIZE_T_MIN to PY_SSIZE_T_MIN.
|
||||||
Return 0 on error, 1 on success.
|
Return 0 on error, 1 on success.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in New Issue