Mercurial > cpython-lru_cache-weakref
annotate Objects/rangeobject.c @ 66410:dcb60bf26dce
information on Issue #9846
| author | Łukasz Langa <lukasz@langa.pl> |
|---|---|
| date | Tue, 23 Nov 2010 00:19:53 +0000 |
| parents | acd962824819 |
| children | 78216263425d |
| 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 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
5 /* Support objects whose length is > PY_SSIZE_T_MAX. |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
6 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
7 This could be sped up for small PyLongs if they fit in an Py_ssize_t. |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
8 This only matters on Win64. Though we could use PY_LONG_LONG which |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
9 would presumably help perf. |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
10 */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
11 |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 typedef struct { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
13 PyObject_HEAD |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
14 PyObject *start; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
15 PyObject *stop; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
16 PyObject *step; |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 } rangeobject; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
18 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
19 /* Helper function for validating step. Always returns a new reference or |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
20 NULL on error. |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
21 */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
22 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
23 validate_step(PyObject *step) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
24 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
25 /* No step specified, use a step of 1. */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
26 if (!step) |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
44061
diff
changeset
|
27 return PyLong_FromLong(1); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
28 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
29 step = PyNumber_Index(step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
30 if (step) { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
31 Py_ssize_t istep = PyNumber_AsSsize_t(step, NULL); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
32 if (istep == -1 && PyErr_Occurred()) { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
33 /* Ignore OverflowError, we know the value isn't 0. */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
34 PyErr_Clear(); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
35 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
36 else if (istep == 0) { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
37 PyErr_SetString(PyExc_ValueError, |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
38 "range() arg 3 must not be zero"); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
39 Py_CLEAR(step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
40 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
41 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
42 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
43 return step; |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
44 } |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
45 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
46 /* XXX(nnorwitz): should we error check if the user passes any empty ranges? |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
47 range(-10) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
48 range(0, -5) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
49 range(0, 5, -1) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
50 */ |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
51 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
52 range_new(PyTypeObject *type, PyObject *args, PyObject *kw) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
53 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
54 rangeobject *obj = NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
55 PyObject *start = NULL, *stop = NULL, *step = NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
56 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
57 if (!_PyArg_NoKeywords("range()", kw)) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
58 return NULL; |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
59 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
60 if (PyTuple_Size(args) <= 1) { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
61 if (!PyArg_UnpackTuple(args, "range", 1, 1, &stop)) |
|
54726
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
62 return NULL; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
63 stop = PyNumber_Index(stop); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
64 if (!stop) |
|
54726
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
65 return NULL; |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
44061
diff
changeset
|
66 start = PyLong_FromLong(0); |
|
54726
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
67 if (!start) { |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
68 Py_DECREF(stop); |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
69 return NULL; |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
70 } |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
44061
diff
changeset
|
71 step = PyLong_FromLong(1); |
|
54726
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
72 if (!step) { |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
73 Py_DECREF(stop); |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
74 Py_DECREF(start); |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
75 return NULL; |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
76 } |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
77 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
78 else { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
79 if (!PyArg_UnpackTuple(args, "range", 2, 3, |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
80 &start, &stop, &step)) |
|
54726
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
81 return NULL; |
|
35449
1fdfd0130e28
Disallow keyword arguments for type constructors that don't use them.
Georg Brandl <georg@python.org>
parents:
34087
diff
changeset
|
82 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
83 /* Convert borrowed refs to owned refs */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
84 start = PyNumber_Index(start); |
|
54726
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
85 if (!start) |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
86 return NULL; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
87 stop = PyNumber_Index(stop); |
|
54726
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
88 if (!stop) { |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
89 Py_DECREF(start); |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
90 return NULL; |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
91 } |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
92 step = validate_step(step); /* Caution, this can clear exceptions */ |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
93 if (!step) { |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
94 Py_DECREF(start); |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
95 Py_DECREF(stop); |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
96 return NULL; |
|
75c4d3bc6cc8
Backport 73392: Fix SystemError and ref counting issues.
Raymond Hettinger <python@rcn.com>
parents:
51271
diff
changeset
|
97 } |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
98 } |
|
33047
c81ed079576f
Bug 1003935: xrange overflows
Tim Peters <tim.peters@gmail.com>
parents:
33046
diff
changeset
|
99 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
100 obj = PyObject_New(rangeobject, &PyRange_Type); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
101 if (obj == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
102 goto Fail; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
103 obj->start = start; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
104 obj->stop = stop; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
105 obj->step = step; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
106 return (PyObject *) obj; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
107 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
108 Fail: |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
109 Py_XDECREF(start); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
110 Py_XDECREF(stop); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
111 Py_XDECREF(step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
112 return NULL; |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
113 } |
|
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
114 |
|
23832
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23702
diff
changeset
|
115 PyDoc_STRVAR(range_doc, |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
116 "range([start,] stop[, step]) -> range object\n\ |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
117 \n\ |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
118 Returns an iterator that generates the numbers in the range on demand."); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
119 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
120 static void |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
121 range_dealloc(rangeobject *r) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
122 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
123 Py_DECREF(r->start); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
124 Py_DECREF(r->stop); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
125 Py_DECREF(r->step); |
|
43867
f444e259341a
Found another memory leak in longrangeiter. And redo the previous correction
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43861
diff
changeset
|
126 PyObject_Del(r); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
127 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
128 |
|
55589
546aa134d773
Merged revisions 73656,73658,73663,73666 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54847
diff
changeset
|
129 /* Return number of items in range (lo, hi, step) as a PyLong object, |
|
546aa134d773
Merged revisions 73656,73658,73663,73666 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54847
diff
changeset
|
130 * when arguments are PyLong objects. Arguments MUST return 1 with |
|
546aa134d773
Merged revisions 73656,73658,73663,73666 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54847
diff
changeset
|
131 * PyLong_Check(). Return NULL when there is an error. |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
132 */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
133 static PyObject* |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
134 range_length_obj(rangeobject *r) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
135 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
136 /* ------------------------------------------------------------- |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
137 Algorithm is equal to that of get_len_of_range(), but it operates |
| 54846 | 138 on PyObjects (which are assumed to be PyLong objects). |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
139 ---------------------------------------------------------------*/ |
|
51244
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47536
diff
changeset
|
140 int cmp_result; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
141 PyObject *lo, *hi; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
142 PyObject *step = NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
143 PyObject *diff = NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
144 PyObject *one = NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
145 PyObject *tmp1 = NULL, *tmp2 = NULL, *result; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
146 /* holds sub-expression evaluations */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
147 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
148 PyObject *zero = PyLong_FromLong(0); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
149 if (zero == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
150 return NULL; |
|
51244
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47536
diff
changeset
|
151 cmp_result = PyObject_RichCompareBool(r->step, zero, Py_GT); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
152 Py_DECREF(zero); |
|
51244
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47536
diff
changeset
|
153 if (cmp_result == -1) |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
154 return NULL; |
|
23695
6266f1bd1ab9
Skip Montanaro's patch, SF 559833, exposing xrange type in builtins.
Raymond Hettinger <python@rcn.com>
parents:
23693
diff
changeset
|
155 |
|
51244
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47536
diff
changeset
|
156 if (cmp_result == 1) { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
157 lo = r->start; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
158 hi = r->stop; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
159 step = r->step; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
160 Py_INCREF(step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
161 } else { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
162 lo = r->stop; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
163 hi = r->start; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
164 step = PyNumber_Negative(r->step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
165 if (!step) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
166 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
167 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
168 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
169 /* if (lo >= hi), return length of 0. */ |
|
51244
e9675d72e3e3
Merged revisions 69181 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
47536
diff
changeset
|
170 if (PyObject_RichCompareBool(lo, hi, Py_GE) == 1) { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
171 Py_XDECREF(step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
172 return PyLong_FromLong(0); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
173 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
174 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
175 if ((one = PyLong_FromLong(1L)) == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
176 goto Fail; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
177 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
178 if ((tmp1 = PyNumber_Subtract(hi, lo)) == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
179 goto Fail; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
180 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
181 if ((diff = PyNumber_Subtract(tmp1, one)) == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
182 goto Fail; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
183 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
184 if ((tmp2 = PyNumber_FloorDivide(diff, step)) == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
185 goto Fail; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
186 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
187 if ((result = PyNumber_Add(tmp2, one)) == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
188 goto Fail; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
189 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
190 Py_DECREF(tmp2); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
191 Py_DECREF(diff); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
192 Py_DECREF(step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
193 Py_DECREF(tmp1); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
194 Py_DECREF(one); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
195 return result; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
196 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
197 Fail: |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
198 Py_XDECREF(tmp2); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
199 Py_XDECREF(diff); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
200 Py_XDECREF(step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
201 Py_XDECREF(tmp1); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
202 Py_XDECREF(one); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
203 return NULL; |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
204 } |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
205 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
206 static Py_ssize_t |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
207 range_length(rangeobject *r) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
208 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
209 PyObject *len = range_length_obj(r); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
210 Py_ssize_t result = -1; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
211 if (len) { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
212 result = PyLong_AsSsize_t(len); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
213 Py_DECREF(len); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
214 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
215 return result; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
216 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
217 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
218 /* range(...)[x] is necessary for: seq[:] = range(...) */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
219 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
220 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
221 range_item(rangeobject *r, Py_ssize_t i) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
222 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
223 Py_ssize_t len = range_length(r); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
224 PyObject *rem, *incr, *result; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
225 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
226 /* XXX(nnorwitz): should negative indices be supported? */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
227 /* XXX(nnorwitz): should support range[x] where x > PY_SSIZE_T_MAX? */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
228 if (i < 0 || i >= len) { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
229 if (!PyErr_Occurred()) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
230 PyErr_SetString(PyExc_IndexError, |
|
41803
3d3bf27409e6
Rename test_xrange.py to test_range.py and fix the
Walter Dörwald <walter@livinglogic.de>
parents:
41800
diff
changeset
|
231 "range object index out of range"); |
|
46564
2a31bc28c10f
#2689 Fix indentation in Objects/rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
45249
diff
changeset
|
232 return NULL; |
|
2a31bc28c10f
#2689 Fix indentation in Objects/rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
45249
diff
changeset
|
233 } |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
234 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
235 /* XXX(nnorwitz): optimize for short ints. */ |
| 45249 | 236 rem = PyLong_FromSsize_t(i); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
237 if (!rem) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
238 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
239 incr = PyNumber_Multiply(rem, r->step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
240 Py_DECREF(rem); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
241 if (!incr) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
242 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
243 result = PyNumber_Add(r->start, incr); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
244 Py_DECREF(incr); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
245 return result; |
|
1444
f2d04054c934
* rangeobject.[ch], bltinmodule.c: incorporate new version of range
Guido van Rossum <guido@python.org>
parents:
1387
diff
changeset
|
246 } |
|
f2d04054c934
* rangeobject.[ch], bltinmodule.c: incorporate new version of range
Guido van Rossum <guido@python.org>
parents:
1387
diff
changeset
|
247 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
248 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
249 range_repr(rangeobject *r) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
250 { |
|
41800
993f8a9b8ab3
repr(range(10)) now returns 'range(0, 10)' for clarity.
Walter Dörwald <walter@livinglogic.de>
parents:
41785
diff
changeset
|
251 Py_ssize_t istep; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
252 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
253 /* Check for special case values for printing. We don't always |
|
41800
993f8a9b8ab3
repr(range(10)) now returns 'range(0, 10)' for clarity.
Walter Dörwald <walter@livinglogic.de>
parents:
41785
diff
changeset
|
254 need the step value. We don't care about errors |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
255 (it means overflow), so clear the errors. */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
256 istep = PyNumber_AsSsize_t(r->step, NULL); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
257 if (istep != 1 || (istep == -1 && PyErr_Occurred())) { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
258 PyErr_Clear(); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
259 } |
|
13848
dd042f5a8fa2
Boost buffer sizes in the absence of snprintf on Windows.
Tim Peters <tim.peters@gmail.com>
parents:
13847
diff
changeset
|
260 |
|
41800
993f8a9b8ab3
repr(range(10)) now returns 'range(0, 10)' for clarity.
Walter Dörwald <walter@livinglogic.de>
parents:
41785
diff
changeset
|
261 if (istep == 1) |
|
41785
d1c38af065bf
Change range_repr() to use %R for the start/stop/step attributes.
Walter Dörwald <walter@livinglogic.de>
parents:
41769
diff
changeset
|
262 return PyUnicode_FromFormat("range(%R, %R)", r->start, r->stop); |
|
d1c38af065bf
Change range_repr() to use %R for the start/stop/step attributes.
Walter Dörwald <walter@livinglogic.de>
parents:
41769
diff
changeset
|
263 else |
|
d1c38af065bf
Change range_repr() to use %R for the start/stop/step attributes.
Walter Dörwald <walter@livinglogic.de>
parents:
41769
diff
changeset
|
264 return PyUnicode_FromFormat("range(%R, %R, %R)", |
|
d1c38af065bf
Change range_repr() to use %R for the start/stop/step attributes.
Walter Dörwald <walter@livinglogic.de>
parents:
41769
diff
changeset
|
265 r->start, r->stop, r->step); |
|
18436
9653272f036f
Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents:
18391
diff
changeset
|
266 } |
|
9653272f036f
Re-add 'advanced' xrange features, adding DeprecationWarnings as discussed
Thomas Wouters <thomas@python.org>
parents:
18391
diff
changeset
|
267 |
|
47536
33492c241dab
Issue 2582: Fix pickling of range objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46564
diff
changeset
|
268 /* Pickling support */ |
|
33492c241dab
Issue 2582: Fix pickling of range objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46564
diff
changeset
|
269 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
270 range_reduce(rangeobject *r, PyObject *args) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
271 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
272 return Py_BuildValue("(O(OOO))", Py_TYPE(r), |
|
47536
33492c241dab
Issue 2582: Fix pickling of range objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46564
diff
changeset
|
273 r->start, r->stop, r->step); |
|
33492c241dab
Issue 2582: Fix pickling of range objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46564
diff
changeset
|
274 } |
|
33492c241dab
Issue 2582: Fix pickling of range objects.
Alexandre Vassalotti <alexandre@peadrop.com>
parents:
46564
diff
changeset
|
275 |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
276 /* Assumes (PyLong_CheckExact(ob) || PyBool_Check(ob)) */ |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
277 static int |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
278 range_contains_long(rangeobject *r, PyObject *ob) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
279 { |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
280 int cmp1, cmp2, cmp3; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
281 PyObject *tmp1 = NULL; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
282 PyObject *tmp2 = NULL; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
283 PyObject *zero = NULL; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
284 int result = -1; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
285 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
286 zero = PyLong_FromLong(0); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
287 if (zero == NULL) /* MemoryError in int(0) */ |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
288 goto end; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
289 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
290 /* Check if the value can possibly be in the range. */ |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
291 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
292 cmp1 = PyObject_RichCompareBool(r->step, zero, Py_GT); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
293 if (cmp1 == -1) |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
294 goto end; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
295 if (cmp1 == 1) { /* positive steps: start <= ob < stop */ |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
296 cmp2 = PyObject_RichCompareBool(r->start, ob, Py_LE); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
297 cmp3 = PyObject_RichCompareBool(ob, r->stop, Py_LT); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
298 } |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
299 else { /* negative steps: stop < ob <= start */ |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
300 cmp2 = PyObject_RichCompareBool(ob, r->start, Py_LE); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
301 cmp3 = PyObject_RichCompareBool(r->stop, ob, Py_LT); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
302 } |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
303 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
304 if (cmp2 == -1 || cmp3 == -1) /* TypeError */ |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
305 goto end; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
306 if (cmp2 == 0 || cmp3 == 0) { /* ob outside of range */ |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
307 result = 0; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
308 goto end; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
309 } |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
310 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
311 /* Check that the stride does not invalidate ob's membership. */ |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
312 tmp1 = PyNumber_Subtract(ob, r->start); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
313 if (tmp1 == NULL) |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
314 goto end; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
315 tmp2 = PyNumber_Remainder(tmp1, r->step); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
316 if (tmp2 == NULL) |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
317 goto end; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
318 /* result = (int(ob) - start % step) == 0 */ |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
319 result = PyObject_RichCompareBool(tmp2, zero, Py_EQ); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
320 end: |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
321 Py_XDECREF(tmp1); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
322 Py_XDECREF(tmp2); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
323 Py_XDECREF(zero); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
324 return result; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
325 } |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
326 |
|
56192
d599a3f2e72d
Issue #1766304: Optimize membership testing for ranges: 'n in range(...)'
Mark Dickinson <dickinsm@gmail.com>
parents:
55797
diff
changeset
|
327 static int |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
328 range_contains(rangeobject *r, PyObject *ob) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
329 { |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
330 if (PyLong_CheckExact(ob) || PyBool_Check(ob)) |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
331 return range_contains_long(r, ob); |
|
56192
d599a3f2e72d
Issue #1766304: Optimize membership testing for ranges: 'n in range(...)'
Mark Dickinson <dickinsm@gmail.com>
parents:
55797
diff
changeset
|
332 |
|
d599a3f2e72d
Issue #1766304: Optimize membership testing for ranges: 'n in range(...)'
Mark Dickinson <dickinsm@gmail.com>
parents:
55797
diff
changeset
|
333 return (int)_PySequence_IterSearch((PyObject*)r, ob, |
|
d599a3f2e72d
Issue #1766304: Optimize membership testing for ranges: 'n in range(...)'
Mark Dickinson <dickinsm@gmail.com>
parents:
55797
diff
changeset
|
334 PY_ITERSEARCH_CONTAINS); |
|
d599a3f2e72d
Issue #1766304: Optimize membership testing for ranges: 'n in range(...)'
Mark Dickinson <dickinsm@gmail.com>
parents:
55797
diff
changeset
|
335 } |
|
d599a3f2e72d
Issue #1766304: Optimize membership testing for ranges: 'n in range(...)'
Mark Dickinson <dickinsm@gmail.com>
parents:
55797
diff
changeset
|
336 |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
337 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
338 range_count(rangeobject *r, PyObject *ob) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
339 { |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
340 if (PyLong_CheckExact(ob) || PyBool_Check(ob)) { |
|
66330
add7e9721f80
Add error handling in range_count.
Georg Brandl <georg@python.org>
parents:
66329
diff
changeset
|
341 int result = range_contains_long(r, ob); |
|
add7e9721f80
Add error handling in range_count.
Georg Brandl <georg@python.org>
parents:
66329
diff
changeset
|
342 if (result == -1) |
|
add7e9721f80
Add error handling in range_count.
Georg Brandl <georg@python.org>
parents:
66329
diff
changeset
|
343 return NULL; |
|
add7e9721f80
Add error handling in range_count.
Georg Brandl <georg@python.org>
parents:
66329
diff
changeset
|
344 else if (result) |
|
66329
238caaf6852b
count() should return integers #10474
Benjamin Peterson <benjamin@python.org>
parents:
64725
diff
changeset
|
345 return PyLong_FromLong(1); |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
346 else |
|
66329
238caaf6852b
count() should return integers #10474
Benjamin Peterson <benjamin@python.org>
parents:
64725
diff
changeset
|
347 return PyLong_FromLong(0); |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
348 } else { |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
349 Py_ssize_t count; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
350 count = _PySequence_IterSearch((PyObject*)r, ob, PY_ITERSEARCH_COUNT); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
351 if (count == -1) |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
352 return NULL; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
353 return PyLong_FromSsize_t(count); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
354 } |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
355 } |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
356 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
357 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
358 range_index(rangeobject *r, PyObject *ob) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
359 { |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
360 int contains; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
361 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
362 if (!PyLong_CheckExact(ob) && !PyBool_Check(ob)) { |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
363 Py_ssize_t index; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
364 index = _PySequence_IterSearch((PyObject*)r, ob, PY_ITERSEARCH_INDEX); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
365 if (index == -1) |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
366 return NULL; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
367 return PyLong_FromSsize_t(index); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
368 } |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
369 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
370 contains = range_contains_long(r, ob); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
371 if (contains == -1) |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
372 return NULL; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
373 |
|
66331
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
374 if (contains) { |
|
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
375 PyObject *idx, *tmp = PyNumber_Subtract(ob, r->start); |
|
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
376 if (tmp == NULL) |
|
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
377 return NULL; |
|
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
378 /* idx = (ob - r.start) // r.step */ |
|
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
379 idx = PyNumber_FloorDivide(tmp, r->step); |
|
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
380 Py_DECREF(tmp); |
|
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
381 return idx; |
|
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
382 } |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
383 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
384 /* object is not in the range */ |
|
66331
e01237831ad2
code style and simplification
Benjamin Peterson <benjamin@python.org>
parents:
66330
diff
changeset
|
385 PyErr_Format(PyExc_ValueError, "%R is not in range", ob); |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
386 return NULL; |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
387 } |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
388 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
389 static PySequenceMethods range_as_sequence = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
390 (lenfunc)range_length, /* sq_length */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
391 0, /* sq_concat */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
392 0, /* sq_repeat */ |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
393 (ssizeargfunc)range_item, /* sq_item */ |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
394 0, /* sq_slice */ |
|
56192
d599a3f2e72d
Issue #1766304: Optimize membership testing for ranges: 'n in range(...)'
Mark Dickinson <dickinsm@gmail.com>
parents:
55797
diff
changeset
|
395 0, /* sq_ass_item */ |
|
d599a3f2e72d
Issue #1766304: Optimize membership testing for ranges: 'n in range(...)'
Mark Dickinson <dickinsm@gmail.com>
parents:
55797
diff
changeset
|
396 0, /* sq_ass_slice */ |
|
d599a3f2e72d
Issue #1766304: Optimize membership testing for ranges: 'n in range(...)'
Mark Dickinson <dickinsm@gmail.com>
parents:
55797
diff
changeset
|
397 (objobjproc)range_contains, /* sq_contains */ |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 }; |
|
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 |
|
24280
1598a1e473e2
staticforward bites the dust.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24260
diff
changeset
|
400 static PyObject * range_iter(PyObject *seq); |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
401 static PyObject * range_reverse(PyObject *seq); |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
402 |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
403 PyDoc_STRVAR(reverse_doc, |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
404 "Returns a reverse iterator."); |
|
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
405 |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
406 PyDoc_STRVAR(count_doc, |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
407 "rangeobject.count(value) -> integer -- return number of occurrences of value"); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
408 |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
409 PyDoc_STRVAR(index_doc, |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
410 "rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n" |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
411 "Raises ValueError if the value is not present."); |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
412 |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
413 static PyMethodDef range_methods[] = { |
|
64725
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
414 {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
415 {"__reduce__", (PyCFunction)range_reduce, METH_VARARGS}, |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
416 {"count", (PyCFunction)range_count, METH_O, count_doc}, |
|
e2dec9c0d13c
Issue #9213: Add index and count methods to range objects, needed to
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
61466
diff
changeset
|
417 {"index", (PyCFunction)range_index, METH_O, index_doc}, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
418 {NULL, NULL} /* sentinel */ |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
419 }; |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
420 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
4588
diff
changeset
|
421 PyTypeObject PyRange_Type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
422 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
423 "range", /* Name of this type */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
424 sizeof(rangeobject), /* Basic object size */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
425 0, /* Item size for varobject */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
426 (destructor)range_dealloc, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
427 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
428 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
429 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
430 0, /* tp_reserved */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
431 (reprfunc)range_repr, /* tp_repr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
432 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
433 &range_as_sequence, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
434 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
435 0, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
436 0, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
437 0, /* tp_str */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
438 PyObject_GenericGetAttr, /* tp_getattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
439 0, /* tp_setattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
440 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
441 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
442 range_doc, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
443 0, /* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
444 0, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
445 0, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
446 0, /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
447 range_iter, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
448 0, /* tp_iternext */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
449 range_methods, /* tp_methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
450 0, /* tp_members */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
451 0, /* tp_getset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
452 0, /* tp_base */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
453 0, /* tp_dict */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
454 0, /* tp_descr_get */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
455 0, /* tp_descr_set */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
456 0, /* tp_dictoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
457 0, /* tp_init */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
458 0, /* tp_alloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
459 range_new, /* tp_new */ |
|
1369
89e1e5d9ccbf
* compile.[ch]: support for lambda()
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
460 }; |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
461 |
|
41803
3d3bf27409e6
Rename test_xrange.py to test_range.py and fix the
Walter Dörwald <walter@livinglogic.de>
parents:
41800
diff
changeset
|
462 /*********************** range Iterator **************************/ |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
463 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
464 /* There are 2 types of iterators, one for C longs, the other for |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
465 Python longs (ie, PyObjects). This should make iteration fast |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
466 in the normal case, but possible for any numeric value. |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
467 */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
468 |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
469 typedef struct { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
470 PyObject_HEAD |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
471 long index; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
472 long start; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
473 long step; |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
474 long len; |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
475 } rangeiterobject; |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
476 |
|
30865
41c4e143e6e6
Implement and apply PEP 322, reverse iteration
Raymond Hettinger <python@rcn.com>
parents:
28320
diff
changeset
|
477 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
478 rangeiter_next(rangeiterobject *r) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
479 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
480 if (r->index < r->len) |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
481 /* cast to unsigned to avoid possible signed overflow |
|
57267
3ebf907db028
Fix another case of potential signed overflow.
Mark Dickinson <dickinsm@gmail.com>
parents:
57262
diff
changeset
|
482 in intermediate calculations. */ |
|
3ebf907db028
Fix another case of potential signed overflow.
Mark Dickinson <dickinsm@gmail.com>
parents:
57262
diff
changeset
|
483 return PyLong_FromLong((long)(r->start + |
|
3ebf907db028
Fix another case of potential signed overflow.
Mark Dickinson <dickinsm@gmail.com>
parents:
57262
diff
changeset
|
484 (unsigned long)(r->index++) * r->step)); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
485 return NULL; |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
486 } |
|
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
487 |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
488 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
489 rangeiter_len(rangeiterobject *r) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
490 { |
|
44099
f324631462a2
Cleanup: Replaced most PyInt_ aliases with PyLong_ and disabled the aliases in intobject.h
Christian Heimes <christian@cheimes.de>
parents:
44061
diff
changeset
|
491 return PyLong_FromLong(r->len - r->index); |
|
31635
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
492 } |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
493 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
494 typedef struct { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
495 PyObject_HEAD |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
496 PyObject *index; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
497 PyObject *start; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
498 PyObject *step; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
499 PyObject *len; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
500 } longrangeiterobject; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
501 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
502 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
503 longrangeiter_len(longrangeiterobject *r, PyObject *no_args) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
504 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
505 return PyNumber_Subtract(r->len, r->index); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
506 } |
|
41644
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
507 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
508 static PyObject *rangeiter_new(PyTypeObject *, PyObject *args, PyObject *kw); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
509 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
510 PyDoc_STRVAR(length_hint_doc, |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
511 "Private method returning an estimate of len(list(it))."); |
|
35636
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
512 |
|
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35449
diff
changeset
|
513 static PyMethodDef rangeiter_methods[] = { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
514 {"__length_hint__", (PyCFunction)rangeiter_len, METH_NOARGS, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
515 length_hint_doc}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
516 {NULL, NULL} /* sentinel */ |
|
31635
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
517 }; |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
30865
diff
changeset
|
518 |
|
44061
0cc552ab76bd
Added all PyTypeObjects to the appropriate header files.
Christian Heimes <christian@cheimes.de>
parents:
44043
diff
changeset
|
519 PyTypeObject PyRangeIter_Type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
520 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
521 "range_iterator", /* tp_name */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
522 sizeof(rangeiterobject), /* tp_basicsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
523 0, /* tp_itemsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
524 /* methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
525 (destructor)PyObject_Del, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
526 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
527 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
528 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
529 0, /* tp_reserved */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
530 0, /* tp_repr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
531 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
532 0, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
533 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
534 0, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
535 0, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
536 0, /* tp_str */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
537 PyObject_GenericGetAttr, /* tp_getattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
538 0, /* tp_setattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
539 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
540 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
541 0, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
542 0, /* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
543 0, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
544 0, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
545 0, /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
546 PyObject_SelfIter, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
547 (iternextfunc)rangeiter_next, /* tp_iternext */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
548 rangeiter_methods, /* tp_methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
549 0, /* tp_members */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
550 0, /* tp_getset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
551 0, /* tp_base */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
552 0, /* tp_dict */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
553 0, /* tp_descr_get */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
554 0, /* tp_descr_set */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
555 0, /* tp_dictoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
556 0, /* tp_init */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
557 0, /* tp_alloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
558 rangeiter_new, /* tp_new */ |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
559 }; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
560 |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
561 /* Return number of items in range (lo, hi, step). step != 0 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
562 * required. The result always fits in an unsigned long. |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
563 */ |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
564 static unsigned long |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
565 get_len_of_range(long lo, long hi, long step) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
566 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
567 /* ------------------------------------------------------------- |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
568 If step > 0 and lo >= hi, or step < 0 and lo <= hi, the range is empty. |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
569 Else for step > 0, if n values are in the range, the last one is |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
570 lo + (n-1)*step, which must be <= hi-1. Rearranging, |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
571 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
572 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
573 the RHS is non-negative and so truncation is the same as the |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
574 floor. Letting M be the largest positive long, the worst case |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
575 for the RHS numerator is hi=M, lo=-M-1, and then |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
576 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
577 precision to compute the RHS exactly. The analysis for step < 0 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
578 is similar. |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
579 ---------------------------------------------------------------*/ |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
580 assert(step != 0); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
581 if (step > 0 && lo < hi) |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
582 return 1UL + (hi - 1UL - lo) / step; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
583 else if (step < 0 && lo > hi) |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
584 return 1UL + (lo - 1UL - hi) / (0UL - step); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
585 else |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
586 return 0UL; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
587 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
588 |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
589 /* Initialize a rangeiter object. If the length of the rangeiter object |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
590 is not representable as a C long, OverflowError is raised. */ |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
591 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
592 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
593 int_range_iter(long start, long stop, long step) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
594 { |
|
44061
0cc552ab76bd
Added all PyTypeObjects to the appropriate header files.
Christian Heimes <christian@cheimes.de>
parents:
44043
diff
changeset
|
595 rangeiterobject *it = PyObject_New(rangeiterobject, &PyRangeIter_Type); |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
596 unsigned long ulen; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
597 if (it == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
598 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
599 it->start = start; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
600 it->step = step; |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
601 ulen = get_len_of_range(start, stop, step); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
602 if (ulen > (unsigned long)LONG_MAX) { |
|
57286
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
603 Py_DECREF(it); |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
604 PyErr_SetString(PyExc_OverflowError, |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
605 "range too large to represent as a range_iterator"); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
606 return NULL; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
607 } |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
608 it->len = (long)ulen; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
609 it->index = 0; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
610 return (PyObject *)it; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
611 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
612 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
613 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
614 rangeiter_new(PyTypeObject *type, PyObject *args, PyObject *kw) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
615 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
616 long start, stop, step; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
617 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
618 if (!_PyArg_NoKeywords("rangeiter()", kw)) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
619 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
620 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
621 if (!PyArg_ParseTuple(args, "lll;rangeiter() requires 3 int arguments", |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
622 &start, &stop, &step)) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
623 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
624 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
625 return int_range_iter(start, stop, step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
626 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
627 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
628 static PyMethodDef longrangeiter_methods[] = { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
629 {"__length_hint__", (PyCFunction)longrangeiter_len, METH_NOARGS, |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
630 length_hint_doc}, |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
631 {NULL, NULL} /* sentinel */ |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
632 }; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
633 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
634 static void |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
635 longrangeiter_dealloc(longrangeiterobject *r) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
636 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
637 Py_XDECREF(r->index); |
|
41644
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
638 Py_XDECREF(r->start); |
|
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
639 Py_XDECREF(r->step); |
|
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
640 Py_XDECREF(r->len); |
|
43867
f444e259341a
Found another memory leak in longrangeiter. And redo the previous correction
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
43861
diff
changeset
|
641 PyObject_Del(r); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
642 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
643 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
644 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
645 longrangeiter_next(longrangeiterobject *r) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
646 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
647 PyObject *one, *product, *new_index, *result; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
648 if (PyObject_RichCompareBool(r->index, r->len, Py_LT) != 1) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
649 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
650 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
651 one = PyLong_FromLong(1); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
652 if (!one) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
653 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
654 |
|
57286
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
655 new_index = PyNumber_Add(r->index, one); |
|
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
656 Py_DECREF(one); |
|
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
657 if (!new_index) |
|
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
658 return NULL; |
|
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
659 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
660 product = PyNumber_Multiply(r->index, r->step); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
661 if (!product) { |
|
57286
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
662 Py_DECREF(new_index); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
663 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
664 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
665 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
666 result = PyNumber_Add(r->start, product); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
667 Py_DECREF(product); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
668 if (result) { |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
669 Py_DECREF(r->index); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
670 r->index = new_index; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
671 } |
|
57286
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
672 else { |
|
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
673 Py_DECREF(new_index); |
|
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
674 } |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
675 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
676 return result; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
677 } |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
678 |
|
44061
0cc552ab76bd
Added all PyTypeObjects to the appropriate header files.
Christian Heimes <christian@cheimes.de>
parents:
44043
diff
changeset
|
679 PyTypeObject PyLongRangeIter_Type = { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
680 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
681 "longrange_iterator", /* tp_name */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
682 sizeof(longrangeiterobject), /* tp_basicsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
683 0, /* tp_itemsize */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
684 /* methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
685 (destructor)longrangeiter_dealloc, /* tp_dealloc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
686 0, /* tp_print */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
687 0, /* tp_getattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
688 0, /* tp_setattr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
689 0, /* tp_reserved */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
690 0, /* tp_repr */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
691 0, /* tp_as_number */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
692 0, /* tp_as_sequence */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
693 0, /* tp_as_mapping */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
694 0, /* tp_hash */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
695 0, /* tp_call */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
696 0, /* tp_str */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
697 PyObject_GenericGetAttr, /* tp_getattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
698 0, /* tp_setattro */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
699 0, /* tp_as_buffer */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
700 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
701 0, /* tp_doc */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
702 0, /* tp_traverse */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
703 0, /* tp_clear */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
704 0, /* tp_richcompare */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
705 0, /* tp_weaklistoffset */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
706 PyObject_SelfIter, /* tp_iter */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
707 (iternextfunc)longrangeiter_next, /* tp_iternext */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
708 longrangeiter_methods, /* tp_methods */ |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57286
diff
changeset
|
709 0, |
|
23693
8983158e9f11
SF 564601 adding rangeiterobject to make xrange() iterate like range().
Raymond Hettinger <python@rcn.com>
parents:
23664
diff
changeset
|
710 }; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
711 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
712 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
713 range_iter(PyObject *seq) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
714 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
715 rangeobject *r = (rangeobject *)seq; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
716 longrangeiterobject *it; |
|
44366
83ced4177eac
Drop _PyLong_FitsInLong. Fixes #1666.
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
717 long lstart, lstop, lstep; |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
718 PyObject *int_it; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
719 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
720 assert(PyRange_Check(seq)); |
|
44366
83ced4177eac
Drop _PyLong_FitsInLong. Fixes #1666.
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
721 |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
722 /* If all three fields and the length convert to long, use the int |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
723 * version */ |
|
44366
83ced4177eac
Drop _PyLong_FitsInLong. Fixes #1666.
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
724 lstart = PyLong_AsLong(r->start); |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
725 if (lstart == -1 && PyErr_Occurred()) { |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
726 PyErr_Clear(); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
727 goto long_range; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
728 } |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
729 lstop = PyLong_AsLong(r->stop); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
730 if (lstop == -1 && PyErr_Occurred()) { |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
731 PyErr_Clear(); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
732 goto long_range; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
733 } |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
734 lstep = PyLong_AsLong(r->step); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
735 if (lstep == -1 && PyErr_Occurred()) { |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
736 PyErr_Clear(); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
737 goto long_range; |
|
44366
83ced4177eac
Drop _PyLong_FitsInLong. Fixes #1666.
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
738 } |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
739 int_it = int_range_iter(lstart, lstop, lstep); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
740 if (int_it == NULL && PyErr_ExceptionMatches(PyExc_OverflowError)) { |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
741 PyErr_Clear(); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
742 goto long_range; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
743 } |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
744 return (PyObject *)int_it; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
745 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
746 long_range: |
|
44061
0cc552ab76bd
Added all PyTypeObjects to the appropriate header files.
Christian Heimes <christian@cheimes.de>
parents:
44043
diff
changeset
|
747 it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
748 if (it == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
749 return NULL; |
|
41644
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
750 |
|
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
751 /* Do all initialization here, so we can DECREF on failure. */ |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
752 it->start = r->start; |
|
41644
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
753 it->step = r->step; |
|
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
754 Py_INCREF(it->start); |
|
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
755 Py_INCREF(it->step); |
|
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
756 |
|
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
757 it->len = it->index = NULL; |
|
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
758 |
|
54845
f4d84c4f289b
Merged revisions 73547-73548 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54726
diff
changeset
|
759 it->len = range_length_obj(r); |
|
f4d84c4f289b
Merged revisions 73547-73548 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents:
54726
diff
changeset
|
760 if (!it->len) |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
761 goto create_failure; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
762 it->index = PyLong_FromLong(0); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
763 if (!it->index) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
764 goto create_failure; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
765 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
766 return (PyObject *)it; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
767 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
768 create_failure: |
|
41644
9cc4c3f0b580
Merged revisions 55180-55183 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41642
diff
changeset
|
769 Py_DECREF(it); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
770 return NULL; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
771 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
772 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
773 static PyObject * |
|
66335
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
774 range_reverse(PyObject *seq) |
|
acd962824819
pep 7 actually wants the brace on a new line
Benjamin Peterson <benjamin@python.org>
parents:
66331
diff
changeset
|
775 { |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
776 rangeobject *range = (rangeobject*) seq; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
777 longrangeiterobject *it; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
778 PyObject *one, *sum, *diff, *len = NULL, *product; |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
779 long lstart, lstop, lstep, new_start, new_stop; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
780 unsigned long ulen; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
781 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
782 assert(PyRange_Check(seq)); |
|
44366
83ced4177eac
Drop _PyLong_FitsInLong. Fixes #1666.
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
783 |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
784 /* reversed(range(start, stop, step)) can be expressed as |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
785 range(start+(n-1)*step, start-step, -step), where n is the number of |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
786 integers in the range. |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
787 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
788 If each of start, stop, step, -step, start-step, and the length |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
789 of the iterator is representable as a C long, use the int |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
790 version. This excludes some cases where the reversed range is |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
791 representable as a range_iterator, but it's good enough for |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
792 common cases and it makes the checks simple. */ |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
793 |
|
44366
83ced4177eac
Drop _PyLong_FitsInLong. Fixes #1666.
Martin v. Löwis <martin@v.loewis.de>
parents:
44099
diff
changeset
|
794 lstart = PyLong_AsLong(range->start); |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
795 if (lstart == -1 && PyErr_Occurred()) { |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
796 PyErr_Clear(); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
797 goto long_range; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
798 } |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
799 lstop = PyLong_AsLong(range->stop); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
800 if (lstop == -1 && PyErr_Occurred()) { |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
801 PyErr_Clear(); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
802 goto long_range; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
803 } |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
804 lstep = PyLong_AsLong(range->step); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
805 if (lstep == -1 && PyErr_Occurred()) { |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
806 PyErr_Clear(); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
807 goto long_range; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
808 } |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
809 /* check for possible overflow of -lstep */ |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
810 if (lstep == LONG_MIN) |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
811 goto long_range; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
812 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
813 /* check for overflow of lstart - lstep: |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
814 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
815 for lstep > 0, need only check whether lstart - lstep < LONG_MIN. |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
816 for lstep < 0, need only check whether lstart - lstep > LONG_MAX |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
817 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
818 Rearrange these inequalities as: |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
819 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
820 lstart - LONG_MIN < lstep (lstep > 0) |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
821 LONG_MAX - lstart < -lstep (lstep < 0) |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
822 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
823 and compute both sides as unsigned longs, to avoid the |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
824 possibility of undefined behaviour due to signed overflow. */ |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
825 |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
826 if (lstep > 0) { |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
827 if ((unsigned long)lstart - LONG_MIN < (unsigned long)lstep) |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
828 goto long_range; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
829 } |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
830 else { |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
831 if (LONG_MAX - (unsigned long)lstart < 0UL - lstep) |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
832 goto long_range; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
833 } |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
834 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
835 ulen = get_len_of_range(lstart, lstop, lstep); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
836 if (ulen > (unsigned long)LONG_MAX) |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
837 goto long_range; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
838 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
839 new_stop = lstart - lstep; |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
840 new_start = (long)(new_stop + ulen * lstep); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
841 return int_range_iter(new_start, new_stop, -lstep); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
842 |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
843 long_range: |
|
44061
0cc552ab76bd
Added all PyTypeObjects to the appropriate header files.
Christian Heimes <christian@cheimes.de>
parents:
44043
diff
changeset
|
844 it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
845 if (it == NULL) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
846 return NULL; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
847 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
848 /* start + (len - 1) * step */ |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
849 len = range_length_obj(range); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
850 if (!len) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
851 goto create_failure; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
852 |
|
57286
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
853 /* Steal reference to len. */ |
|
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
854 it->len = len; |
|
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
855 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
856 one = PyLong_FromLong(1); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
857 if (!one) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
858 goto create_failure; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
859 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
860 diff = PyNumber_Subtract(len, one); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
861 Py_DECREF(one); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
862 if (!diff) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
863 goto create_failure; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
864 |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
865 product = PyNumber_Multiply(diff, range->step); |
|
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
866 Py_DECREF(diff); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
867 if (!product) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
868 goto create_failure; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
869 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
870 sum = PyNumber_Add(range->start, product); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
871 Py_DECREF(product); |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
872 it->start = sum; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
873 if (!it->start) |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
874 goto create_failure; |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
875 |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
876 it->step = PyNumber_Negative(range->step); |
|
57286
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
877 if (!it->step) |
|
57261
370d218a01bc
Issue #7298: Fix a variety of problems leading to wrong results with
Mark Dickinson <dickinsm@gmail.com>
parents:
56210
diff
changeset
|
878 goto create_failure; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
879 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
880 it->index = PyLong_FromLong(0); |
|
57286
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
881 if (!it->index) |
|
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
882 goto create_failure; |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
883 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
884 return (PyObject *)it; |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
885 |
|
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
886 create_failure: |
|
57286
eb235eb45d32
fix one visible and several possible refleaks in rangeobject.c
Benjamin Peterson <benjamin@python.org>
parents:
57267
diff
changeset
|
887 Py_DECREF(it); |
|
41642
a6eb6acfe04a
Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
37879
diff
changeset
|
888 return NULL; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36501
diff
changeset
|
889 } |
