summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/ceval.h1
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_collectionsmodule.c4
-rw-r--r--Objects/listobject.c4
-rw-r--r--Objects/tupleobject.c4
-rw-r--r--Python/ceval.c26
6 files changed, 31 insertions, 11 deletions
diff --git a/Include/ceval.h b/Include/ceval.h
index b5373a9..3f84b06 100644
--- a/Include/ceval.h
+++ b/Include/ceval.h
@@ -203,6 +203,7 @@ PyAPI_FUNC(unsigned long) _PyEval_GetSwitchInterval(void);
#ifndef Py_LIMITED_API
PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *);
+PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *);
PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void);
#endif
diff --git a/Misc/NEWS b/Misc/NEWS
index 749f3e3..e640622 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ Release date: XXXX-XX-XX
Core and Builtins
-----------------
+- bpo-29935: Fixed error messages in the index() method of tuple, list and deque
+ when pass indices of wrong type.
+
- bpo-28876: ``bool(range)`` works even if ``len(range)``
raises :exc:`OverflowError`.
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index ac81680..08fceca 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -913,8 +913,8 @@ deque_index(dequeobject *deque, PyObject *args)
size_t start_state = deque->state;
if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
- _PyEval_SliceIndex, &start,
- _PyEval_SliceIndex, &stop))
+ _PyEval_SliceIndexNotNone, &start,
+ _PyEval_SliceIndexNotNone, &stop))
return NULL;
if (start < 0) {
start += Py_SIZE(deque);
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 815a1b9..e1e3cf0 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -2154,8 +2154,8 @@ listindex(PyListObject *self, PyObject *args)
PyObject *v;
if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
- _PyEval_SliceIndex, &start,
- _PyEval_SliceIndex, &stop))
+ _PyEval_SliceIndexNotNone, &start,
+ _PyEval_SliceIndexNotNone, &stop))
return NULL;
if (start < 0) {
start += Py_SIZE(self);
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index 7920fec..4871945 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -515,8 +515,8 @@ tupleindex(PyTupleObject *self, PyObject *args)
PyObject *v;
if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
- _PyEval_SliceIndex, &start,
- _PyEval_SliceIndex, &stop))
+ _PyEval_SliceIndexNotNone, &start,
+ _PyEval_SliceIndexNotNone, &stop))
return NULL;
if (start < 0) {
start += Py_SIZE(self);
diff --git a/Python/ceval.c b/Python/ceval.c
index 9ae8653..3070a90 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -5098,14 +5098,10 @@ ext_call_fail:
and silently boost values less than -PY_SSIZE_T_MAX-1 to -PY_SSIZE_T_MAX-1.
Return 0 on error, 1 on success.
*/
-/* Note: If v is NULL, return success without storing into *pi. This
- is because_PyEval_SliceIndex() is called by apply_slice(), which can be
- called by the SLICE opcode with v and/or w equal to NULL.
-*/
int
_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
{
- if (v != NULL) {
+ if (v != Py_None) {
Py_ssize_t x;
if (PyIndex_Check(v)) {
x = PyNumber_AsSsize_t(v, NULL);
@@ -5123,6 +5119,26 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
return 1;
}
+int
+_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
+{
+ Py_ssize_t x;
+ if (PyIndex_Check(v)) {
+ x = PyNumber_AsSsize_t(v, NULL);
+ if (x == -1 && PyErr_Occurred())
+ return 0;
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "slice indices must be integers or "
+ "have an __index__ method");
+ return 0;
+ }
+ *pi = x;
+ return 1;
+}
+
+
#define CANNOT_CATCH_MSG "catching classes that do not inherit from "\
"BaseException is not allowed"