Mercurial > cpython-lru_cache-weakref
annotate Objects/rangeobject.c @ 33526:175eee09cb98 legacy-trunk
Raymond reminded me to use DSU key
| author | Skip Montanaro <skip@pobox.com> |
|---|---|
| date | Mon, 20 Sep 2004 16:43:30 +0000 |
| parents | c81ed079576f |
| children | 97c97194e64b 624e9635c3ad |
| rev | line source |
|---|---|
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 /* Range object implementation */ |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
3 #include "Python.h" |
|
18436
9653272f036f
Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents:
18391
diff
changeset
|
4 |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 typedef struct { |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
6 PyObject_HEAD |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 long start; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 long step; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 long len; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 } rangeobject; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 |
|
33047
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
12 /* XXX PyRange_New should be deprecated. It's not documented. It's not |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
13 * used in the core. Its error-checking is akin to Swiss cheese: accepts |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
14 * step == 0; accepts len < 0; ignores that (len - 1) * step may overflow; |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
15 * raises a baffling "integer addition" exception if it thinks the last |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
16 * item is "too big"; and doesn't compute whether "last item is too big" |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
17 * correctly even if the multiplication doesn't overflow. |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
18 */ |
|
18391
aadd99830531
Rip out the fancy behaviors of xrange that nobody uses: repeat, slice,
Guido van Rossum <guido@python.org>
parents:
15890
diff
changeset
|
19 PyObject * |
|
18436
9653272f036f
Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents:
18391
diff
changeset
|
20 PyRange_New(long start, long len, long step, int reps) |
|
15890
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
21 { |
|
23361
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
22 rangeobject *obj; |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 |
|
23361
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
24 if (reps != 1) { |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
25 PyErr_SetString(PyExc_ValueError, |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
26 "PyRange_New's 'repetitions' argument must be 1"); |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
27 return NULL; |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
28 } |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
29 |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
30 obj = PyObject_New(rangeobject, &PyRange_Type); |
|
15562
74ee661581b6
Test for NULL returned from PyObject_NEW().
Guido van Rossum <guido@python.org>
parents:
15390
diff
changeset
|
31 if (obj == NULL) |
|
74ee661581b6
Test for NULL returned from PyObject_NEW().
Guido van Rossum <guido@python.org>
parents:
15390
diff
changeset
|
32 return NULL; |
|
74ee661581b6
Test for NULL returned from PyObject_NEW().
Guido van Rossum <guido@python.org>
parents:
15390
diff
changeset
|
33 |
|
23361
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
34 if (len == 0) { |
|
15890
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
35 start = 0; |
|
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
36 len = 0; |
|
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
37 step = 1; |
|
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
38 } |
|
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
39 else { |
|
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
40 long last = start + (len - 1) * step; |
|
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
41 if ((step > 0) ? |
|
33046
67d25217bc7f
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32897
diff
changeset
|
42 (last > (PyInt_GetMax() - step)) : |
|
18436
9653272f036f
Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents:
18391
diff
changeset
|
43 (last < (-1 - PyInt_GetMax() - step))) { |
|
15890
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
44 PyErr_SetString(PyExc_OverflowError, |
|
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
45 "integer addition"); |
| 32897 | 46 Py_DECREF(obj); |
|
15890
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
47 return NULL; |
|
33046
67d25217bc7f
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32897
diff
changeset
|
48 } |
|
15890
7cbe45d79ab5
SF patch #103158 by Greg Ball: Don't do unsafe arithmetic in xrange
Guido van Rossum <guido@python.org>
parents:
15562
diff
changeset
|
49 } |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
50 obj->start = start; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
51 obj->len = len; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
52 obj->step = step; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
54 return (PyObject *) obj; |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
55 } |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
56 |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
57 /* Return number of items in range/xrange (lo, hi, step). step > 0 |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
58 * required. Return a value < 0 if & only if the true value is too |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
59 * large to fit in a signed long. |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
60 */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
61 static long |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
62 get_len_of_range(long lo, long hi, long step) |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
63 { |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
64 /* ------------------------------------------------------------- |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
65 If lo >= hi, the range is empty. |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
66 Else if n values are in the range, the last one is |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
67 lo + (n-1)*step, which must be <= hi-1. Rearranging, |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
68 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
69 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
70 the RHS is non-negative and so truncation is the same as the |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
71 floor. Letting M be the largest positive long, the worst case |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
72 for the RHS numerator is hi=M, lo=-M-1, and then |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
73 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
74 precision to compute the RHS exactly. |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
75 ---------------------------------------------------------------*/ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
76 long n = 0; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
77 if (lo < hi) { |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
78 unsigned long uhi = (unsigned long)hi; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
79 unsigned long ulo = (unsigned long)lo; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
80 unsigned long diff = uhi - ulo - 1; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
81 n = (long)(diff / (unsigned long)step + 1); |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
82 } |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
83 return n; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
84 } |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
85 |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
86 static PyObject * |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
87 range_new(PyTypeObject *type, PyObject *args, PyObject *kw) |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
88 { |
|
33047
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
89 rangeobject *obj; |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
90 long ilow = 0, ihigh = 0, istep = 1; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
91 long n; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
92 |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
93 if (PyTuple_Size(args) <= 1) { |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
94 if (!PyArg_ParseTuple(args, |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
95 "l;xrange() requires 1-3 int arguments", |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
96 &ihigh)) |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
97 return NULL; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
98 } |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
99 else { |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
100 if (!PyArg_ParseTuple(args, |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
101 "ll|l;xrange() requires 1-3 int arguments", |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
102 &ilow, &ihigh, &istep)) |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
103 return NULL; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
104 } |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
105 if (istep == 0) { |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
106 PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero"); |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
107 return NULL; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
108 } |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
109 if (istep > 0) |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
110 n = get_len_of_range(ilow, ihigh, istep); |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
111 else |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
112 n = get_len_of_range(ihigh, ilow, -istep); |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
113 if (n < 0) { |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
114 PyErr_SetString(PyExc_OverflowError, |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
115 "xrange() result has too many items"); |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
116 return NULL; |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
117 } |
|
33047
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
118 |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
119 obj = PyObject_New(rangeobject, &PyRange_Type); |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
120 if (obj == NULL) |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
121 return NULL; |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
122 obj->start = ilow; |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
123 obj->len = n; |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
124 obj->step = istep; |
|
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
125 return (PyObject *) obj; |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
126 } |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
127 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23702
diff
changeset
|
128 PyDoc_STRVAR(range_doc, |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
129 "xrange([start,] stop[, step]) -> xrange object\n\ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
130 \n\ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
131 Like range(), but instead of returning a list, returns an object that\n\ |
|
26592
0c646baeec58
Update comments about the performance of xrange().
Raymond Hettinger <python@rcn.com>
parents:
26097
diff
changeset
|
132 generates the numbers in the range on demand. For looping, this is \n\ |
|
0c646baeec58
Update comments about the performance of xrange().
Raymond Hettinger <python@rcn.com>
parents:
26097
diff
changeset
|
133 slightly faster than range() and more memory efficient."); |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
134 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
135 static PyObject * |
|
13458
7908ec855665
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
136 range_item(rangeobject *r, int i) |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
137 { |
|
23361
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
138 if (i < 0 || i >= r->len) { |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
139 PyErr_SetString(PyExc_IndexError, |
|
9828
80150f9c8c41
Use 'xrange', not 'range', in error messages. Reported by Nathan Sullivan.
Guido van Rossum <guido@python.org>
parents:
5396
diff
changeset
|
140 "xrange object index out of range"); |
|
23361
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
141 return NULL; |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
142 } |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
143 return PyInt_FromLong(r->start + (i % r->len) * r->step); |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
144 } |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
145 |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
146 static int |
|
13458
7908ec855665
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
147 range_length(rangeobject *r) |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
148 { |
|
25208
2490cf7e68a4
Untested code for 64-bit platforms. range_length() is declared as int
Guido van Rossum <guido@python.org>
parents:
24280
diff
changeset
|
149 #if LONG_MAX != INT_MAX |
|
2490cf7e68a4
Untested code for 64-bit platforms. range_length() is declared as int
Guido van Rossum <guido@python.org>
parents:
24280
diff
changeset
|
150 if (r->len > INT_MAX) { |
|
2490cf7e68a4
Untested code for 64-bit platforms. range_length() is declared as int
Guido van Rossum <guido@python.org>
parents:
24280
diff
changeset
|
151 PyErr_SetString(PyExc_ValueError, |
|
2490cf7e68a4
Untested code for 64-bit platforms. range_length() is declared as int
Guido van Rossum <guido@python.org>
parents:
24280
diff
changeset
|
152 "xrange object size cannot be reported"); |
|
2490cf7e68a4
Untested code for 64-bit platforms. range_length() is declared as int
Guido van Rossum <guido@python.org>
parents:
24280
diff
changeset
|
153 return -1; |
|
2490cf7e68a4
Untested code for 64-bit platforms. range_length() is declared as int
Guido van Rossum <guido@python.org>
parents:
24280
diff
changeset
|
154 } |
|
2490cf7e68a4
Untested code for 64-bit platforms. range_length() is declared as int
Guido van Rossum <guido@python.org>
parents:
24280
diff
changeset
|
155 #endif |
|
2490cf7e68a4
Untested code for 64-bit platforms. range_length() is declared as int
Guido van Rossum <guido@python.org>
parents:
24280
diff
changeset
|
156 return (int)(r->len); |
|
1444
f2d04054c934
* rangeobject.[ch], bltinmodule.c: incorporate new version of range
Guido van Rossum <guido@python.org>
parents:
1387
diff
changeset
|
157 } |
|
f2d04054c934
* rangeobject.[ch], bltinmodule.c: incorporate new version of range
Guido van Rossum <guido@python.org>
parents:
1387
diff
changeset
|
158 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
159 static PyObject * |
|
13458
7908ec855665
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
160 range_repr(rangeobject *r) |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
161 { |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
162 PyObject *rtn; |
|
33046
67d25217bc7f
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32897
diff
changeset
|
163 |
|
13848
dd042f5a8fa2
Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents:
13847
diff
changeset
|
164 if (r->start == 0 && r->step == 1) |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
165 rtn = PyString_FromFormat("xrange(%ld)", |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
166 r->start + r->len * r->step); |
|
13848
dd042f5a8fa2
Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents:
13847
diff
changeset
|
167 |
|
dd042f5a8fa2
Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents:
13847
diff
changeset
|
168 else if (r->step == 1) |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
169 rtn = PyString_FromFormat("xrange(%ld, %ld)", |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
170 r->start, |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
171 r->start + r->len * r->step); |
|
13848
dd042f5a8fa2
Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents:
13847
diff
changeset
|
172 |
|
dd042f5a8fa2
Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents:
13847
diff
changeset
|
173 else |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
174 rtn = PyString_FromFormat("xrange(%ld, %ld, %ld)", |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
175 r->start, |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
176 r->start + r->len * r->step, |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
177 r->step); |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
19301
diff
changeset
|
178 return rtn; |
|
18436
9653272f036f
Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents:
18391
diff
changeset
|
179 } |
|
9653272f036f
Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents:
18391
diff
changeset
|
180 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
181 static PySequenceMethods range_as_sequence = { |
|
23361
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
182 (inquiry)range_length, /* sq_length */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
183 0, /* sq_concat */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
184 0, /* sq_repeat */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
185 (intargfunc)range_item, /* sq_item */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
186 0, /* sq_slice */ |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
187 }; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
188 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24260
diff
changeset
|
189 static PyObject * range_iter(PyObject *seq); |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
190 static PyObject * range_reverse(PyObject *seq); |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
191 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
192 PyDoc_STRVAR(reverse_doc, |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
193 "Returns a reverse iterator."); |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
194 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
195 static PyMethodDef range_methods[] = { |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
196 {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
197 {NULL, NULL} /* sentinel */ |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
198 }; |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
199 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
200 PyTypeObject PyRange_Type = { |
|
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
201 PyObject_HEAD_INIT(&PyType_Type) |
|
23361
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
202 0, /* Number of items for varobject */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
203 "xrange", /* Name of this type */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
204 sizeof(rangeobject), /* Basic object size */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
205 0, /* Item size for varobject */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
206 (destructor)PyObject_Del, /* tp_dealloc */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
207 0, /* tp_print */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
208 0, /* tp_getattr */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
209 0, /* tp_setattr */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
210 0, /* tp_compare */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
211 (reprfunc)range_repr, /* tp_repr */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
212 0, /* tp_as_number */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
213 &range_as_sequence, /* tp_as_sequence */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
214 0, /* tp_as_mapping */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
215 0, /* tp_hash */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
216 0, /* tp_call */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
217 0, /* tp_str */ |
|
26097
e526365ddccd
Restore attribute access so that the following work again:
Raymond Hettinger <python@rcn.com>
parents:
25208
diff
changeset
|
218 PyObject_GenericGetAttr, /* tp_getattro */ |
|
23361
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
219 0, /* tp_setattro */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
220 0, /* tp_as_buffer */ |
|
aee8f16f2774
Remove old deprecated features from the xrange object.
Fred Drake <fdrake@acm.org>
parents:
23348
diff
changeset
|
221 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
222 range_doc, /* tp_doc */ |
|
23398
956d038b1dd2
Patch #551410: Implement tp_getiter.
Martin v. Löwis <martin@v.loewis.de>
parents:
23361
diff
changeset
|
223 0, /* tp_traverse */ |
|
956d038b1dd2
Patch #551410: Implement tp_getiter.
Martin v. Löwis <martin@v.loewis.de>
parents:
23361
diff
changeset
|
224 0, /* tp_clear */ |
|
956d038b1dd2
Patch #551410: Implement tp_getiter.
Martin v. Löwis <martin@v.loewis.de>
parents:
23361
diff
changeset
|
225 0, /* tp_richcompare */ |
|
956d038b1dd2
Patch #551410: Implement tp_getiter.
Martin v. Löwis <martin@v.loewis.de>
parents:
23361
diff
changeset
|
226 0, /* tp_weaklistoffset */ |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
227 (getiterfunc)range_iter, /* tp_iter */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
228 0, /* tp_iternext */ |
|
33046
67d25217bc7f
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32897
diff
changeset
|
229 range_methods, /* tp_methods */ |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
230 0, /* tp_members */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
231 0, /* tp_getset */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
232 0, /* tp_base */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
233 0, /* tp_dict */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
234 0, /* tp_descr_get */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
235 0, /* tp_descr_set */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
236 0, /* tp_dictoffset */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
237 0, /* tp_init */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
238 0, /* tp_alloc */ |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
239 range_new, /* tp_new */ |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
240 }; |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
241 |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
242 /*********************** Xrange Iterator **************************/ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
243 |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
244 typedef struct { |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
245 PyObject_HEAD |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
246 long index; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
247 long start; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
248 long step; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
249 long len; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
250 } rangeiterobject; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
251 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24260
diff
changeset
|
252 static PyTypeObject Pyrangeiter_Type; |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
253 |
|
23702
d4f6e2adde48
Pyrangeiter_Type && range_iter should be static
Neal Norwitz <nnorwitz@gmail.com>
parents:
23695
diff
changeset
|
254 static PyObject * |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
255 range_iter(PyObject *seq) |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
256 { |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
257 rangeiterobject *it; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
258 |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
259 if (!PyRange_Check(seq)) { |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
260 PyErr_BadInternalCall(); |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
261 return NULL; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
262 } |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
263 it = PyObject_New(rangeiterobject, &Pyrangeiter_Type); |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
264 if (it == NULL) |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
265 return NULL; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
266 it->index = 0; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
267 it->start = ((rangeobject *)seq)->start; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
268 it->step = ((rangeobject *)seq)->step; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
269 it->len = ((rangeobject *)seq)->len; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
270 return (PyObject *)it; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
271 } |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
272 |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
273 static PyObject * |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
274 range_reverse(PyObject *seq) |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
275 { |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
276 rangeiterobject *it; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
277 long start, step, len; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
278 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
279 if (!PyRange_Check(seq)) { |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
280 PyErr_BadInternalCall(); |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
281 return NULL; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
282 } |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
283 it = PyObject_New(rangeiterobject, &Pyrangeiter_Type); |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
284 if (it == NULL) |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
285 return NULL; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
286 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
287 start = ((rangeobject *)seq)->start; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
288 step = ((rangeobject *)seq)->step; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
289 len = ((rangeobject *)seq)->len; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
290 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
291 it->index = 0; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
292 it->start = start + (len-1) * step; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
293 it->step = -step; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
294 it->len = len; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
295 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
296 return (PyObject *)it; |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
297 } |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
298 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
299 static PyObject * |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
300 rangeiter_next(rangeiterobject *r) |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
301 { |
|
33046
67d25217bc7f
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32897
diff
changeset
|
302 if (r->index < r->len) |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
303 return PyInt_FromLong(r->start + (r->index++) * r->step); |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
304 return NULL; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
305 } |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
306 |
|
31635
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
307 static int |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
308 rangeiter_len(rangeiterobject *r) |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
309 { |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
310 return r->len - r->index; |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
311 } |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
312 |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
313 static PySequenceMethods rangeiter_as_sequence = { |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
314 (inquiry)rangeiter_len, /* sq_length */ |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
315 0, /* sq_concat */ |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
316 }; |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
317 |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
318 |
|
23702
d4f6e2adde48
Pyrangeiter_Type && range_iter should be static
Neal Norwitz <nnorwitz@gmail.com>
parents:
23695
diff
changeset
|
319 static PyTypeObject Pyrangeiter_Type = { |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
320 PyObject_HEAD_INIT(&PyType_Type) |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
321 0, /* ob_size */ |
|
23702
d4f6e2adde48
Pyrangeiter_Type && range_iter should be static
Neal Norwitz <nnorwitz@gmail.com>
parents:
23695
diff
changeset
|
322 "rangeiterator", /* tp_name */ |
|
d4f6e2adde48
Pyrangeiter_Type && range_iter should be static
Neal Norwitz <nnorwitz@gmail.com>
parents:
23695
diff
changeset
|
323 sizeof(rangeiterobject), /* tp_basicsize */ |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
324 0, /* tp_itemsize */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
325 /* methods */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
326 (destructor)PyObject_Del, /* tp_dealloc */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
327 0, /* tp_print */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
328 0, /* tp_getattr */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
329 0, /* tp_setattr */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
330 0, /* tp_compare */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
331 0, /* tp_repr */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
332 0, /* tp_as_number */ |
|
31635
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
333 &rangeiter_as_sequence, /* tp_as_sequence */ |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
334 0, /* tp_as_mapping */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
335 0, /* tp_hash */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
336 0, /* tp_call */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
337 0, /* tp_str */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
338 PyObject_GenericGetAttr, /* tp_getattro */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
339 0, /* tp_setattro */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
340 0, /* tp_as_buffer */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
341 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
342 0, /* tp_doc */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
343 0, /* tp_traverse */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
344 0, /* tp_clear */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
345 0, /* tp_richcompare */ |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
346 0, /* tp_weaklistoffset */ |
|
28320
fd5ef7003469
Renamed PyObject_GenericGetIter to PyObject_SelfIter
Raymond Hettinger <python@rcn.com>
parents:
28308
diff
changeset
|
347 PyObject_SelfIter, /* tp_iter */ |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
348 (iternextfunc)rangeiter_next, /* tp_iternext */ |
|
24260
6aa2d09e32c1
Remove the next() method -- one is supplied automatically by
Guido van Rossum <guido@python.org>
parents:
23832
diff
changeset
|
349 0, /* tp_methods */ |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
350 }; |
