summaryrefslogtreecommitdiffstats
path: root/Objects/rangeobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/rangeobject.c')
-rw-r--r--Objects/rangeobject.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c
index c4ba715..899697a 100644
--- a/Objects/rangeobject.c
+++ b/Objects/rangeobject.c
@@ -5,7 +5,7 @@
/* Support objects whose length is > PY_SSIZE_T_MAX.
- This could be sped up for small PyLongs if they fit in an Py_ssize_t.
+ This could be sped up for small PyLongs if they fit in a Py_ssize_t.
This only matters on Win64. Though we could use PY_LONG_LONG which
would presumably help perf.
*/
@@ -406,7 +406,7 @@ range_contains_long(rangeobject *r, PyObject *ob)
tmp2 = PyNumber_Remainder(tmp1, r->step);
if (tmp2 == NULL)
goto end;
- /* result = (int(ob) - start % step) == 0 */
+ /* result = ((int(ob) - start) % step) == 0 */
result = PyObject_RichCompareBool(tmp2, zero, Py_EQ);
end:
Py_XDECREF(tmp1);
@@ -937,12 +937,20 @@ rangeiter_new(PyTypeObject *type, PyObject *args, PyObject *kw)
{
long start, stop, step;
- if (!_PyArg_NoKeywords("rangeiter()", kw))
+ if (!_PyArg_NoKeywords("range_iterator()", kw)) {
return NULL;
+ }
- if (!PyArg_ParseTuple(args, "lll;rangeiter() requires 3 int arguments",
- &start, &stop, &step))
+ if (!PyArg_ParseTuple(args,
+ "lll;range_iterator() requires 3 int arguments",
+ &start, &stop, &step)) {
+ return NULL;
+ }
+ if (step == 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "range_iterator() arg 3 must not be zero");
return NULL;
+ }
return fast_range_iter(start, stop, step);
}
@@ -994,15 +1002,14 @@ static PyObject *
longrangeiter_setstate(longrangeiterobject *r, PyObject *state)
{
int cmp;
-
+
/* clip the value */
PyObject *zero = PyLong_FromLong(0);
if (zero == NULL)
return NULL;
cmp = PyObject_RichCompareBool(state, zero, Py_LT);
if (cmp > 0) {
- Py_CLEAR(r->index);
- r->index = zero;
+ Py_XSETREF(r->index, zero);
Py_RETURN_NONE;
}
Py_DECREF(zero);
@@ -1014,10 +1021,9 @@ longrangeiter_setstate(longrangeiterobject *r, PyObject *state)
return NULL;
if (cmp > 0)
state = r->len;
-
- Py_CLEAR(r->index);
- r->index = state;
- Py_INCREF(r->index);
+
+ Py_INCREF(state);
+ Py_XSETREF(r->index, state);
Py_RETURN_NONE;
}
@@ -1066,8 +1072,7 @@ longrangeiter_next(longrangeiterobject *r)
result = PyNumber_Add(r->start, product);
Py_DECREF(product);
if (result) {
- Py_DECREF(r->index);
- r->index = new_index;
+ Py_SETREF(r->index, new_index);
}
else {
Py_DECREF(new_index);