Commit 3377d3e3 authored by Robert Bradshaw's avatar Robert Bradshaw

Fix tuple/list wraparound failure.

Previously, if incrementing by the length failed to make the
index positive, this *incremented* index was passed in an attempt
to raise the correct error.

This fixes #1700.
parent 26c6ecb1
...@@ -282,9 +282,12 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_{{type}}_Fast(PyObject *o, Py_ss ...@@ -282,9 +282,12 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_{{type}}_Fast(PyObject *o, Py_ss
CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int wraparound,
CYTHON_NCP_UNUSED int boundscheck) { CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
if (wraparound & unlikely(i < 0)) i += Py{{type}}_GET_SIZE(o); Py_ssize_t wrapped_i = i;
if ((!boundscheck) || likely((0 <= i) & (i < Py{{type}}_GET_SIZE(o)))) { if (wraparound & unlikely(i < 0)) {
PyObject *r = Py{{type}}_GET_ITEM(o, i); wrapped_i += Py{{type}}_GET_SIZE(o);
}
if ((!boundscheck) || likely((0 <= wrapped_i) & (wrapped_i < Py{{type}}_GET_SIZE(o)))) {
PyObject *r = Py{{type}}_GET_ITEM(o, wrapped_i);
Py_INCREF(r); Py_INCREF(r);
return r; return r;
} }
......
...@@ -29,6 +29,9 @@ def index_tuple(tuple t, int i): ...@@ -29,6 +29,9 @@ def index_tuple(tuple t, int i):
>>> index_tuple((1,1,2,3,5), 100) >>> index_tuple((1,1,2,3,5), 100)
Traceback (most recent call last): Traceback (most recent call last):
IndexError: tuple index out of range IndexError: tuple index out of range
>>> index_tuple((1,1,2,3,5), -7)
Traceback (most recent call last):
IndexError: tuple index out of range
>>> index_tuple(None, 0) >>> index_tuple(None, 0)
Traceback (most recent call last): Traceback (most recent call last):
TypeError: 'NoneType' object is not subscriptable TypeError: 'NoneType' object is not subscriptable
...@@ -46,6 +49,9 @@ def index_list(list L, int i): ...@@ -46,6 +49,9 @@ def index_list(list L, int i):
>>> index_list([2,3,5,7,11,13,17,19], 100) >>> index_list([2,3,5,7,11,13,17,19], 100)
Traceback (most recent call last): Traceback (most recent call last):
IndexError: list index out of range IndexError: list index out of range
>>> index_list([2,3,5,7,11,13,17,19], -10)
Traceback (most recent call last):
IndexError: list index out of range
>>> index_list(None, 0) >>> index_list(None, 0)
Traceback (most recent call last): Traceback (most recent call last):
TypeError: 'NoneType' object is not subscriptable TypeError: 'NoneType' object is not subscriptable
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment