mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	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
					
				
					 8 changed files with 31 additions and 19 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue