summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXiang Zhang <angwerzx@126.com>2017-05-10 10:19:41 (GMT)
committerGitHub <noreply@github.com>2017-05-10 10:19:41 (GMT)
commit2ddf5a19c3a06978edff2c8ba0aaf5df3528204a (patch)
tree8a4b6f0ae35ee772702912050fd252b9e360c482
parent305ccbe27ea5ba82fd2d8c32ec739f980e524330 (diff)
downloadcpython-2ddf5a19c3a06978edff2c8ba0aaf5df3528204a.zip
cpython-2ddf5a19c3a06978edff2c8ba0aaf5df3528204a.tar.gz
cpython-2ddf5a19c3a06978edff2c8ba0aaf5df3528204a.tar.bz2
bpo-30281: Fix the default value for stop in PySlice_Unpack() (#1480)
-rw-r--r--Doc/c-api/slice.rst2
-rw-r--r--Objects/sliceobject.c8
-rw-r--r--Python/ceval.c2
3 files changed, 7 insertions, 5 deletions
diff --git a/Doc/c-api/slice.rst b/Doc/c-api/slice.rst
index aece011..f8395ec 100644
--- a/Doc/c-api/slice.rst
+++ b/Doc/c-api/slice.rst
@@ -75,7 +75,7 @@ Slice Objects
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
``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``.
Return ``-1`` on error, ``0`` on success.
diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c
index ebc4464..4263737 100644
--- a/Objects/sliceobject.c
+++ b/Objects/sliceobject.c
@@ -197,6 +197,8 @@ PySlice_Unpack(PyObject *_r,
PySliceObject *r = (PySliceObject*)_r;
/* 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) {
*step = 1;
}
@@ -217,14 +219,14 @@ PySlice_Unpack(PyObject *_r,
}
if (r->start == Py_None) {
- *start = *step < 0 ? PY_SSIZE_T_MAX-1 : 0;;
+ *start = *step < 0 ? PY_SSIZE_T_MAX : 0;
}
else {
if (!_PyEval_SliceIndex(r->start, start)) return -1;
}
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 {
if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
@@ -258,7 +260,7 @@ PySlice_AdjustIndices(Py_ssize_t length,
*stop = (step < 0) ? -1 : 0;
}
}
- else if (*stop >= length) {
+ else if (*stop >= length) {
*stop = (step < 0) ? length - 1 : length;
}
diff --git a/Python/ceval.c b/Python/ceval.c
index afd305c..23fd088 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -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
nb_index slot defined, and store in *pi.
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.
*/
int