mirror of https://github.com/python/cpython
bpo-29935: Fixed error messages in the index() method of tuple, list and deque (#887)
when pass indices of wrong type.
This commit is contained in:
parent
762ec97ea6
commit
d4edfc9abf
|
@ -223,7 +223,7 @@ PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc);
|
||||||
|
|
||||||
#ifndef Py_LIMITED_API
|
#ifndef Py_LIMITED_API
|
||||||
PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *);
|
PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *);
|
||||||
PyAPI_FUNC(int) _PyEval_SliceIndexOrNone(PyObject *, Py_ssize_t *);
|
PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *);
|
||||||
PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void);
|
PyAPI_FUNC(void) _PyEval_SignalAsyncExc(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.7.0 alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- bpo-29935: Fixed error messages in the index() method of tuple, list and deque
|
||||||
|
when pass indices of wrong type.
|
||||||
|
|
||||||
- bpo-29816: Shift operation now has less opportunity to raise OverflowError.
|
- bpo-29816: Shift operation now has less opportunity to raise OverflowError.
|
||||||
ValueError always is raised rather than OverflowError for negative counts.
|
ValueError always is raised rather than OverflowError for negative counts.
|
||||||
Shifting zero with non-negative count always returns zero.
|
Shifting zero with non-negative count always returns zero.
|
||||||
|
|
|
@ -1066,8 +1066,8 @@ deque_index(dequeobject *deque, PyObject **args, Py_ssize_t nargs,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index", &v,
|
if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index", &v,
|
||||||
_PyEval_SliceIndex, &start,
|
_PyEval_SliceIndexNotNone, &start,
|
||||||
_PyEval_SliceIndex, &stop)) {
|
_PyEval_SliceIndexNotNone, &stop)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -196,7 +196,7 @@ list_index(PyListObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwna
|
||||||
Py_ssize_t stop = PY_SSIZE_T_MAX;
|
Py_ssize_t stop = PY_SSIZE_T_MAX;
|
||||||
|
|
||||||
if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index",
|
if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index",
|
||||||
&value, _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &stop)) {
|
&value, _PyEval_SliceIndexNotNone, &start, _PyEval_SliceIndexNotNone, &stop)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,4 +297,4 @@ list___reversed__(PyListObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
{
|
{
|
||||||
return list___reversed___impl(self);
|
return list___reversed___impl(self);
|
||||||
}
|
}
|
||||||
/*[clinic end generated code: output=2a3b75efcf858ed5 input=a9049054013a1b77]*/
|
/*[clinic end generated code: output=71deae70ca0e6799 input=a9049054013a1b77]*/
|
||||||
|
|
|
@ -26,7 +26,7 @@ tuple_index(PyTupleObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kw
|
||||||
Py_ssize_t stop = PY_SSIZE_T_MAX;
|
Py_ssize_t stop = PY_SSIZE_T_MAX;
|
||||||
|
|
||||||
if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index",
|
if (!_PyArg_ParseStack(args, nargs, "O|O&O&:index",
|
||||||
&value, _PyEval_SliceIndex, &start, _PyEval_SliceIndex, &stop)) {
|
&value, _PyEval_SliceIndexNotNone, &start, _PyEval_SliceIndexNotNone, &stop)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,4 +99,4 @@ tuple___getnewargs__(PyTupleObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
{
|
{
|
||||||
return tuple___getnewargs___impl(self);
|
return tuple___getnewargs___impl(self);
|
||||||
}
|
}
|
||||||
/*[clinic end generated code: output=561a3654411d2225 input=a9049054013a1b77]*/
|
/*[clinic end generated code: output=145bcfff64e8c809 input=a9049054013a1b77]*/
|
||||||
|
|
|
@ -534,8 +534,8 @@ tuplerepeat(PyTupleObject *a, Py_ssize_t n)
|
||||||
tuple.index
|
tuple.index
|
||||||
|
|
||||||
value: object
|
value: object
|
||||||
start: object(converter="_PyEval_SliceIndex", type="Py_ssize_t") = 0
|
start: slice_index(accept={int}) = 0
|
||||||
stop: object(converter="_PyEval_SliceIndex", type="Py_ssize_t", c_default="PY_SSIZE_T_MAX") = sys.maxsize
|
stop: slice_index(accept={int}, c_default="PY_SSIZE_T_MAX") = sys.maxsize
|
||||||
/
|
/
|
||||||
|
|
||||||
Return first index of value.
|
Return first index of value.
|
||||||
|
@ -546,7 +546,7 @@ Raises ValueError if the value is not present.
|
||||||
static PyObject *
|
static PyObject *
|
||||||
tuple_index_impl(PyTupleObject *self, PyObject *value, Py_ssize_t start,
|
tuple_index_impl(PyTupleObject *self, PyObject *value, Py_ssize_t start,
|
||||||
Py_ssize_t stop)
|
Py_ssize_t stop)
|
||||||
/*[clinic end generated code: output=07b6f9f3cb5c33eb input=28890d4bec234471]*/
|
/*[clinic end generated code: output=07b6f9f3cb5c33eb input=fb39e9874a21fe3f]*/
|
||||||
{
|
{
|
||||||
Py_ssize_t i;
|
Py_ssize_t i;
|
||||||
|
|
||||||
|
|
|
@ -4892,14 +4892,10 @@ do_call_core(PyObject *func, PyObject *callargs, PyObject *kwdict)
|
||||||
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_MAX-1 to -PY_SSIZE_T_MAX-1.
|
||||||
Return 0 on error, 1 on success.
|
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
|
int
|
||||||
_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
|
_PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
|
||||||
{
|
{
|
||||||
if (v != NULL) {
|
if (v != Py_None) {
|
||||||
Py_ssize_t x;
|
Py_ssize_t x;
|
||||||
if (PyIndex_Check(v)) {
|
if (PyIndex_Check(v)) {
|
||||||
x = PyNumber_AsSsize_t(v, NULL);
|
x = PyNumber_AsSsize_t(v, NULL);
|
||||||
|
@ -4918,9 +4914,22 @@ _PyEval_SliceIndex(PyObject *v, Py_ssize_t *pi)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
_PyEval_SliceIndexOrNone(PyObject *v, Py_ssize_t *pi)
|
_PyEval_SliceIndexNotNone(PyObject *v, Py_ssize_t *pi)
|
||||||
{
|
{
|
||||||
return v == Py_None || _PyEval_SliceIndex(v, 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2670,9 +2670,9 @@ class slice_index_converter(CConverter):
|
||||||
|
|
||||||
def converter_init(self, *, accept={int, NoneType}):
|
def converter_init(self, *, accept={int, NoneType}):
|
||||||
if accept == {int}:
|
if accept == {int}:
|
||||||
self.converter = '_PyEval_SliceIndex'
|
self.converter = '_PyEval_SliceIndexNotNone'
|
||||||
elif accept == {int, NoneType}:
|
elif accept == {int, NoneType}:
|
||||||
self.converter = '_PyEval_SliceIndexOrNone'
|
self.converter = '_PyEval_SliceIndex'
|
||||||
else:
|
else:
|
||||||
fail("slice_index_converter: illegal 'accept' argument " + repr(accept))
|
fail("slice_index_converter: illegal 'accept' argument " + repr(accept))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue