mirror of
https://github.com/python/cpython.git
synced 2025-10-01 12:52:18 +00:00
when pass indices of wrong type.
(cherry picked from commit d4edfc9abf
)
This commit is contained in:
parent
a6b4e19022
commit
bf4bb2e430
6 changed files with 31 additions and 11 deletions
|
@ -216,6 +216,7 @@ PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc);
|
|||
|
||||
#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
|
||||
|
||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.6.2 release candidate 1?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- bpo-29935: Fixed error messages in the index() method of tuple, list and deque
|
||||
when pass indices of wrong type.
|
||||
|
||||
- bpo-29859: Show correct error messages when any of the pthread_* calls in
|
||||
thread_pthread.h fails.
|
||||
|
||||
|
|
|
@ -1051,8 +1051,8 @@ deque_index(dequeobject *deque, PyObject *args)
|
|||
int cmp;
|
||||
|
||||
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);
|
||||
|
|
|
@ -2153,8 +2153,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);
|
||||
|
|
|
@ -522,8 +522,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);
|
||||
|
|
|
@ -5074,14 +5074,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.
|
||||
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);
|
||||
|
@ -5099,6 +5095,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"
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue