blob: 3ac829a6d23bac6897837581b0d6ac1f93213bd6 [file] [log] [blame]
Guido van Rossum12d12c51993-10-26 17:58:25 +00001/* Range object implementation */
2
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003#include "Python.h"
Thomas Woutersefafcea2001-07-09 12:30:54 +00004
Guido van Rossum805365e2007-05-07 22:24:25 +00005/* Support objects whose length is > PY_SSIZE_T_MAX.
6
7 This could be sped up for small PyLongs if they fit in an Py_ssize_t.
8 This only matters on Win64. Though we could use PY_LONG_LONG which
9 would presumably help perf.
10*/
11
Guido van Rossum12d12c51993-10-26 17:58:25 +000012typedef struct {
Guido van Rossum805365e2007-05-07 22:24:25 +000013 PyObject_HEAD
14 PyObject *start;
15 PyObject *stop;
16 PyObject *step;
Nick Coghlan37ee8502010-12-03 14:26:13 +000017 PyObject *length;
Guido van Rossum12d12c51993-10-26 17:58:25 +000018} rangeobject;
19
Guido van Rossum805365e2007-05-07 22:24:25 +000020/* Helper function for validating step. Always returns a new reference or
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000021 NULL on error.
Guido van Rossum805365e2007-05-07 22:24:25 +000022*/
23static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +000024validate_step(PyObject *step)
25{
Guido van Rossum805365e2007-05-07 22:24:25 +000026 /* No step specified, use a step of 1. */
27 if (!step)
Christian Heimes217cfd12007-12-02 14:31:20 +000028 return PyLong_FromLong(1);
Guido van Rossum805365e2007-05-07 22:24:25 +000029
30 step = PyNumber_Index(step);
31 if (step) {
32 Py_ssize_t istep = PyNumber_AsSsize_t(step, NULL);
33 if (istep == -1 && PyErr_Occurred()) {
34 /* Ignore OverflowError, we know the value isn't 0. */
35 PyErr_Clear();
36 }
37 else if (istep == 0) {
38 PyErr_SetString(PyExc_ValueError,
39 "range() arg 3 must not be zero");
40 Py_CLEAR(step);
41 }
42 }
43
44 return step;
Raymond Hettingerc4c453f2002-06-05 23:12:45 +000045}
46
Nick Coghlan37ee8502010-12-03 14:26:13 +000047static PyObject *
48compute_range_length(PyObject *start, PyObject *stop, PyObject *step);
49
50static rangeobject *
51make_range_object(PyTypeObject *type, PyObject *start,
52 PyObject *stop, PyObject *step)
53{
54 rangeobject *obj = NULL;
55 PyObject *length;
56 length = compute_range_length(start, stop, step);
57 if (length == NULL) {
58 return NULL;
59 }
60 obj = PyObject_New(rangeobject, type);
61 if (obj == NULL) {
62 Py_DECREF(length);
63 return NULL;
64 }
65 obj->start = start;
66 obj->stop = stop;
67 obj->step = step;
68 obj->length = length;
69 return obj;
70}
71
Guido van Rossum805365e2007-05-07 22:24:25 +000072/* XXX(nnorwitz): should we error check if the user passes any empty ranges?
73 range(-10)
74 range(0, -5)
75 range(0, 5, -1)
76*/
Raymond Hettingerc4c453f2002-06-05 23:12:45 +000077static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +000078range_new(PyTypeObject *type, PyObject *args, PyObject *kw)
79{
Nick Coghlan37ee8502010-12-03 14:26:13 +000080 rangeobject *obj;
Guido van Rossum805365e2007-05-07 22:24:25 +000081 PyObject *start = NULL, *stop = NULL, *step = NULL;
Raymond Hettingerc4c453f2002-06-05 23:12:45 +000082
Guido van Rossum805365e2007-05-07 22:24:25 +000083 if (!_PyArg_NoKeywords("range()", kw))
84 return NULL;
Georg Brandl02c42872005-08-26 06:42:30 +000085
Guido van Rossum805365e2007-05-07 22:24:25 +000086 if (PyTuple_Size(args) <= 1) {
87 if (!PyArg_UnpackTuple(args, "range", 1, 1, &stop))
Raymond Hettinger94f55832009-06-12 18:40:16 +000088 return NULL;
Guido van Rossum805365e2007-05-07 22:24:25 +000089 stop = PyNumber_Index(stop);
90 if (!stop)
Raymond Hettinger94f55832009-06-12 18:40:16 +000091 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +000092 start = PyLong_FromLong(0);
Raymond Hettinger94f55832009-06-12 18:40:16 +000093 if (!start) {
94 Py_DECREF(stop);
95 return NULL;
96 }
Christian Heimes217cfd12007-12-02 14:31:20 +000097 step = PyLong_FromLong(1);
Raymond Hettinger94f55832009-06-12 18:40:16 +000098 if (!step) {
99 Py_DECREF(stop);
100 Py_DECREF(start);
101 return NULL;
102 }
Guido van Rossum805365e2007-05-07 22:24:25 +0000103 }
104 else {
105 if (!PyArg_UnpackTuple(args, "range", 2, 3,
106 &start, &stop, &step))
Raymond Hettinger94f55832009-06-12 18:40:16 +0000107 return NULL;
Tim Petersfeec4532004-08-08 07:17:39 +0000108
Guido van Rossum805365e2007-05-07 22:24:25 +0000109 /* Convert borrowed refs to owned refs */
110 start = PyNumber_Index(start);
Raymond Hettinger94f55832009-06-12 18:40:16 +0000111 if (!start)
112 return NULL;
Guido van Rossum805365e2007-05-07 22:24:25 +0000113 stop = PyNumber_Index(stop);
Raymond Hettinger94f55832009-06-12 18:40:16 +0000114 if (!stop) {
115 Py_DECREF(start);
116 return NULL;
117 }
118 step = validate_step(step); /* Caution, this can clear exceptions */
119 if (!step) {
120 Py_DECREF(start);
121 Py_DECREF(stop);
122 return NULL;
123 }
Guido van Rossum805365e2007-05-07 22:24:25 +0000124 }
125
Nick Coghlan37ee8502010-12-03 14:26:13 +0000126 obj = make_range_object(type, start, stop, step);
127 if (obj != NULL)
128 return (PyObject *) obj;
Guido van Rossum805365e2007-05-07 22:24:25 +0000129
Nick Coghlan37ee8502010-12-03 14:26:13 +0000130 /* Failed to create object, release attributes */
Guido van Rossum805365e2007-05-07 22:24:25 +0000131 Py_XDECREF(start);
132 Py_XDECREF(stop);
133 Py_XDECREF(step);
134 return NULL;
Raymond Hettingerc4c453f2002-06-05 23:12:45 +0000135}
136
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000137PyDoc_STRVAR(range_doc,
Guido van Rossum805365e2007-05-07 22:24:25 +0000138"range([start,] stop[, step]) -> range object\n\
Raymond Hettingerc4c453f2002-06-05 23:12:45 +0000139\n\
Nick Coghlan37ee8502010-12-03 14:26:13 +0000140Returns a virtual sequence of numbers from start to stop by step.");
Raymond Hettingerc4c453f2002-06-05 23:12:45 +0000141
Guido van Rossum805365e2007-05-07 22:24:25 +0000142static void
Benjamin Petersona1864f32010-11-20 23:05:39 +0000143range_dealloc(rangeobject *r)
144{
Guido van Rossum805365e2007-05-07 22:24:25 +0000145 Py_DECREF(r->start);
146 Py_DECREF(r->stop);
147 Py_DECREF(r->step);
Nick Coghlan37ee8502010-12-03 14:26:13 +0000148 Py_DECREF(r->length);
Amaury Forgeot d'Arcb7f17e42007-11-15 20:52:21 +0000149 PyObject_Del(r);
Guido van Rossum805365e2007-05-07 22:24:25 +0000150}
151
Mark Dickinson732166d2009-06-28 22:08:40 +0000152/* Return number of items in range (lo, hi, step) as a PyLong object,
153 * when arguments are PyLong objects. Arguments MUST return 1 with
154 * PyLong_Check(). Return NULL when there is an error.
Guido van Rossum805365e2007-05-07 22:24:25 +0000155 */
156static PyObject*
Nick Coghlan37ee8502010-12-03 14:26:13 +0000157compute_range_length(PyObject *start, PyObject *stop, PyObject *step)
Benjamin Petersona1864f32010-11-20 23:05:39 +0000158{
Guido van Rossum805365e2007-05-07 22:24:25 +0000159 /* -------------------------------------------------------------
160 Algorithm is equal to that of get_len_of_range(), but it operates
Benjamin Petersona47af9c2009-06-24 21:14:38 +0000161 on PyObjects (which are assumed to be PyLong objects).
Guido van Rossum805365e2007-05-07 22:24:25 +0000162 ---------------------------------------------------------------*/
Mark Dickinson211c6252009-02-01 10:28:51 +0000163 int cmp_result;
Guido van Rossum805365e2007-05-07 22:24:25 +0000164 PyObject *lo, *hi;
Guido van Rossum805365e2007-05-07 22:24:25 +0000165 PyObject *diff = NULL;
166 PyObject *one = NULL;
167 PyObject *tmp1 = NULL, *tmp2 = NULL, *result;
168 /* holds sub-expression evaluations */
169
170 PyObject *zero = PyLong_FromLong(0);
171 if (zero == NULL)
172 return NULL;
Nick Coghlan37ee8502010-12-03 14:26:13 +0000173 cmp_result = PyObject_RichCompareBool(step, zero, Py_GT);
Guido van Rossum805365e2007-05-07 22:24:25 +0000174 Py_DECREF(zero);
Mark Dickinson211c6252009-02-01 10:28:51 +0000175 if (cmp_result == -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000176 return NULL;
177
Mark Dickinson211c6252009-02-01 10:28:51 +0000178 if (cmp_result == 1) {
Nick Coghlan37ee8502010-12-03 14:26:13 +0000179 lo = start;
180 hi = stop;
Guido van Rossum805365e2007-05-07 22:24:25 +0000181 Py_INCREF(step);
182 } else {
Nick Coghlan37ee8502010-12-03 14:26:13 +0000183 lo = stop;
184 hi = start;
185 step = PyNumber_Negative(step);
Guido van Rossum805365e2007-05-07 22:24:25 +0000186 if (!step)
187 return NULL;
188 }
189
190 /* if (lo >= hi), return length of 0. */
Mark Dickinson211c6252009-02-01 10:28:51 +0000191 if (PyObject_RichCompareBool(lo, hi, Py_GE) == 1) {
Guido van Rossum805365e2007-05-07 22:24:25 +0000192 Py_XDECREF(step);
193 return PyLong_FromLong(0);
194 }
195
196 if ((one = PyLong_FromLong(1L)) == NULL)
197 goto Fail;
198
199 if ((tmp1 = PyNumber_Subtract(hi, lo)) == NULL)
200 goto Fail;
201
202 if ((diff = PyNumber_Subtract(tmp1, one)) == NULL)
203 goto Fail;
204
205 if ((tmp2 = PyNumber_FloorDivide(diff, step)) == NULL)
206 goto Fail;
207
208 if ((result = PyNumber_Add(tmp2, one)) == NULL)
209 goto Fail;
210
211 Py_DECREF(tmp2);
212 Py_DECREF(diff);
213 Py_DECREF(step);
214 Py_DECREF(tmp1);
215 Py_DECREF(one);
216 return result;
217
218 Fail:
219 Py_XDECREF(tmp2);
220 Py_XDECREF(diff);
221 Py_XDECREF(step);
222 Py_XDECREF(tmp1);
223 Py_XDECREF(one);
224 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000225}
226
Martin v. Löwis18e16552006-02-15 17:27:45 +0000227static Py_ssize_t
Benjamin Petersona1864f32010-11-20 23:05:39 +0000228range_length(rangeobject *r)
229{
Nick Coghlan37ee8502010-12-03 14:26:13 +0000230 return PyLong_AsSsize_t(r->length);
Guido van Rossum805365e2007-05-07 22:24:25 +0000231}
232
233/* range(...)[x] is necessary for: seq[:] = range(...) */
Guido van Rossum805365e2007-05-07 22:24:25 +0000234static PyObject *
Nick Coghlan37ee8502010-12-03 14:26:13 +0000235compute_range_item(rangeobject *r, Py_ssize_t i)
Benjamin Petersona1864f32010-11-20 23:05:39 +0000236{
Guido van Rossum805365e2007-05-07 22:24:25 +0000237 PyObject *rem, *incr, *result;
238
Guido van Rossum805365e2007-05-07 22:24:25 +0000239 /* XXX(nnorwitz): optimize for short ints. */
Raymond Hettingerad3f3322008-02-09 04:13:49 +0000240 rem = PyLong_FromSsize_t(i);
Guido van Rossum805365e2007-05-07 22:24:25 +0000241 if (!rem)
242 return NULL;
243 incr = PyNumber_Multiply(rem, r->step);
244 Py_DECREF(rem);
245 if (!incr)
246 return NULL;
247 result = PyNumber_Add(r->start, incr);
248 Py_DECREF(incr);
249 return result;
Guido van Rossum7d6aa511993-12-21 22:50:31 +0000250}
251
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000252static PyObject *
Nick Coghlan37ee8502010-12-03 14:26:13 +0000253range_item(rangeobject *r, Py_ssize_t i)
Benjamin Petersona1864f32010-11-20 23:05:39 +0000254{
Nick Coghlan37ee8502010-12-03 14:26:13 +0000255 /* XXX(nnorwitz): should we support range[x] where x > PY_SSIZE_T_MAX? */
256 Py_ssize_t len = range_length(r);
Tim Petersd976ab72004-08-08 06:29:10 +0000257
Nick Coghlan37ee8502010-12-03 14:26:13 +0000258 if (i < 0)
259 i += len;
260
261 if (i < 0 || i >= len) {
262 /* Also handles case where len < 0 due to (e.g) OverflowError */
263 if (!PyErr_Occurred())
264 PyErr_SetString(PyExc_IndexError,
265 "range object index out of range");
266 return NULL;
Guido van Rossum805365e2007-05-07 22:24:25 +0000267 }
Nick Coghlan37ee8502010-12-03 14:26:13 +0000268 return compute_range_item(r, i);
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000269}
270
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000271/* Assumes (PyLong_CheckExact(ob) || PyBool_Check(ob)) */
272static int
Benjamin Petersona1864f32010-11-20 23:05:39 +0000273range_contains_long(rangeobject *r, PyObject *ob)
274{
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000275 int cmp1, cmp2, cmp3;
276 PyObject *tmp1 = NULL;
277 PyObject *tmp2 = NULL;
278 PyObject *zero = NULL;
279 int result = -1;
280
281 zero = PyLong_FromLong(0);
282 if (zero == NULL) /* MemoryError in int(0) */
283 goto end;
284
285 /* Check if the value can possibly be in the range. */
286
287 cmp1 = PyObject_RichCompareBool(r->step, zero, Py_GT);
288 if (cmp1 == -1)
289 goto end;
290 if (cmp1 == 1) { /* positive steps: start <= ob < stop */
291 cmp2 = PyObject_RichCompareBool(r->start, ob, Py_LE);
292 cmp3 = PyObject_RichCompareBool(ob, r->stop, Py_LT);
293 }
294 else { /* negative steps: stop < ob <= start */
295 cmp2 = PyObject_RichCompareBool(ob, r->start, Py_LE);
296 cmp3 = PyObject_RichCompareBool(r->stop, ob, Py_LT);
297 }
298
299 if (cmp2 == -1 || cmp3 == -1) /* TypeError */
300 goto end;
301 if (cmp2 == 0 || cmp3 == 0) { /* ob outside of range */
302 result = 0;
303 goto end;
304 }
305
306 /* Check that the stride does not invalidate ob's membership. */
307 tmp1 = PyNumber_Subtract(ob, r->start);
308 if (tmp1 == NULL)
309 goto end;
310 tmp2 = PyNumber_Remainder(tmp1, r->step);
311 if (tmp2 == NULL)
312 goto end;
313 /* result = (int(ob) - start % step) == 0 */
314 result = PyObject_RichCompareBool(tmp2, zero, Py_EQ);
315 end:
316 Py_XDECREF(tmp1);
317 Py_XDECREF(tmp2);
318 Py_XDECREF(zero);
319 return result;
320}
321
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000322static int
Benjamin Petersona1864f32010-11-20 23:05:39 +0000323range_contains(rangeobject *r, PyObject *ob)
324{
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000325 if (PyLong_CheckExact(ob) || PyBool_Check(ob))
326 return range_contains_long(r, ob);
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000327
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000328 return (int)_PySequence_IterSearch((PyObject*)r, ob,
329 PY_ITERSEARCH_CONTAINS);
330}
331
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000332static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000333range_count(rangeobject *r, PyObject *ob)
334{
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000335 if (PyLong_CheckExact(ob) || PyBool_Check(ob)) {
Georg Brandl7e5343b2010-11-20 22:40:10 +0000336 int result = range_contains_long(r, ob);
337 if (result == -1)
338 return NULL;
339 else if (result)
Benjamin Peterson0b458d52010-11-20 22:35:41 +0000340 return PyLong_FromLong(1);
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000341 else
Benjamin Peterson0b458d52010-11-20 22:35:41 +0000342 return PyLong_FromLong(0);
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000343 } else {
344 Py_ssize_t count;
345 count = _PySequence_IterSearch((PyObject*)r, ob, PY_ITERSEARCH_COUNT);
346 if (count == -1)
347 return NULL;
348 return PyLong_FromSsize_t(count);
349 }
350}
351
352static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000353range_index(rangeobject *r, PyObject *ob)
354{
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000355 int contains;
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000356
357 if (!PyLong_CheckExact(ob) && !PyBool_Check(ob)) {
358 Py_ssize_t index;
359 index = _PySequence_IterSearch((PyObject*)r, ob, PY_ITERSEARCH_INDEX);
360 if (index == -1)
361 return NULL;
362 return PyLong_FromSsize_t(index);
363 }
364
365 contains = range_contains_long(r, ob);
366 if (contains == -1)
367 return NULL;
368
Benjamin Peterson155614b2010-11-20 22:44:32 +0000369 if (contains) {
370 PyObject *idx, *tmp = PyNumber_Subtract(ob, r->start);
371 if (tmp == NULL)
372 return NULL;
373 /* idx = (ob - r.start) // r.step */
374 idx = PyNumber_FloorDivide(tmp, r->step);
375 Py_DECREF(tmp);
376 return idx;
377 }
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000378
379 /* object is not in the range */
Benjamin Peterson155614b2010-11-20 22:44:32 +0000380 PyErr_Format(PyExc_ValueError, "%R is not in range", ob);
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000381 return NULL;
382}
383
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384static PySequenceMethods range_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 (lenfunc)range_length, /* sq_length */
Nick Coghlan37ee8502010-12-03 14:26:13 +0000386 0, /* sq_concat */
387 0, /* sq_repeat */
388 (ssizeargfunc)range_item, /* sq_item */
389 0, /* sq_slice */
390 0, /* sq_ass_item */
391 0, /* sq_ass_slice */
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000392 (objobjproc)range_contains, /* sq_contains */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000393};
394
Nick Coghlan37ee8502010-12-03 14:26:13 +0000395static PyObject *
396range_repr(rangeobject *r)
397{
398 Py_ssize_t istep;
399
400 /* Check for special case values for printing. We don't always
401 need the step value. We don't care about errors
402 (it means overflow), so clear the errors. */
403 istep = PyNumber_AsSsize_t(r->step, NULL);
404 if (istep != 1 || (istep == -1 && PyErr_Occurred())) {
405 PyErr_Clear();
406 }
407
408 if (istep == 1)
409 return PyUnicode_FromFormat("range(%R, %R)", r->start, r->stop);
410 else
411 return PyUnicode_FromFormat("range(%R, %R, %R)",
412 r->start, r->stop, r->step);
413}
414
415/* Pickling support */
416static PyObject *
417range_reduce(rangeobject *r, PyObject *args)
418{
419 return Py_BuildValue("(O(OOO))", Py_TYPE(r),
420 r->start, r->stop, r->step);
421}
422
423static PyObject *
424range_subscript(rangeobject* self, PyObject* item)
425{
426 if (PyIndex_Check(item)) {
427 Py_ssize_t i;
428 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
429 if (i == -1 && PyErr_Occurred())
430 return NULL;
431 return range_item(self, i);
432 }
433 if (PySlice_Check(item)) {
Nick Coghlan37ee8502010-12-03 14:26:13 +0000434 Py_ssize_t start, stop, step, len, rlen;
435 rangeobject *result;
436 PyObject *substart = NULL, *substep = NULL, *substop = NULL;
437
438 rlen = range_length(self);
439 if (rlen < 0) {
440 return NULL;
441 }
442
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000443 if (PySlice_GetIndicesEx(item, rlen,
Nick Coghlan37ee8502010-12-03 14:26:13 +0000444 &start, &stop, &step, &len) < 0) {
445 return NULL;
446 }
447 if (step == 1) {
448 substep = self->step;
449 Py_INCREF(substep);
450 } else {
451 /* NB: slice step != Py_None here */
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000452 substep = PyNumber_Multiply(self->step, ((PySliceObject*)item)->step);
Nick Coghlan37ee8502010-12-03 14:26:13 +0000453 if (substep == NULL)
454 goto fail;
455 }
456 substart = compute_range_item(self, start);
457 if (substart == NULL)
458 goto fail;
459 if (len <= 0) {
460 substop = substart;
461 Py_INCREF(substop);
462 }
463 else {
464 substop = compute_range_item(self, stop);
465 if (substop == NULL)
466 goto fail;
467 }
468 result = make_range_object(Py_TYPE(self), substart, substop, substep);
469 if (result != NULL)
470 return (PyObject *) result;
471 fail:
472 Py_XDECREF(substart);
473 Py_XDECREF(substep);
474 Py_XDECREF(substop);
475 return NULL;
476 }
477 PyErr_Format(PyExc_TypeError,
478 "range indices must be integers or slices, not %.200s",
479 item->ob_type->tp_name);
480 return NULL;
481}
482
483
484static PyMappingMethods range_as_mapping = {
485 (lenfunc)range_length, /* mp_length */
486 (binaryfunc)range_subscript, /* mp_subscript */
487 (objobjargproc)0, /* mp_ass_subscript */
488};
489
Jeremy Hylton938ace62002-07-17 16:30:39 +0000490static PyObject * range_iter(PyObject *seq);
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000491static PyObject * range_reverse(PyObject *seq);
492
493PyDoc_STRVAR(reverse_doc,
494"Returns a reverse iterator.");
495
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000496PyDoc_STRVAR(count_doc,
497"rangeobject.count(value) -> integer -- return number of occurrences of value");
498
499PyDoc_STRVAR(index_doc,
500"rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n"
501"Raises ValueError if the value is not present.");
502
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000503static PyMethodDef range_methods[] = {
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000504 {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc},
505 {"__reduce__", (PyCFunction)range_reduce, METH_VARARGS},
506 {"count", (PyCFunction)range_count, METH_O, count_doc},
507 {"index", (PyCFunction)range_index, METH_O, index_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 {NULL, NULL} /* sentinel */
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000509};
Raymond Hettinger48165d42002-06-05 20:08:48 +0000510
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511PyTypeObject PyRange_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 PyVarObject_HEAD_INIT(&PyType_Type, 0)
513 "range", /* Name of this type */
514 sizeof(rangeobject), /* Basic object size */
515 0, /* Item size for varobject */
516 (destructor)range_dealloc, /* tp_dealloc */
517 0, /* tp_print */
518 0, /* tp_getattr */
519 0, /* tp_setattr */
520 0, /* tp_reserved */
521 (reprfunc)range_repr, /* tp_repr */
522 0, /* tp_as_number */
523 &range_as_sequence, /* tp_as_sequence */
Nick Coghlan37ee8502010-12-03 14:26:13 +0000524 &range_as_mapping, /* tp_as_mapping */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 0, /* tp_hash */
526 0, /* tp_call */
527 0, /* tp_str */
528 PyObject_GenericGetAttr, /* tp_getattro */
529 0, /* tp_setattro */
530 0, /* tp_as_buffer */
531 Py_TPFLAGS_DEFAULT, /* tp_flags */
532 range_doc, /* tp_doc */
533 0, /* tp_traverse */
534 0, /* tp_clear */
535 0, /* tp_richcompare */
536 0, /* tp_weaklistoffset */
537 range_iter, /* tp_iter */
538 0, /* tp_iternext */
539 range_methods, /* tp_methods */
540 0, /* tp_members */
541 0, /* tp_getset */
542 0, /* tp_base */
543 0, /* tp_dict */
544 0, /* tp_descr_get */
545 0, /* tp_descr_set */
546 0, /* tp_dictoffset */
547 0, /* tp_init */
548 0, /* tp_alloc */
549 range_new, /* tp_new */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000550};
Raymond Hettinger48165d42002-06-05 20:08:48 +0000551
Walter Dörwald4ad94212007-05-21 18:01:17 +0000552/*********************** range Iterator **************************/
Raymond Hettinger48165d42002-06-05 20:08:48 +0000553
Guido van Rossum805365e2007-05-07 22:24:25 +0000554/* There are 2 types of iterators, one for C longs, the other for
555 Python longs (ie, PyObjects). This should make iteration fast
556 in the normal case, but possible for any numeric value.
557*/
558
Raymond Hettinger48165d42002-06-05 20:08:48 +0000559typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 PyObject_HEAD
561 long index;
562 long start;
563 long step;
564 long len;
Raymond Hettinger48165d42002-06-05 20:08:48 +0000565} rangeiterobject;
566
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000567static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000568rangeiter_next(rangeiterobject *r)
569{
Guido van Rossum805365e2007-05-07 22:24:25 +0000570 if (r->index < r->len)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 /* cast to unsigned to avoid possible signed overflow
Mark Dickinsonb43dbc22009-11-15 12:56:08 +0000572 in intermediate calculations. */
573 return PyLong_FromLong((long)(r->start +
574 (unsigned long)(r->index++) * r->step));
Guido van Rossum805365e2007-05-07 22:24:25 +0000575 return NULL;
Raymond Hettinger48165d42002-06-05 20:08:48 +0000576}
577
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000578static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000579rangeiter_len(rangeiterobject *r)
580{
Christian Heimes217cfd12007-12-02 14:31:20 +0000581 return PyLong_FromLong(r->len - r->index);
Raymond Hettingeref9bf402004-03-10 10:10:42 +0000582}
583
Guido van Rossum805365e2007-05-07 22:24:25 +0000584PyDoc_STRVAR(length_hint_doc,
585 "Private method returning an estimate of len(list(it)).");
Raymond Hettingeref9bf402004-03-10 10:10:42 +0000586
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000587static PyMethodDef rangeiter_methods[] = {
Guido van Rossum805365e2007-05-07 22:24:25 +0000588 {"__length_hint__", (PyCFunction)rangeiter_len, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 length_hint_doc},
590 {NULL, NULL} /* sentinel */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000591};
Raymond Hettingeref9bf402004-03-10 10:10:42 +0000592
Nick Coghlan37ee8502010-12-03 14:26:13 +0000593static PyObject *rangeiter_new(PyTypeObject *, PyObject *args, PyObject *kw);
594
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000595PyTypeObject PyRangeIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 PyVarObject_HEAD_INIT(&PyType_Type, 0)
597 "range_iterator", /* tp_name */
598 sizeof(rangeiterobject), /* tp_basicsize */
599 0, /* tp_itemsize */
600 /* methods */
601 (destructor)PyObject_Del, /* tp_dealloc */
602 0, /* tp_print */
603 0, /* tp_getattr */
604 0, /* tp_setattr */
605 0, /* tp_reserved */
606 0, /* tp_repr */
607 0, /* tp_as_number */
608 0, /* tp_as_sequence */
609 0, /* tp_as_mapping */
610 0, /* tp_hash */
611 0, /* tp_call */
612 0, /* tp_str */
613 PyObject_GenericGetAttr, /* tp_getattro */
614 0, /* tp_setattro */
615 0, /* tp_as_buffer */
616 Py_TPFLAGS_DEFAULT, /* tp_flags */
617 0, /* tp_doc */
618 0, /* tp_traverse */
619 0, /* tp_clear */
620 0, /* tp_richcompare */
621 0, /* tp_weaklistoffset */
622 PyObject_SelfIter, /* tp_iter */
623 (iternextfunc)rangeiter_next, /* tp_iternext */
624 rangeiter_methods, /* tp_methods */
625 0, /* tp_members */
626 0, /* tp_getset */
627 0, /* tp_base */
628 0, /* tp_dict */
629 0, /* tp_descr_get */
630 0, /* tp_descr_set */
631 0, /* tp_dictoffset */
632 0, /* tp_init */
633 0, /* tp_alloc */
634 rangeiter_new, /* tp_new */
Guido van Rossum805365e2007-05-07 22:24:25 +0000635};
636
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000637/* Return number of items in range (lo, hi, step). step != 0
638 * required. The result always fits in an unsigned long.
Guido van Rossum805365e2007-05-07 22:24:25 +0000639 */
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000640static unsigned long
Benjamin Petersona1864f32010-11-20 23:05:39 +0000641get_len_of_range(long lo, long hi, long step)
642{
Guido van Rossum805365e2007-05-07 22:24:25 +0000643 /* -------------------------------------------------------------
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000644 If step > 0 and lo >= hi, or step < 0 and lo <= hi, the range is empty.
645 Else for step > 0, if n values are in the range, the last one is
Guido van Rossum805365e2007-05-07 22:24:25 +0000646 lo + (n-1)*step, which must be <= hi-1. Rearranging,
647 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
648 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
649 the RHS is non-negative and so truncation is the same as the
650 floor. Letting M be the largest positive long, the worst case
651 for the RHS numerator is hi=M, lo=-M-1, and then
652 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000653 precision to compute the RHS exactly. The analysis for step < 0
654 is similar.
Guido van Rossum805365e2007-05-07 22:24:25 +0000655 ---------------------------------------------------------------*/
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000656 assert(step != 0);
657 if (step > 0 && lo < hi)
658 return 1UL + (hi - 1UL - lo) / step;
659 else if (step < 0 && lo > hi)
660 return 1UL + (lo - 1UL - hi) / (0UL - step);
661 else
662 return 0UL;
Guido van Rossum805365e2007-05-07 22:24:25 +0000663}
664
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000665/* Initialize a rangeiter object. If the length of the rangeiter object
666 is not representable as a C long, OverflowError is raised. */
667
Guido van Rossum805365e2007-05-07 22:24:25 +0000668static PyObject *
Nick Coghlan37ee8502010-12-03 14:26:13 +0000669fast_range_iter(long start, long stop, long step)
Benjamin Petersona1864f32010-11-20 23:05:39 +0000670{
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000671 rangeiterobject *it = PyObject_New(rangeiterobject, &PyRangeIter_Type);
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000672 unsigned long ulen;
Guido van Rossum805365e2007-05-07 22:24:25 +0000673 if (it == NULL)
674 return NULL;
675 it->start = start;
676 it->step = step;
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000677 ulen = get_len_of_range(start, stop, step);
678 if (ulen > (unsigned long)LONG_MAX) {
Benjamin Peterson36fbb732009-11-16 00:34:25 +0000679 Py_DECREF(it);
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000680 PyErr_SetString(PyExc_OverflowError,
681 "range too large to represent as a range_iterator");
682 return NULL;
683 }
684 it->len = (long)ulen;
Guido van Rossum805365e2007-05-07 22:24:25 +0000685 it->index = 0;
686 return (PyObject *)it;
687}
688
689static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000690rangeiter_new(PyTypeObject *type, PyObject *args, PyObject *kw)
691{
Guido van Rossum805365e2007-05-07 22:24:25 +0000692 long start, stop, step;
693
694 if (!_PyArg_NoKeywords("rangeiter()", kw))
695 return NULL;
696
697 if (!PyArg_ParseTuple(args, "lll;rangeiter() requires 3 int arguments",
698 &start, &stop, &step))
699 return NULL;
700
Nick Coghlan37ee8502010-12-03 14:26:13 +0000701 return fast_range_iter(start, stop, step);
702}
703
704typedef struct {
705 PyObject_HEAD
706 PyObject *index;
707 PyObject *start;
708 PyObject *step;
709 PyObject *len;
710} longrangeiterobject;
711
712static PyObject *
713longrangeiter_len(longrangeiterobject *r, PyObject *no_args)
714{
715 return PyNumber_Subtract(r->len, r->index);
Guido van Rossum805365e2007-05-07 22:24:25 +0000716}
717
718static PyMethodDef longrangeiter_methods[] = {
719 {"__length_hint__", (PyCFunction)longrangeiter_len, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 length_hint_doc},
721 {NULL, NULL} /* sentinel */
Guido van Rossum805365e2007-05-07 22:24:25 +0000722};
723
724static void
Benjamin Petersona1864f32010-11-20 23:05:39 +0000725longrangeiter_dealloc(longrangeiterobject *r)
726{
Guido van Rossum805365e2007-05-07 22:24:25 +0000727 Py_XDECREF(r->index);
Guido van Rossum317e7742007-05-08 15:18:31 +0000728 Py_XDECREF(r->start);
729 Py_XDECREF(r->step);
730 Py_XDECREF(r->len);
Amaury Forgeot d'Arcb7f17e42007-11-15 20:52:21 +0000731 PyObject_Del(r);
Guido van Rossum805365e2007-05-07 22:24:25 +0000732}
733
734static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000735longrangeiter_next(longrangeiterobject *r)
736{
Guido van Rossum805365e2007-05-07 22:24:25 +0000737 PyObject *one, *product, *new_index, *result;
738 if (PyObject_RichCompareBool(r->index, r->len, Py_LT) != 1)
739 return NULL;
740
741 one = PyLong_FromLong(1);
742 if (!one)
743 return NULL;
744
Guido van Rossum805365e2007-05-07 22:24:25 +0000745 new_index = PyNumber_Add(r->index, one);
746 Py_DECREF(one);
Benjamin Peterson36fbb732009-11-16 00:34:25 +0000747 if (!new_index)
748 return NULL;
749
750 product = PyNumber_Multiply(r->index, r->step);
751 if (!product) {
752 Py_DECREF(new_index);
Guido van Rossum805365e2007-05-07 22:24:25 +0000753 return NULL;
754 }
755
756 result = PyNumber_Add(r->start, product);
757 Py_DECREF(product);
758 if (result) {
759 Py_DECREF(r->index);
760 r->index = new_index;
761 }
Benjamin Peterson36fbb732009-11-16 00:34:25 +0000762 else {
763 Py_DECREF(new_index);
764 }
Guido van Rossum805365e2007-05-07 22:24:25 +0000765
766 return result;
767}
768
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000769PyTypeObject PyLongRangeIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 PyVarObject_HEAD_INIT(&PyType_Type, 0)
771 "longrange_iterator", /* tp_name */
772 sizeof(longrangeiterobject), /* tp_basicsize */
773 0, /* tp_itemsize */
774 /* methods */
775 (destructor)longrangeiter_dealloc, /* tp_dealloc */
776 0, /* tp_print */
777 0, /* tp_getattr */
778 0, /* tp_setattr */
779 0, /* tp_reserved */
780 0, /* tp_repr */
781 0, /* tp_as_number */
782 0, /* tp_as_sequence */
783 0, /* tp_as_mapping */
784 0, /* tp_hash */
785 0, /* tp_call */
786 0, /* tp_str */
787 PyObject_GenericGetAttr, /* tp_getattro */
788 0, /* tp_setattro */
789 0, /* tp_as_buffer */
790 Py_TPFLAGS_DEFAULT, /* tp_flags */
791 0, /* tp_doc */
792 0, /* tp_traverse */
793 0, /* tp_clear */
794 0, /* tp_richcompare */
795 0, /* tp_weaklistoffset */
796 PyObject_SelfIter, /* tp_iter */
797 (iternextfunc)longrangeiter_next, /* tp_iternext */
798 longrangeiter_methods, /* tp_methods */
799 0,
Raymond Hettinger48165d42002-06-05 20:08:48 +0000800};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000801
802static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000803range_iter(PyObject *seq)
804{
Guido van Rossum805365e2007-05-07 22:24:25 +0000805 rangeobject *r = (rangeobject *)seq;
806 longrangeiterobject *it;
Martin v. Löwis84451042007-12-20 22:57:23 +0000807 long lstart, lstop, lstep;
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000808 PyObject *int_it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000809
Guido van Rossum805365e2007-05-07 22:24:25 +0000810 assert(PyRange_Check(seq));
Martin v. Löwis84451042007-12-20 22:57:23 +0000811
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000812 /* If all three fields and the length convert to long, use the int
813 * version */
Martin v. Löwis84451042007-12-20 22:57:23 +0000814 lstart = PyLong_AsLong(r->start);
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000815 if (lstart == -1 && PyErr_Occurred()) {
816 PyErr_Clear();
817 goto long_range;
Martin v. Löwis84451042007-12-20 22:57:23 +0000818 }
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000819 lstop = PyLong_AsLong(r->stop);
820 if (lstop == -1 && PyErr_Occurred()) {
821 PyErr_Clear();
822 goto long_range;
823 }
824 lstep = PyLong_AsLong(r->step);
825 if (lstep == -1 && PyErr_Occurred()) {
826 PyErr_Clear();
827 goto long_range;
828 }
Nick Coghlan37ee8502010-12-03 14:26:13 +0000829 int_it = fast_range_iter(lstart, lstop, lstep);
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000830 if (int_it == NULL && PyErr_ExceptionMatches(PyExc_OverflowError)) {
831 PyErr_Clear();
832 goto long_range;
833 }
834 return (PyObject *)int_it;
835
836 long_range:
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000837 it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type);
Guido van Rossum805365e2007-05-07 22:24:25 +0000838 if (it == NULL)
839 return NULL;
Guido van Rossum317e7742007-05-08 15:18:31 +0000840
841 /* Do all initialization here, so we can DECREF on failure. */
Guido van Rossum805365e2007-05-07 22:24:25 +0000842 it->start = r->start;
Guido van Rossum317e7742007-05-08 15:18:31 +0000843 it->step = r->step;
Nick Coghlan37ee8502010-12-03 14:26:13 +0000844 it->len = r->length;
Guido van Rossum317e7742007-05-08 15:18:31 +0000845 Py_INCREF(it->start);
846 Py_INCREF(it->step);
Nick Coghlan37ee8502010-12-03 14:26:13 +0000847 Py_INCREF(it->len);
Guido van Rossum317e7742007-05-08 15:18:31 +0000848
Guido van Rossum805365e2007-05-07 22:24:25 +0000849 it->index = PyLong_FromLong(0);
850 if (!it->index)
851 goto create_failure;
852
Guido van Rossum805365e2007-05-07 22:24:25 +0000853 return (PyObject *)it;
854
855create_failure:
Guido van Rossum317e7742007-05-08 15:18:31 +0000856 Py_DECREF(it);
Guido van Rossum805365e2007-05-07 22:24:25 +0000857 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000858}
859
860static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000861range_reverse(PyObject *seq)
862{
Guido van Rossum805365e2007-05-07 22:24:25 +0000863 rangeobject *range = (rangeobject*) seq;
864 longrangeiterobject *it;
Nick Coghlan37ee8502010-12-03 14:26:13 +0000865 PyObject *one, *sum, *diff, *product;
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000866 long lstart, lstop, lstep, new_start, new_stop;
867 unsigned long ulen;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000868
Guido van Rossum805365e2007-05-07 22:24:25 +0000869 assert(PyRange_Check(seq));
Martin v. Löwis84451042007-12-20 22:57:23 +0000870
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000871 /* reversed(range(start, stop, step)) can be expressed as
872 range(start+(n-1)*step, start-step, -step), where n is the number of
873 integers in the range.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000874
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000875 If each of start, stop, step, -step, start-step, and the length
876 of the iterator is representable as a C long, use the int
877 version. This excludes some cases where the reversed range is
878 representable as a range_iterator, but it's good enough for
879 common cases and it makes the checks simple. */
880
881 lstart = PyLong_AsLong(range->start);
882 if (lstart == -1 && PyErr_Occurred()) {
883 PyErr_Clear();
884 goto long_range;
885 }
886 lstop = PyLong_AsLong(range->stop);
887 if (lstop == -1 && PyErr_Occurred()) {
888 PyErr_Clear();
889 goto long_range;
890 }
891 lstep = PyLong_AsLong(range->step);
892 if (lstep == -1 && PyErr_Occurred()) {
893 PyErr_Clear();
894 goto long_range;
895 }
896 /* check for possible overflow of -lstep */
897 if (lstep == LONG_MIN)
898 goto long_range;
899
900 /* check for overflow of lstart - lstep:
901
902 for lstep > 0, need only check whether lstart - lstep < LONG_MIN.
903 for lstep < 0, need only check whether lstart - lstep > LONG_MAX
904
905 Rearrange these inequalities as:
906
907 lstart - LONG_MIN < lstep (lstep > 0)
908 LONG_MAX - lstart < -lstep (lstep < 0)
909
910 and compute both sides as unsigned longs, to avoid the
911 possibility of undefined behaviour due to signed overflow. */
912
913 if (lstep > 0) {
914 if ((unsigned long)lstart - LONG_MIN < (unsigned long)lstep)
915 goto long_range;
916 }
917 else {
918 if (LONG_MAX - (unsigned long)lstart < 0UL - lstep)
919 goto long_range;
920 }
921
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000922 ulen = get_len_of_range(lstart, lstop, lstep);
923 if (ulen > (unsigned long)LONG_MAX)
924 goto long_range;
925
926 new_stop = lstart - lstep;
927 new_start = (long)(new_stop + ulen * lstep);
Nick Coghlan37ee8502010-12-03 14:26:13 +0000928 return fast_range_iter(new_start, new_stop, -lstep);
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000929
930long_range:
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000931 it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type);
Guido van Rossum805365e2007-05-07 22:24:25 +0000932 if (it == NULL)
933 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000934
Guido van Rossum805365e2007-05-07 22:24:25 +0000935 /* start + (len - 1) * step */
Nick Coghlan37ee8502010-12-03 14:26:13 +0000936 it->len = range->length;
937 Py_INCREF(it->len);
Benjamin Peterson36fbb732009-11-16 00:34:25 +0000938
Guido van Rossum805365e2007-05-07 22:24:25 +0000939 one = PyLong_FromLong(1);
940 if (!one)
941 goto create_failure;
942
Nick Coghlan37ee8502010-12-03 14:26:13 +0000943 diff = PyNumber_Subtract(it->len, one);
Guido van Rossum805365e2007-05-07 22:24:25 +0000944 Py_DECREF(one);
945 if (!diff)
946 goto create_failure;
947
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000948 product = PyNumber_Multiply(diff, range->step);
949 Py_DECREF(diff);
Guido van Rossum805365e2007-05-07 22:24:25 +0000950 if (!product)
951 goto create_failure;
952
953 sum = PyNumber_Add(range->start, product);
954 Py_DECREF(product);
955 it->start = sum;
956 if (!it->start)
957 goto create_failure;
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000958
Guido van Rossum805365e2007-05-07 22:24:25 +0000959 it->step = PyNumber_Negative(range->step);
Benjamin Peterson36fbb732009-11-16 00:34:25 +0000960 if (!it->step)
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000961 goto create_failure;
Guido van Rossum805365e2007-05-07 22:24:25 +0000962
963 it->index = PyLong_FromLong(0);
Benjamin Peterson36fbb732009-11-16 00:34:25 +0000964 if (!it->index)
965 goto create_failure;
Guido van Rossum805365e2007-05-07 22:24:25 +0000966
967 return (PyObject *)it;
968
969create_failure:
Benjamin Peterson36fbb732009-11-16 00:34:25 +0000970 Py_DECREF(it);
Guido van Rossum805365e2007-05-07 22:24:25 +0000971 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000972}