blob: ca66a45d5fe4c34e5a08971712f0f769f68b9834 [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"
Benjamin Peterson878ce382011-11-05 15:17:52 -04004#include "structmember.h"
Thomas Woutersefafcea2001-07-09 12:30:54 +00005
Guido van Rossum805365e2007-05-07 22:24:25 +00006/* Support objects whose length is > PY_SSIZE_T_MAX.
7
8 This could be sped up for small PyLongs if they fit in an Py_ssize_t.
9 This only matters on Win64. Though we could use PY_LONG_LONG which
10 would presumably help perf.
11*/
12
Guido van Rossum12d12c51993-10-26 17:58:25 +000013typedef struct {
Guido van Rossum805365e2007-05-07 22:24:25 +000014 PyObject_HEAD
15 PyObject *start;
16 PyObject *stop;
17 PyObject *step;
Nick Coghlan37ee8502010-12-03 14:26:13 +000018 PyObject *length;
Guido van Rossum12d12c51993-10-26 17:58:25 +000019} rangeobject;
20
Guido van Rossum805365e2007-05-07 22:24:25 +000021/* Helper function for validating step. Always returns a new reference or
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 NULL on error.
Guido van Rossum805365e2007-05-07 22:24:25 +000023*/
24static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +000025validate_step(PyObject *step)
26{
Guido van Rossum805365e2007-05-07 22:24:25 +000027 /* No step specified, use a step of 1. */
28 if (!step)
Christian Heimes217cfd12007-12-02 14:31:20 +000029 return PyLong_FromLong(1);
Guido van Rossum805365e2007-05-07 22:24:25 +000030
31 step = PyNumber_Index(step);
32 if (step) {
33 Py_ssize_t istep = PyNumber_AsSsize_t(step, NULL);
34 if (istep == -1 && PyErr_Occurred()) {
35 /* Ignore OverflowError, we know the value isn't 0. */
36 PyErr_Clear();
37 }
38 else if (istep == 0) {
39 PyErr_SetString(PyExc_ValueError,
40 "range() arg 3 must not be zero");
41 Py_CLEAR(step);
42 }
43 }
44
45 return step;
Raymond Hettingerc4c453f2002-06-05 23:12:45 +000046}
47
Nick Coghlan37ee8502010-12-03 14:26:13 +000048static PyObject *
49compute_range_length(PyObject *start, PyObject *stop, PyObject *step);
50
51static rangeobject *
52make_range_object(PyTypeObject *type, PyObject *start,
53 PyObject *stop, PyObject *step)
54{
55 rangeobject *obj = NULL;
56 PyObject *length;
57 length = compute_range_length(start, stop, step);
58 if (length == NULL) {
59 return NULL;
60 }
61 obj = PyObject_New(rangeobject, type);
62 if (obj == NULL) {
63 Py_DECREF(length);
64 return NULL;
65 }
66 obj->start = start;
67 obj->stop = stop;
68 obj->step = step;
69 obj->length = length;
70 return obj;
71}
72
Guido van Rossum805365e2007-05-07 22:24:25 +000073/* XXX(nnorwitz): should we error check if the user passes any empty ranges?
74 range(-10)
75 range(0, -5)
76 range(0, 5, -1)
77*/
Raymond Hettingerc4c453f2002-06-05 23:12:45 +000078static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +000079range_new(PyTypeObject *type, PyObject *args, PyObject *kw)
80{
Nick Coghlan37ee8502010-12-03 14:26:13 +000081 rangeobject *obj;
Guido van Rossum805365e2007-05-07 22:24:25 +000082 PyObject *start = NULL, *stop = NULL, *step = NULL;
Raymond Hettingerc4c453f2002-06-05 23:12:45 +000083
Guido van Rossum805365e2007-05-07 22:24:25 +000084 if (!_PyArg_NoKeywords("range()", kw))
85 return NULL;
Georg Brandl02c42872005-08-26 06:42:30 +000086
Guido van Rossum805365e2007-05-07 22:24:25 +000087 if (PyTuple_Size(args) <= 1) {
88 if (!PyArg_UnpackTuple(args, "range", 1, 1, &stop))
Raymond Hettinger94f55832009-06-12 18:40:16 +000089 return NULL;
Guido van Rossum805365e2007-05-07 22:24:25 +000090 stop = PyNumber_Index(stop);
91 if (!stop)
Raymond Hettinger94f55832009-06-12 18:40:16 +000092 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +000093 start = PyLong_FromLong(0);
Raymond Hettinger94f55832009-06-12 18:40:16 +000094 if (!start) {
95 Py_DECREF(stop);
96 return NULL;
97 }
Christian Heimes217cfd12007-12-02 14:31:20 +000098 step = PyLong_FromLong(1);
Raymond Hettinger94f55832009-06-12 18:40:16 +000099 if (!step) {
100 Py_DECREF(stop);
101 Py_DECREF(start);
102 return NULL;
103 }
Guido van Rossum805365e2007-05-07 22:24:25 +0000104 }
105 else {
106 if (!PyArg_UnpackTuple(args, "range", 2, 3,
107 &start, &stop, &step))
Raymond Hettinger94f55832009-06-12 18:40:16 +0000108 return NULL;
Tim Petersfeec4532004-08-08 07:17:39 +0000109
Guido van Rossum805365e2007-05-07 22:24:25 +0000110 /* Convert borrowed refs to owned refs */
111 start = PyNumber_Index(start);
Raymond Hettinger94f55832009-06-12 18:40:16 +0000112 if (!start)
113 return NULL;
Guido van Rossum805365e2007-05-07 22:24:25 +0000114 stop = PyNumber_Index(stop);
Raymond Hettinger94f55832009-06-12 18:40:16 +0000115 if (!stop) {
116 Py_DECREF(start);
117 return NULL;
118 }
119 step = validate_step(step); /* Caution, this can clear exceptions */
120 if (!step) {
121 Py_DECREF(start);
122 Py_DECREF(stop);
123 return NULL;
124 }
Guido van Rossum805365e2007-05-07 22:24:25 +0000125 }
126
Nick Coghlan37ee8502010-12-03 14:26:13 +0000127 obj = make_range_object(type, start, stop, step);
128 if (obj != NULL)
129 return (PyObject *) obj;
Guido van Rossum805365e2007-05-07 22:24:25 +0000130
Nick Coghlan37ee8502010-12-03 14:26:13 +0000131 /* Failed to create object, release attributes */
Guido van Rossum805365e2007-05-07 22:24:25 +0000132 Py_XDECREF(start);
133 Py_XDECREF(stop);
134 Py_XDECREF(step);
135 return NULL;
Raymond Hettingerc4c453f2002-06-05 23:12:45 +0000136}
137
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000138PyDoc_STRVAR(range_doc,
Chris Jerdonek83fe2e12012-10-07 14:48:36 -0700139"range(stop) -> range object\n\
140range(start, stop[, step]) -> range object\n\
Raymond Hettingerc4c453f2002-06-05 23:12:45 +0000141\n\
Benjamin Petersonac22c6b2015-04-22 09:16:07 -0400142Return an object that produces a sequence of integers from start (inclusive)\n\
143to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.\n\
144start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.\n\
145These are exactly the valid indices for a list of 4 elements.\n\
146When step is given, it specifies the increment (or decrement).");
Raymond Hettingerc4c453f2002-06-05 23:12:45 +0000147
Guido van Rossum805365e2007-05-07 22:24:25 +0000148static void
Benjamin Petersona1864f32010-11-20 23:05:39 +0000149range_dealloc(rangeobject *r)
150{
Guido van Rossum805365e2007-05-07 22:24:25 +0000151 Py_DECREF(r->start);
152 Py_DECREF(r->stop);
153 Py_DECREF(r->step);
Nick Coghlan37ee8502010-12-03 14:26:13 +0000154 Py_DECREF(r->length);
Amaury Forgeot d'Arcb7f17e42007-11-15 20:52:21 +0000155 PyObject_Del(r);
Guido van Rossum805365e2007-05-07 22:24:25 +0000156}
157
Mark Dickinson732166d2009-06-28 22:08:40 +0000158/* Return number of items in range (lo, hi, step) as a PyLong object,
159 * when arguments are PyLong objects. Arguments MUST return 1 with
160 * PyLong_Check(). Return NULL when there is an error.
Guido van Rossum805365e2007-05-07 22:24:25 +0000161 */
162static PyObject*
Nick Coghlan37ee8502010-12-03 14:26:13 +0000163compute_range_length(PyObject *start, PyObject *stop, PyObject *step)
Benjamin Petersona1864f32010-11-20 23:05:39 +0000164{
Guido van Rossum805365e2007-05-07 22:24:25 +0000165 /* -------------------------------------------------------------
166 Algorithm is equal to that of get_len_of_range(), but it operates
Benjamin Petersona47af9c2009-06-24 21:14:38 +0000167 on PyObjects (which are assumed to be PyLong objects).
Guido van Rossum805365e2007-05-07 22:24:25 +0000168 ---------------------------------------------------------------*/
Mark Dickinson211c6252009-02-01 10:28:51 +0000169 int cmp_result;
Guido van Rossum805365e2007-05-07 22:24:25 +0000170 PyObject *lo, *hi;
Guido van Rossum805365e2007-05-07 22:24:25 +0000171 PyObject *diff = NULL;
172 PyObject *one = NULL;
173 PyObject *tmp1 = NULL, *tmp2 = NULL, *result;
174 /* holds sub-expression evaluations */
175
176 PyObject *zero = PyLong_FromLong(0);
177 if (zero == NULL)
178 return NULL;
Nick Coghlan37ee8502010-12-03 14:26:13 +0000179 cmp_result = PyObject_RichCompareBool(step, zero, Py_GT);
Guido van Rossum805365e2007-05-07 22:24:25 +0000180 Py_DECREF(zero);
Mark Dickinson211c6252009-02-01 10:28:51 +0000181 if (cmp_result == -1)
Guido van Rossum805365e2007-05-07 22:24:25 +0000182 return NULL;
183
Mark Dickinson211c6252009-02-01 10:28:51 +0000184 if (cmp_result == 1) {
Nick Coghlan37ee8502010-12-03 14:26:13 +0000185 lo = start;
186 hi = stop;
Guido van Rossum805365e2007-05-07 22:24:25 +0000187 Py_INCREF(step);
188 } else {
Nick Coghlan37ee8502010-12-03 14:26:13 +0000189 lo = stop;
190 hi = start;
191 step = PyNumber_Negative(step);
Guido van Rossum805365e2007-05-07 22:24:25 +0000192 if (!step)
193 return NULL;
194 }
195
196 /* if (lo >= hi), return length of 0. */
Mark Dickinson211c6252009-02-01 10:28:51 +0000197 if (PyObject_RichCompareBool(lo, hi, Py_GE) == 1) {
Guido van Rossum805365e2007-05-07 22:24:25 +0000198 Py_XDECREF(step);
199 return PyLong_FromLong(0);
200 }
201
202 if ((one = PyLong_FromLong(1L)) == NULL)
203 goto Fail;
204
205 if ((tmp1 = PyNumber_Subtract(hi, lo)) == NULL)
206 goto Fail;
207
208 if ((diff = PyNumber_Subtract(tmp1, one)) == NULL)
209 goto Fail;
210
211 if ((tmp2 = PyNumber_FloorDivide(diff, step)) == NULL)
212 goto Fail;
213
214 if ((result = PyNumber_Add(tmp2, one)) == NULL)
215 goto Fail;
216
217 Py_DECREF(tmp2);
218 Py_DECREF(diff);
219 Py_DECREF(step);
220 Py_DECREF(tmp1);
221 Py_DECREF(one);
222 return result;
223
224 Fail:
225 Py_XDECREF(tmp2);
226 Py_XDECREF(diff);
227 Py_XDECREF(step);
228 Py_XDECREF(tmp1);
229 Py_XDECREF(one);
230 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000231}
232
Martin v. Löwis18e16552006-02-15 17:27:45 +0000233static Py_ssize_t
Benjamin Petersona1864f32010-11-20 23:05:39 +0000234range_length(rangeobject *r)
235{
Nick Coghlan37ee8502010-12-03 14:26:13 +0000236 return PyLong_AsSsize_t(r->length);
Guido van Rossum805365e2007-05-07 22:24:25 +0000237}
238
Guido van Rossum805365e2007-05-07 22:24:25 +0000239static PyObject *
Nick Coghlane993b102011-01-12 03:15:52 +0000240compute_item(rangeobject *r, PyObject *i)
Benjamin Petersona1864f32010-11-20 23:05:39 +0000241{
Nick Coghlane993b102011-01-12 03:15:52 +0000242 PyObject *incr, *result;
243 /* PyLong equivalent to:
244 * return r->start + (i * r->step)
245 */
246 incr = PyNumber_Multiply(i, r->step);
Guido van Rossum805365e2007-05-07 22:24:25 +0000247 if (!incr)
248 return NULL;
249 result = PyNumber_Add(r->start, incr);
250 Py_DECREF(incr);
251 return result;
Guido van Rossum7d6aa511993-12-21 22:50:31 +0000252}
253
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254static PyObject *
Nick Coghlane993b102011-01-12 03:15:52 +0000255compute_range_item(rangeobject *r, PyObject *arg)
Benjamin Petersona1864f32010-11-20 23:05:39 +0000256{
Nick Coghlane993b102011-01-12 03:15:52 +0000257 int cmp_result;
258 PyObject *i, *result;
Tim Petersd976ab72004-08-08 06:29:10 +0000259
Nick Coghlane993b102011-01-12 03:15:52 +0000260 PyObject *zero = PyLong_FromLong(0);
261 if (zero == NULL)
262 return NULL;
Nick Coghlan37ee8502010-12-03 14:26:13 +0000263
Nick Coghlane993b102011-01-12 03:15:52 +0000264 /* PyLong equivalent to:
265 * if (arg < 0) {
266 * i = r->length + arg
267 * } else {
268 * i = arg
269 * }
270 */
271 cmp_result = PyObject_RichCompareBool(arg, zero, Py_LT);
272 if (cmp_result == -1) {
273 Py_DECREF(zero);
Nick Coghlan37ee8502010-12-03 14:26:13 +0000274 return NULL;
Guido van Rossum805365e2007-05-07 22:24:25 +0000275 }
Nick Coghlane993b102011-01-12 03:15:52 +0000276 if (cmp_result == 1) {
277 i = PyNumber_Add(r->length, arg);
278 if (!i) {
279 Py_DECREF(zero);
280 return NULL;
281 }
282 } else {
283 i = arg;
284 Py_INCREF(i);
285 }
286
287 /* PyLong equivalent to:
288 * if (i < 0 || i >= r->length) {
289 * <report index out of bounds>
290 * }
291 */
292 cmp_result = PyObject_RichCompareBool(i, zero, Py_LT);
293 Py_DECREF(zero);
294 if (cmp_result == 0) {
295 cmp_result = PyObject_RichCompareBool(i, r->length, Py_GE);
296 }
297 if (cmp_result == -1) {
298 Py_DECREF(i);
299 return NULL;
300 }
301 if (cmp_result == 1) {
302 Py_DECREF(i);
303 PyErr_SetString(PyExc_IndexError,
304 "range object index out of range");
305 return NULL;
306 }
307
308 result = compute_item(r, i);
309 Py_DECREF(i);
310 return result;
311}
312
313static PyObject *
314range_item(rangeobject *r, Py_ssize_t i)
315{
Antoine Pitroua103b962012-05-16 14:37:54 +0200316 PyObject *res, *arg = PyLong_FromSsize_t(i);
Nick Coghlane993b102011-01-12 03:15:52 +0000317 if (!arg) {
318 return NULL;
319 }
Benjamin Peterson547d4852011-01-13 04:22:54 +0000320 res = compute_range_item(r, arg);
321 Py_DECREF(arg);
322 return res;
Nick Coghlane993b102011-01-12 03:15:52 +0000323}
324
Nick Coghlane993b102011-01-12 03:15:52 +0000325static PyObject *
326compute_slice(rangeobject *r, PyObject *_slice)
327{
328 PySliceObject *slice = (PySliceObject *) _slice;
329 rangeobject *result;
330 PyObject *start = NULL, *stop = NULL, *step = NULL;
331 PyObject *substart = NULL, *substop = NULL, *substep = NULL;
Mark Dickinsonffdb2c22012-11-17 19:18:10 +0000332 int error;
Nick Coghlane993b102011-01-12 03:15:52 +0000333
Mark Dickinsonffdb2c22012-11-17 19:18:10 +0000334 error = _PySlice_GetLongIndices(slice, r->length, &start, &stop, &step);
335 if (error == -1)
336 return NULL;
Nick Coghlane993b102011-01-12 03:15:52 +0000337
338 substep = PyNumber_Multiply(r->step, step);
339 if (substep == NULL) goto fail;
340 Py_CLEAR(step);
341
342 substart = compute_item(r, start);
343 if (substart == NULL) goto fail;
344 Py_CLEAR(start);
345
Mark Dickinsonffdb2c22012-11-17 19:18:10 +0000346 substop = compute_item(r, stop);
347 if (substop == NULL) goto fail;
Nick Coghlane993b102011-01-12 03:15:52 +0000348 Py_CLEAR(stop);
349
350 result = make_range_object(Py_TYPE(r), substart, substop, substep);
351 if (result != NULL) {
352 return (PyObject *) result;
353 }
354fail:
355 Py_XDECREF(start);
356 Py_XDECREF(stop);
357 Py_XDECREF(step);
358 Py_XDECREF(substart);
359 Py_XDECREF(substop);
360 Py_XDECREF(substep);
361 return NULL;
Alexandre Vassalotti75056072008-06-10 04:03:04 +0000362}
363
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000364/* Assumes (PyLong_CheckExact(ob) || PyBool_Check(ob)) */
365static int
Benjamin Petersona1864f32010-11-20 23:05:39 +0000366range_contains_long(rangeobject *r, PyObject *ob)
367{
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000368 int cmp1, cmp2, cmp3;
369 PyObject *tmp1 = NULL;
370 PyObject *tmp2 = NULL;
371 PyObject *zero = NULL;
372 int result = -1;
373
374 zero = PyLong_FromLong(0);
375 if (zero == NULL) /* MemoryError in int(0) */
376 goto end;
377
378 /* Check if the value can possibly be in the range. */
379
380 cmp1 = PyObject_RichCompareBool(r->step, zero, Py_GT);
381 if (cmp1 == -1)
382 goto end;
383 if (cmp1 == 1) { /* positive steps: start <= ob < stop */
384 cmp2 = PyObject_RichCompareBool(r->start, ob, Py_LE);
385 cmp3 = PyObject_RichCompareBool(ob, r->stop, Py_LT);
386 }
387 else { /* negative steps: stop < ob <= start */
388 cmp2 = PyObject_RichCompareBool(ob, r->start, Py_LE);
389 cmp3 = PyObject_RichCompareBool(r->stop, ob, Py_LT);
390 }
391
392 if (cmp2 == -1 || cmp3 == -1) /* TypeError */
393 goto end;
394 if (cmp2 == 0 || cmp3 == 0) { /* ob outside of range */
395 result = 0;
396 goto end;
397 }
398
399 /* Check that the stride does not invalidate ob's membership. */
400 tmp1 = PyNumber_Subtract(ob, r->start);
401 if (tmp1 == NULL)
402 goto end;
403 tmp2 = PyNumber_Remainder(tmp1, r->step);
404 if (tmp2 == NULL)
405 goto end;
406 /* result = (int(ob) - start % step) == 0 */
407 result = PyObject_RichCompareBool(tmp2, zero, Py_EQ);
408 end:
409 Py_XDECREF(tmp1);
410 Py_XDECREF(tmp2);
411 Py_XDECREF(zero);
412 return result;
413}
414
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000415static int
Benjamin Petersona1864f32010-11-20 23:05:39 +0000416range_contains(rangeobject *r, PyObject *ob)
417{
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000418 if (PyLong_CheckExact(ob) || PyBool_Check(ob))
419 return range_contains_long(r, ob);
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000420
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000421 return (int)_PySequence_IterSearch((PyObject*)r, ob,
422 PY_ITERSEARCH_CONTAINS);
423}
424
Mark Dickinson36645682011-10-23 19:53:01 +0100425/* Compare two range objects. Return 1 for equal, 0 for not equal
426 and -1 on error. The algorithm is roughly the C equivalent of
427
428 if r0 is r1:
429 return True
430 if len(r0) != len(r1):
431 return False
432 if not len(r0):
433 return True
434 if r0.start != r1.start:
435 return False
436 if len(r0) == 1:
437 return True
438 return r0.step == r1.step
439*/
440static int
441range_equals(rangeobject *r0, rangeobject *r1)
442{
443 int cmp_result;
444 PyObject *one;
445
446 if (r0 == r1)
447 return 1;
448 cmp_result = PyObject_RichCompareBool(r0->length, r1->length, Py_EQ);
449 /* Return False or error to the caller. */
450 if (cmp_result != 1)
451 return cmp_result;
452 cmp_result = PyObject_Not(r0->length);
453 /* Return True or error to the caller. */
454 if (cmp_result != 0)
455 return cmp_result;
456 cmp_result = PyObject_RichCompareBool(r0->start, r1->start, Py_EQ);
457 /* Return False or error to the caller. */
458 if (cmp_result != 1)
459 return cmp_result;
460 one = PyLong_FromLong(1);
461 if (!one)
462 return -1;
463 cmp_result = PyObject_RichCompareBool(r0->length, one, Py_EQ);
464 Py_DECREF(one);
465 /* Return True or error to the caller. */
466 if (cmp_result != 0)
467 return cmp_result;
468 return PyObject_RichCompareBool(r0->step, r1->step, Py_EQ);
469}
470
471static PyObject *
472range_richcompare(PyObject *self, PyObject *other, int op)
473{
474 int result;
475
476 if (!PyRange_Check(other))
477 Py_RETURN_NOTIMPLEMENTED;
478 switch (op) {
479 case Py_NE:
480 case Py_EQ:
481 result = range_equals((rangeobject*)self, (rangeobject*)other);
482 if (result == -1)
483 return NULL;
484 if (op == Py_NE)
485 result = !result;
486 if (result)
487 Py_RETURN_TRUE;
488 else
489 Py_RETURN_FALSE;
490 case Py_LE:
491 case Py_GE:
492 case Py_LT:
493 case Py_GT:
494 Py_RETURN_NOTIMPLEMENTED;
495 default:
496 PyErr_BadArgument();
497 return NULL;
498 }
499}
500
501/* Hash function for range objects. Rough C equivalent of
502
503 if not len(r):
504 return hash((len(r), None, None))
505 if len(r) == 1:
506 return hash((len(r), r.start, None))
507 return hash((len(r), r.start, r.step))
508*/
509static Py_hash_t
510range_hash(rangeobject *r)
511{
512 PyObject *t;
513 Py_hash_t result = -1;
514 int cmp_result;
515
516 t = PyTuple_New(3);
517 if (!t)
518 return -1;
519 Py_INCREF(r->length);
520 PyTuple_SET_ITEM(t, 0, r->length);
521 cmp_result = PyObject_Not(r->length);
522 if (cmp_result == -1)
523 goto end;
524 if (cmp_result == 1) {
525 Py_INCREF(Py_None);
526 Py_INCREF(Py_None);
527 PyTuple_SET_ITEM(t, 1, Py_None);
528 PyTuple_SET_ITEM(t, 2, Py_None);
529 }
530 else {
531 PyObject *one;
532 Py_INCREF(r->start);
533 PyTuple_SET_ITEM(t, 1, r->start);
534 one = PyLong_FromLong(1);
535 if (!one)
536 goto end;
537 cmp_result = PyObject_RichCompareBool(r->length, one, Py_EQ);
538 Py_DECREF(one);
539 if (cmp_result == -1)
540 goto end;
541 if (cmp_result == 1) {
542 Py_INCREF(Py_None);
543 PyTuple_SET_ITEM(t, 2, Py_None);
544 }
545 else {
546 Py_INCREF(r->step);
547 PyTuple_SET_ITEM(t, 2, r->step);
548 }
549 }
550 result = PyObject_Hash(t);
551 end:
552 Py_DECREF(t);
553 return result;
554}
555
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000556static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000557range_count(rangeobject *r, PyObject *ob)
558{
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000559 if (PyLong_CheckExact(ob) || PyBool_Check(ob)) {
Georg Brandl7e5343b2010-11-20 22:40:10 +0000560 int result = range_contains_long(r, ob);
561 if (result == -1)
562 return NULL;
563 else if (result)
Benjamin Peterson0b458d52010-11-20 22:35:41 +0000564 return PyLong_FromLong(1);
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000565 else
Benjamin Peterson0b458d52010-11-20 22:35:41 +0000566 return PyLong_FromLong(0);
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000567 } else {
568 Py_ssize_t count;
569 count = _PySequence_IterSearch((PyObject*)r, ob, PY_ITERSEARCH_COUNT);
570 if (count == -1)
571 return NULL;
572 return PyLong_FromSsize_t(count);
573 }
574}
575
576static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000577range_index(rangeobject *r, PyObject *ob)
578{
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000579 int contains;
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000580
581 if (!PyLong_CheckExact(ob) && !PyBool_Check(ob)) {
582 Py_ssize_t index;
583 index = _PySequence_IterSearch((PyObject*)r, ob, PY_ITERSEARCH_INDEX);
584 if (index == -1)
585 return NULL;
586 return PyLong_FromSsize_t(index);
587 }
588
589 contains = range_contains_long(r, ob);
590 if (contains == -1)
591 return NULL;
592
Benjamin Peterson155614b2010-11-20 22:44:32 +0000593 if (contains) {
594 PyObject *idx, *tmp = PyNumber_Subtract(ob, r->start);
595 if (tmp == NULL)
596 return NULL;
597 /* idx = (ob - r.start) // r.step */
598 idx = PyNumber_FloorDivide(tmp, r->step);
599 Py_DECREF(tmp);
600 return idx;
601 }
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000602
603 /* object is not in the range */
Benjamin Peterson155614b2010-11-20 22:44:32 +0000604 PyErr_Format(PyExc_ValueError, "%R is not in range", ob);
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000605 return NULL;
606}
607
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608static PySequenceMethods range_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 (lenfunc)range_length, /* sq_length */
Nick Coghlan37ee8502010-12-03 14:26:13 +0000610 0, /* sq_concat */
611 0, /* sq_repeat */
612 (ssizeargfunc)range_item, /* sq_item */
613 0, /* sq_slice */
614 0, /* sq_ass_item */
615 0, /* sq_ass_slice */
Mark Dickinson3e124ae2009-09-22 21:47:24 +0000616 (objobjproc)range_contains, /* sq_contains */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000617};
618
Nick Coghlan37ee8502010-12-03 14:26:13 +0000619static PyObject *
620range_repr(rangeobject *r)
621{
622 Py_ssize_t istep;
623
624 /* Check for special case values for printing. We don't always
625 need the step value. We don't care about errors
626 (it means overflow), so clear the errors. */
627 istep = PyNumber_AsSsize_t(r->step, NULL);
628 if (istep != 1 || (istep == -1 && PyErr_Occurred())) {
629 PyErr_Clear();
630 }
631
632 if (istep == 1)
633 return PyUnicode_FromFormat("range(%R, %R)", r->start, r->stop);
634 else
635 return PyUnicode_FromFormat("range(%R, %R, %R)",
636 r->start, r->stop, r->step);
637}
638
639/* Pickling support */
640static PyObject *
641range_reduce(rangeobject *r, PyObject *args)
642{
643 return Py_BuildValue("(O(OOO))", Py_TYPE(r),
644 r->start, r->stop, r->step);
645}
646
647static PyObject *
648range_subscript(rangeobject* self, PyObject* item)
649{
650 if (PyIndex_Check(item)) {
Nick Coghlane993b102011-01-12 03:15:52 +0000651 PyObject *i, *result;
652 i = PyNumber_Index(item);
653 if (!i)
Nick Coghlan37ee8502010-12-03 14:26:13 +0000654 return NULL;
Nick Coghlane993b102011-01-12 03:15:52 +0000655 result = compute_range_item(self, i);
656 Py_DECREF(i);
657 return result;
Nick Coghlan37ee8502010-12-03 14:26:13 +0000658 }
659 if (PySlice_Check(item)) {
Nick Coghlane993b102011-01-12 03:15:52 +0000660 return compute_slice(self, item);
Nick Coghlan37ee8502010-12-03 14:26:13 +0000661 }
662 PyErr_Format(PyExc_TypeError,
663 "range indices must be integers or slices, not %.200s",
664 item->ob_type->tp_name);
665 return NULL;
666}
667
668
669static PyMappingMethods range_as_mapping = {
670 (lenfunc)range_length, /* mp_length */
671 (binaryfunc)range_subscript, /* mp_subscript */
672 (objobjargproc)0, /* mp_ass_subscript */
673};
674
Jeremy Hylton938ace62002-07-17 16:30:39 +0000675static PyObject * range_iter(PyObject *seq);
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000676static PyObject * range_reverse(PyObject *seq);
677
678PyDoc_STRVAR(reverse_doc,
Ezio Melotti5792ce12013-10-06 00:36:45 +0300679"Return a reverse iterator.");
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000680
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000681PyDoc_STRVAR(count_doc,
682"rangeobject.count(value) -> integer -- return number of occurrences of value");
683
684PyDoc_STRVAR(index_doc,
685"rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n"
Ezio Melotti5792ce12013-10-06 00:36:45 +0300686"Raise ValueError if the value is not present.");
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000687
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000688static PyMethodDef range_methods[] = {
Daniel Stutzbach9f0cbf12010-09-13 21:16:29 +0000689 {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc},
690 {"__reduce__", (PyCFunction)range_reduce, METH_VARARGS},
691 {"count", (PyCFunction)range_count, METH_O, count_doc},
692 {"index", (PyCFunction)range_index, METH_O, index_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 {NULL, NULL} /* sentinel */
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000694};
Raymond Hettinger48165d42002-06-05 20:08:48 +0000695
Benjamin Peterson878ce382011-11-05 15:17:52 -0400696static PyMemberDef range_members[] = {
697 {"start", T_OBJECT_EX, offsetof(rangeobject, start), READONLY},
698 {"stop", T_OBJECT_EX, offsetof(rangeobject, stop), READONLY},
699 {"step", T_OBJECT_EX, offsetof(rangeobject, step), READONLY},
700 {0}
701};
702
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000703PyTypeObject PyRange_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 PyVarObject_HEAD_INIT(&PyType_Type, 0)
705 "range", /* Name of this type */
706 sizeof(rangeobject), /* Basic object size */
707 0, /* Item size for varobject */
708 (destructor)range_dealloc, /* tp_dealloc */
709 0, /* tp_print */
710 0, /* tp_getattr */
711 0, /* tp_setattr */
712 0, /* tp_reserved */
713 (reprfunc)range_repr, /* tp_repr */
714 0, /* tp_as_number */
715 &range_as_sequence, /* tp_as_sequence */
Nick Coghlan37ee8502010-12-03 14:26:13 +0000716 &range_as_mapping, /* tp_as_mapping */
Mark Dickinson36645682011-10-23 19:53:01 +0100717 (hashfunc)range_hash, /* tp_hash */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 0, /* tp_call */
719 0, /* tp_str */
720 PyObject_GenericGetAttr, /* tp_getattro */
721 0, /* tp_setattro */
722 0, /* tp_as_buffer */
723 Py_TPFLAGS_DEFAULT, /* tp_flags */
724 range_doc, /* tp_doc */
725 0, /* tp_traverse */
726 0, /* tp_clear */
Mark Dickinson36645682011-10-23 19:53:01 +0100727 range_richcompare, /* tp_richcompare */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 0, /* tp_weaklistoffset */
729 range_iter, /* tp_iter */
730 0, /* tp_iternext */
731 range_methods, /* tp_methods */
Benjamin Peterson878ce382011-11-05 15:17:52 -0400732 range_members, /* tp_members */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 0, /* tp_getset */
734 0, /* tp_base */
735 0, /* tp_dict */
736 0, /* tp_descr_get */
737 0, /* tp_descr_set */
738 0, /* tp_dictoffset */
739 0, /* tp_init */
740 0, /* tp_alloc */
741 range_new, /* tp_new */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000742};
Raymond Hettinger48165d42002-06-05 20:08:48 +0000743
Walter Dörwald4ad94212007-05-21 18:01:17 +0000744/*********************** range Iterator **************************/
Raymond Hettinger48165d42002-06-05 20:08:48 +0000745
Guido van Rossum805365e2007-05-07 22:24:25 +0000746/* There are 2 types of iterators, one for C longs, the other for
Serhiy Storchaka95949422013-08-27 19:40:23 +0300747 Python ints (ie, PyObjects). This should make iteration fast
Guido van Rossum805365e2007-05-07 22:24:25 +0000748 in the normal case, but possible for any numeric value.
749*/
750
Raymond Hettinger48165d42002-06-05 20:08:48 +0000751typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 PyObject_HEAD
753 long index;
754 long start;
755 long step;
756 long len;
Raymond Hettinger48165d42002-06-05 20:08:48 +0000757} rangeiterobject;
758
Raymond Hettinger85c20a42003-11-06 14:06:48 +0000759static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000760rangeiter_next(rangeiterobject *r)
761{
Guido van Rossum805365e2007-05-07 22:24:25 +0000762 if (r->index < r->len)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 /* cast to unsigned to avoid possible signed overflow
Mark Dickinsonb43dbc22009-11-15 12:56:08 +0000764 in intermediate calculations. */
765 return PyLong_FromLong((long)(r->start +
766 (unsigned long)(r->index++) * r->step));
Guido van Rossum805365e2007-05-07 22:24:25 +0000767 return NULL;
Raymond Hettinger48165d42002-06-05 20:08:48 +0000768}
769
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000770static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000771rangeiter_len(rangeiterobject *r)
772{
Christian Heimes217cfd12007-12-02 14:31:20 +0000773 return PyLong_FromLong(r->len - r->index);
Raymond Hettingeref9bf402004-03-10 10:10:42 +0000774}
775
Guido van Rossum805365e2007-05-07 22:24:25 +0000776PyDoc_STRVAR(length_hint_doc,
777 "Private method returning an estimate of len(list(it)).");
Raymond Hettingeref9bf402004-03-10 10:10:42 +0000778
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000779static PyObject *
780rangeiter_reduce(rangeiterobject *r)
781{
782 PyObject *start=NULL, *stop=NULL, *step=NULL;
783 PyObject *range;
Chris Jerdonek042fa652012-10-07 14:56:27 -0700784
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000785 /* create a range object for pickling */
786 start = PyLong_FromLong(r->start);
787 if (start == NULL)
788 goto err;
789 stop = PyLong_FromLong(r->start + r->len * r->step);
790 if (stop == NULL)
791 goto err;
792 step = PyLong_FromLong(r->step);
793 if (step == NULL)
794 goto err;
795 range = (PyObject*)make_range_object(&PyRange_Type,
796 start, stop, step);
797 if (range == NULL)
798 goto err;
799 /* return the result */
Antoine Pitroua7013882012-04-05 00:04:20 +0200800 return Py_BuildValue("N(N)i", _PyObject_GetBuiltin("iter"), range, r->index);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000801err:
802 Py_XDECREF(start);
803 Py_XDECREF(stop);
804 Py_XDECREF(step);
805 return NULL;
806}
807
808static PyObject *
809rangeiter_setstate(rangeiterobject *r, PyObject *state)
810{
811 long index = PyLong_AsLong(state);
812 if (index == -1 && PyErr_Occurred())
813 return NULL;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +0000814 /* silently clip the index value */
815 if (index < 0)
816 index = 0;
817 else if (index > r->len)
818 index = r->len; /* exhausted iterator */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000819 r->index = index;
820 Py_RETURN_NONE;
821}
822
823PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
824PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
825
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000826static PyMethodDef rangeiter_methods[] = {
Guido van Rossum805365e2007-05-07 22:24:25 +0000827 {"__length_hint__", (PyCFunction)rangeiter_len, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000829 {"__reduce__", (PyCFunction)rangeiter_reduce, METH_NOARGS,
830 reduce_doc},
831 {"__setstate__", (PyCFunction)rangeiter_setstate, METH_O,
832 setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 {NULL, NULL} /* sentinel */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000834};
Raymond Hettingeref9bf402004-03-10 10:10:42 +0000835
Nick Coghlan37ee8502010-12-03 14:26:13 +0000836static PyObject *rangeiter_new(PyTypeObject *, PyObject *args, PyObject *kw);
837
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000838PyTypeObject PyRangeIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 PyVarObject_HEAD_INIT(&PyType_Type, 0)
840 "range_iterator", /* tp_name */
841 sizeof(rangeiterobject), /* tp_basicsize */
842 0, /* tp_itemsize */
843 /* methods */
844 (destructor)PyObject_Del, /* tp_dealloc */
845 0, /* tp_print */
846 0, /* tp_getattr */
847 0, /* tp_setattr */
848 0, /* tp_reserved */
849 0, /* tp_repr */
850 0, /* tp_as_number */
851 0, /* tp_as_sequence */
852 0, /* tp_as_mapping */
853 0, /* tp_hash */
854 0, /* tp_call */
855 0, /* tp_str */
856 PyObject_GenericGetAttr, /* tp_getattro */
857 0, /* tp_setattro */
858 0, /* tp_as_buffer */
859 Py_TPFLAGS_DEFAULT, /* tp_flags */
860 0, /* tp_doc */
861 0, /* tp_traverse */
862 0, /* tp_clear */
863 0, /* tp_richcompare */
864 0, /* tp_weaklistoffset */
865 PyObject_SelfIter, /* tp_iter */
866 (iternextfunc)rangeiter_next, /* tp_iternext */
867 rangeiter_methods, /* tp_methods */
868 0, /* tp_members */
869 0, /* tp_getset */
870 0, /* tp_base */
871 0, /* tp_dict */
872 0, /* tp_descr_get */
873 0, /* tp_descr_set */
874 0, /* tp_dictoffset */
875 0, /* tp_init */
876 0, /* tp_alloc */
877 rangeiter_new, /* tp_new */
Guido van Rossum805365e2007-05-07 22:24:25 +0000878};
879
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000880/* Return number of items in range (lo, hi, step). step != 0
881 * required. The result always fits in an unsigned long.
Guido van Rossum805365e2007-05-07 22:24:25 +0000882 */
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000883static unsigned long
Benjamin Petersona1864f32010-11-20 23:05:39 +0000884get_len_of_range(long lo, long hi, long step)
885{
Guido van Rossum805365e2007-05-07 22:24:25 +0000886 /* -------------------------------------------------------------
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000887 If step > 0 and lo >= hi, or step < 0 and lo <= hi, the range is empty.
888 Else for step > 0, if n values are in the range, the last one is
Guido van Rossum805365e2007-05-07 22:24:25 +0000889 lo + (n-1)*step, which must be <= hi-1. Rearranging,
890 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
891 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
892 the RHS is non-negative and so truncation is the same as the
893 floor. Letting M be the largest positive long, the worst case
894 for the RHS numerator is hi=M, lo=-M-1, and then
895 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000896 precision to compute the RHS exactly. The analysis for step < 0
897 is similar.
Guido van Rossum805365e2007-05-07 22:24:25 +0000898 ---------------------------------------------------------------*/
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000899 assert(step != 0);
900 if (step > 0 && lo < hi)
901 return 1UL + (hi - 1UL - lo) / step;
902 else if (step < 0 && lo > hi)
903 return 1UL + (lo - 1UL - hi) / (0UL - step);
904 else
905 return 0UL;
Guido van Rossum805365e2007-05-07 22:24:25 +0000906}
907
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000908/* Initialize a rangeiter object. If the length of the rangeiter object
909 is not representable as a C long, OverflowError is raised. */
910
Guido van Rossum805365e2007-05-07 22:24:25 +0000911static PyObject *
Nick Coghlan37ee8502010-12-03 14:26:13 +0000912fast_range_iter(long start, long stop, long step)
Benjamin Petersona1864f32010-11-20 23:05:39 +0000913{
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000914 rangeiterobject *it = PyObject_New(rangeiterobject, &PyRangeIter_Type);
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000915 unsigned long ulen;
Guido van Rossum805365e2007-05-07 22:24:25 +0000916 if (it == NULL)
917 return NULL;
918 it->start = start;
919 it->step = step;
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000920 ulen = get_len_of_range(start, stop, step);
921 if (ulen > (unsigned long)LONG_MAX) {
Benjamin Peterson36fbb732009-11-16 00:34:25 +0000922 Py_DECREF(it);
Mark Dickinsond550c9a2009-11-15 09:57:26 +0000923 PyErr_SetString(PyExc_OverflowError,
924 "range too large to represent as a range_iterator");
925 return NULL;
926 }
927 it->len = (long)ulen;
Guido van Rossum805365e2007-05-07 22:24:25 +0000928 it->index = 0;
929 return (PyObject *)it;
930}
931
932static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +0000933rangeiter_new(PyTypeObject *type, PyObject *args, PyObject *kw)
934{
Guido van Rossum805365e2007-05-07 22:24:25 +0000935 long start, stop, step;
936
937 if (!_PyArg_NoKeywords("rangeiter()", kw))
938 return NULL;
939
940 if (!PyArg_ParseTuple(args, "lll;rangeiter() requires 3 int arguments",
941 &start, &stop, &step))
942 return NULL;
943
Nick Coghlan37ee8502010-12-03 14:26:13 +0000944 return fast_range_iter(start, stop, step);
945}
946
947typedef struct {
948 PyObject_HEAD
949 PyObject *index;
950 PyObject *start;
951 PyObject *step;
952 PyObject *len;
953} longrangeiterobject;
954
955static PyObject *
956longrangeiter_len(longrangeiterobject *r, PyObject *no_args)
957{
958 return PyNumber_Subtract(r->len, r->index);
Guido van Rossum805365e2007-05-07 22:24:25 +0000959}
960
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000961static PyObject *
962longrangeiter_reduce(longrangeiterobject *r)
963{
964 PyObject *product, *stop=NULL;
965 PyObject *range;
966
967 /* create a range object for pickling. Must calculate the "stop" value */
968 product = PyNumber_Multiply(r->len, r->step);
969 if (product == NULL)
970 return NULL;
971 stop = PyNumber_Add(r->start, product);
972 Py_DECREF(product);
973 if (stop == NULL)
974 return NULL;
975 Py_INCREF(r->start);
976 Py_INCREF(r->step);
977 range = (PyObject*)make_range_object(&PyRange_Type,
978 r->start, stop, r->step);
979 if (range == NULL) {
980 Py_DECREF(r->start);
981 Py_DECREF(stop);
982 Py_DECREF(r->step);
983 return NULL;
984 }
985
986 /* return the result */
Antoine Pitroua7013882012-04-05 00:04:20 +0200987 return Py_BuildValue("N(N)O", _PyObject_GetBuiltin("iter"), range, r->index);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +0000988}
989
990static PyObject *
991longrangeiter_setstate(longrangeiterobject *r, PyObject *state)
992{
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +0000993 int cmp;
994
995 /* clip the value */
996 PyObject *zero = PyLong_FromLong(0);
997 if (zero == NULL)
998 return NULL;
999 cmp = PyObject_RichCompareBool(state, zero, Py_LT);
1000 if (cmp > 0) {
1001 Py_CLEAR(r->index);
1002 r->index = zero;
1003 Py_RETURN_NONE;
1004 }
1005 Py_DECREF(zero);
1006 if (cmp < 0)
1007 return NULL;
1008
1009 cmp = PyObject_RichCompareBool(r->len, state, Py_LT);
1010 if (cmp < 0)
1011 return NULL;
1012 if (cmp > 0)
1013 state = r->len;
1014
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001015 Py_CLEAR(r->index);
1016 r->index = state;
1017 Py_INCREF(r->index);
1018 Py_RETURN_NONE;
1019}
1020
Guido van Rossum805365e2007-05-07 22:24:25 +00001021static PyMethodDef longrangeiter_methods[] = {
1022 {"__length_hint__", (PyCFunction)longrangeiter_len, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001024 {"__reduce__", (PyCFunction)longrangeiter_reduce, METH_NOARGS,
1025 reduce_doc},
1026 {"__setstate__", (PyCFunction)longrangeiter_setstate, METH_O,
1027 setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 {NULL, NULL} /* sentinel */
Guido van Rossum805365e2007-05-07 22:24:25 +00001029};
1030
1031static void
Benjamin Petersona1864f32010-11-20 23:05:39 +00001032longrangeiter_dealloc(longrangeiterobject *r)
1033{
Guido van Rossum805365e2007-05-07 22:24:25 +00001034 Py_XDECREF(r->index);
Guido van Rossum317e7742007-05-08 15:18:31 +00001035 Py_XDECREF(r->start);
1036 Py_XDECREF(r->step);
1037 Py_XDECREF(r->len);
Amaury Forgeot d'Arcb7f17e42007-11-15 20:52:21 +00001038 PyObject_Del(r);
Guido van Rossum805365e2007-05-07 22:24:25 +00001039}
1040
1041static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +00001042longrangeiter_next(longrangeiterobject *r)
1043{
Guido van Rossum805365e2007-05-07 22:24:25 +00001044 PyObject *one, *product, *new_index, *result;
1045 if (PyObject_RichCompareBool(r->index, r->len, Py_LT) != 1)
1046 return NULL;
1047
1048 one = PyLong_FromLong(1);
1049 if (!one)
1050 return NULL;
1051
Guido van Rossum805365e2007-05-07 22:24:25 +00001052 new_index = PyNumber_Add(r->index, one);
1053 Py_DECREF(one);
Benjamin Peterson36fbb732009-11-16 00:34:25 +00001054 if (!new_index)
1055 return NULL;
1056
1057 product = PyNumber_Multiply(r->index, r->step);
1058 if (!product) {
1059 Py_DECREF(new_index);
Guido van Rossum805365e2007-05-07 22:24:25 +00001060 return NULL;
1061 }
1062
1063 result = PyNumber_Add(r->start, product);
1064 Py_DECREF(product);
1065 if (result) {
1066 Py_DECREF(r->index);
1067 r->index = new_index;
1068 }
Benjamin Peterson36fbb732009-11-16 00:34:25 +00001069 else {
1070 Py_DECREF(new_index);
1071 }
Guido van Rossum805365e2007-05-07 22:24:25 +00001072
1073 return result;
1074}
1075
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001076PyTypeObject PyLongRangeIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1078 "longrange_iterator", /* tp_name */
1079 sizeof(longrangeiterobject), /* tp_basicsize */
1080 0, /* tp_itemsize */
1081 /* methods */
1082 (destructor)longrangeiter_dealloc, /* tp_dealloc */
1083 0, /* tp_print */
1084 0, /* tp_getattr */
1085 0, /* tp_setattr */
1086 0, /* tp_reserved */
1087 0, /* tp_repr */
1088 0, /* tp_as_number */
1089 0, /* tp_as_sequence */
1090 0, /* tp_as_mapping */
1091 0, /* tp_hash */
1092 0, /* tp_call */
1093 0, /* tp_str */
1094 PyObject_GenericGetAttr, /* tp_getattro */
1095 0, /* tp_setattro */
1096 0, /* tp_as_buffer */
1097 Py_TPFLAGS_DEFAULT, /* tp_flags */
1098 0, /* tp_doc */
1099 0, /* tp_traverse */
1100 0, /* tp_clear */
1101 0, /* tp_richcompare */
1102 0, /* tp_weaklistoffset */
1103 PyObject_SelfIter, /* tp_iter */
1104 (iternextfunc)longrangeiter_next, /* tp_iternext */
1105 longrangeiter_methods, /* tp_methods */
1106 0,
Raymond Hettinger48165d42002-06-05 20:08:48 +00001107};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001108
1109static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +00001110range_iter(PyObject *seq)
1111{
Guido van Rossum805365e2007-05-07 22:24:25 +00001112 rangeobject *r = (rangeobject *)seq;
1113 longrangeiterobject *it;
Martin v. Löwis84451042007-12-20 22:57:23 +00001114 long lstart, lstop, lstep;
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001115 PyObject *int_it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001116
Guido van Rossum805365e2007-05-07 22:24:25 +00001117 assert(PyRange_Check(seq));
Martin v. Löwis84451042007-12-20 22:57:23 +00001118
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001119 /* If all three fields and the length convert to long, use the int
1120 * version */
Martin v. Löwis84451042007-12-20 22:57:23 +00001121 lstart = PyLong_AsLong(r->start);
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001122 if (lstart == -1 && PyErr_Occurred()) {
1123 PyErr_Clear();
1124 goto long_range;
Martin v. Löwis84451042007-12-20 22:57:23 +00001125 }
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001126 lstop = PyLong_AsLong(r->stop);
1127 if (lstop == -1 && PyErr_Occurred()) {
1128 PyErr_Clear();
1129 goto long_range;
1130 }
1131 lstep = PyLong_AsLong(r->step);
1132 if (lstep == -1 && PyErr_Occurred()) {
1133 PyErr_Clear();
1134 goto long_range;
1135 }
Nick Coghlan37ee8502010-12-03 14:26:13 +00001136 int_it = fast_range_iter(lstart, lstop, lstep);
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001137 if (int_it == NULL && PyErr_ExceptionMatches(PyExc_OverflowError)) {
1138 PyErr_Clear();
1139 goto long_range;
1140 }
1141 return (PyObject *)int_it;
1142
1143 long_range:
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001144 it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type);
Guido van Rossum805365e2007-05-07 22:24:25 +00001145 if (it == NULL)
1146 return NULL;
Guido van Rossum317e7742007-05-08 15:18:31 +00001147
1148 /* Do all initialization here, so we can DECREF on failure. */
Guido van Rossum805365e2007-05-07 22:24:25 +00001149 it->start = r->start;
Guido van Rossum317e7742007-05-08 15:18:31 +00001150 it->step = r->step;
Nick Coghlan37ee8502010-12-03 14:26:13 +00001151 it->len = r->length;
Guido van Rossum317e7742007-05-08 15:18:31 +00001152 Py_INCREF(it->start);
1153 Py_INCREF(it->step);
Nick Coghlan37ee8502010-12-03 14:26:13 +00001154 Py_INCREF(it->len);
Guido van Rossum317e7742007-05-08 15:18:31 +00001155
Guido van Rossum805365e2007-05-07 22:24:25 +00001156 it->index = PyLong_FromLong(0);
1157 if (!it->index)
1158 goto create_failure;
1159
Guido van Rossum805365e2007-05-07 22:24:25 +00001160 return (PyObject *)it;
1161
1162create_failure:
Guido van Rossum317e7742007-05-08 15:18:31 +00001163 Py_DECREF(it);
Guido van Rossum805365e2007-05-07 22:24:25 +00001164 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001165}
1166
1167static PyObject *
Benjamin Petersona1864f32010-11-20 23:05:39 +00001168range_reverse(PyObject *seq)
1169{
Guido van Rossum805365e2007-05-07 22:24:25 +00001170 rangeobject *range = (rangeobject*) seq;
1171 longrangeiterobject *it;
Nick Coghlan37ee8502010-12-03 14:26:13 +00001172 PyObject *one, *sum, *diff, *product;
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001173 long lstart, lstop, lstep, new_start, new_stop;
1174 unsigned long ulen;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001175
Guido van Rossum805365e2007-05-07 22:24:25 +00001176 assert(PyRange_Check(seq));
Martin v. Löwis84451042007-12-20 22:57:23 +00001177
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001178 /* reversed(range(start, stop, step)) can be expressed as
1179 range(start+(n-1)*step, start-step, -step), where n is the number of
1180 integers in the range.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001181
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001182 If each of start, stop, step, -step, start-step, and the length
1183 of the iterator is representable as a C long, use the int
1184 version. This excludes some cases where the reversed range is
1185 representable as a range_iterator, but it's good enough for
1186 common cases and it makes the checks simple. */
1187
1188 lstart = PyLong_AsLong(range->start);
1189 if (lstart == -1 && PyErr_Occurred()) {
1190 PyErr_Clear();
1191 goto long_range;
1192 }
1193 lstop = PyLong_AsLong(range->stop);
1194 if (lstop == -1 && PyErr_Occurred()) {
1195 PyErr_Clear();
1196 goto long_range;
1197 }
1198 lstep = PyLong_AsLong(range->step);
1199 if (lstep == -1 && PyErr_Occurred()) {
1200 PyErr_Clear();
1201 goto long_range;
1202 }
1203 /* check for possible overflow of -lstep */
1204 if (lstep == LONG_MIN)
1205 goto long_range;
1206
1207 /* check for overflow of lstart - lstep:
1208
1209 for lstep > 0, need only check whether lstart - lstep < LONG_MIN.
1210 for lstep < 0, need only check whether lstart - lstep > LONG_MAX
1211
1212 Rearrange these inequalities as:
1213
1214 lstart - LONG_MIN < lstep (lstep > 0)
1215 LONG_MAX - lstart < -lstep (lstep < 0)
1216
1217 and compute both sides as unsigned longs, to avoid the
1218 possibility of undefined behaviour due to signed overflow. */
1219
1220 if (lstep > 0) {
1221 if ((unsigned long)lstart - LONG_MIN < (unsigned long)lstep)
1222 goto long_range;
1223 }
1224 else {
1225 if (LONG_MAX - (unsigned long)lstart < 0UL - lstep)
1226 goto long_range;
1227 }
1228
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001229 ulen = get_len_of_range(lstart, lstop, lstep);
1230 if (ulen > (unsigned long)LONG_MAX)
1231 goto long_range;
1232
1233 new_stop = lstart - lstep;
1234 new_start = (long)(new_stop + ulen * lstep);
Nick Coghlan37ee8502010-12-03 14:26:13 +00001235 return fast_range_iter(new_start, new_stop, -lstep);
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001236
1237long_range:
Christian Heimesa22e8bd2007-11-29 22:35:39 +00001238 it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type);
Guido van Rossum805365e2007-05-07 22:24:25 +00001239 if (it == NULL)
1240 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001241
Guido van Rossum805365e2007-05-07 22:24:25 +00001242 /* start + (len - 1) * step */
Nick Coghlan37ee8502010-12-03 14:26:13 +00001243 it->len = range->length;
1244 Py_INCREF(it->len);
Benjamin Peterson36fbb732009-11-16 00:34:25 +00001245
Guido van Rossum805365e2007-05-07 22:24:25 +00001246 one = PyLong_FromLong(1);
1247 if (!one)
1248 goto create_failure;
1249
Nick Coghlan37ee8502010-12-03 14:26:13 +00001250 diff = PyNumber_Subtract(it->len, one);
Guido van Rossum805365e2007-05-07 22:24:25 +00001251 Py_DECREF(one);
1252 if (!diff)
1253 goto create_failure;
1254
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001255 product = PyNumber_Multiply(diff, range->step);
1256 Py_DECREF(diff);
Guido van Rossum805365e2007-05-07 22:24:25 +00001257 if (!product)
1258 goto create_failure;
1259
1260 sum = PyNumber_Add(range->start, product);
1261 Py_DECREF(product);
1262 it->start = sum;
1263 if (!it->start)
1264 goto create_failure;
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001265
Guido van Rossum805365e2007-05-07 22:24:25 +00001266 it->step = PyNumber_Negative(range->step);
Benjamin Peterson36fbb732009-11-16 00:34:25 +00001267 if (!it->step)
Mark Dickinsond550c9a2009-11-15 09:57:26 +00001268 goto create_failure;
Guido van Rossum805365e2007-05-07 22:24:25 +00001269
1270 it->index = PyLong_FromLong(0);
Benjamin Peterson36fbb732009-11-16 00:34:25 +00001271 if (!it->index)
1272 goto create_failure;
Guido van Rossum805365e2007-05-07 22:24:25 +00001273
1274 return (PyObject *)it;
1275
1276create_failure:
Benjamin Peterson36fbb732009-11-16 00:34:25 +00001277 Py_DECREF(it);
Guido van Rossum805365e2007-05-07 22:24:25 +00001278 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001279}