annotate Objects/sliceobject.c @ 66978:aed2bbafa550 3.1

Blocked revisions 87324 via svnmerge ........ r87324 | r.david.murray | 2010-12-16 14:08:51 -0500 (Thu, 16 Dec 2010) | 9 lines #10719: restore messages generated on invalid compileall args Before the introduction of filename arguments to compileall it gave semi useful messages about not being able to 'list' names that weren't valid directories. This fix restores that behavior. In addition to the test for this case, the patch also adds a test for the default behavior of compileall when no arguments are provided, and fixes a bug in one of the previously added tests. ........
author R. David Murray <rdmurray@bitdance.com>
date Thu, 16 Dec 2010 19:10:16 +0000
parents f197407bdba2
children f7bd28b3c683
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /*
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 Written by Jim Hugunin and Chris Chase.
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
4403
3b3f7c3f6da2 Ellipses -> Ellipsis rename (the dictionary really says that it should
Guido van Rossum <guido@python.org>
parents: 3861
diff changeset
4 This includes both the singular ellipsis object and slice objects.
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 Guido, feel free to do whatever you want in the way of copyrights
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 for this file.
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 */
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
9
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
10 /*
4403
3b3f7c3f6da2 Ellipses -> Ellipsis rename (the dictionary really says that it should
Guido van Rossum <guido@python.org>
parents: 3861
diff changeset
11 Py_Ellipsis encodes the '...' rubber index token. It is similar to
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 the Py_NoneStruct in that there is no way to create other objects of
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 this type and there is exactly one in existence.
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 */
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 #include "Python.h"
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17080
diff changeset
17 #include "structmember.h"
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
18
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 static PyObject *
13458
7908ec855665 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
20 ellipsis_repr(PyObject *op)
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
22 return PyUnicode_FromString("Ellipsis");
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 }
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
24
53368
b5e2bcbbfa74 Merged revisions 71757 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 51271
diff changeset
25 PyTypeObject PyEllipsis_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
26 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
27 "ellipsis", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
28 0, /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
29 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
30 0, /*never called*/ /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
31 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
32 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
33 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
34 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
35 ellipsis_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
36 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
37 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
38 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
39 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
40 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
41 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
42 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
43 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
44 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
45 Py_TPFLAGS_DEFAULT, /* tp_flags */
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 };
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
4403
3b3f7c3f6da2 Ellipses -> Ellipsis rename (the dictionary really says that it should
Guido van Rossum <guido@python.org>
parents: 3861
diff changeset
48 PyObject _Py_EllipsisObject = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
49 _PyObject_EXTRA_INIT
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
50 1, &PyEllipsis_Type
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 };
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
52
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
53
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 /* Slice object implementation
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
55
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 start, stop, and step are python objects with None indicating no
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 index is present.
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 */
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
59
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 PyObject *
13458
7908ec855665 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
61 PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
63 PySliceObject *obj = PyObject_New(PySliceObject, &PySlice_Type);
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
65 if (obj == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
66 return NULL;
15563
35e8a29e5488 Test for NULL returned from PyObject_NEW().
Guido van Rossum <guido@python.org>
parents: 13458
diff changeset
67
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
68 if (step == NULL) step = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
69 Py_INCREF(step);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
70 if (start == NULL) start = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
71 Py_INCREF(start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
72 if (stop == NULL) stop = Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
73 Py_INCREF(stop);
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
74
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
75 obj->step = step;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
76 obj->start = start;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
77 obj->stop = stop;
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
78
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
79 return (PyObject *) obj;
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 }
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
81
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
82 PyObject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
83 _PySlice_FromIndices(Py_ssize_t istart, Py_ssize_t istop)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
84 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
85 PyObject *start, *end, *slice;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
86 start = PyLong_FromSsize_t(istart);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
87 if (!start)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
88 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
89 end = PyLong_FromSsize_t(istop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
90 if (!end) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
91 Py_DECREF(start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
92 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
93 }
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
94
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
95 slice = PySlice_New(start, end, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
96 Py_DECREF(start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
97 Py_DECREF(end);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
98 return slice;
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
99 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36501
diff changeset
100
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35450
diff changeset
102 PySlice_GetIndices(PySliceObject *r, Py_ssize_t length,
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35450
diff changeset
103 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
105 /* XXX support long ints */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
106 if (r->step == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
107 *step = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
108 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
109 if (!PyLong_Check(r->step)) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
110 *step = PyLong_AsSsize_t(r->step);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
111 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
112 if (r->start == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
113 *start = *step < 0 ? length-1 : 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
114 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
115 if (!PyLong_Check(r->start)) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
116 *start = PyLong_AsSsize_t(r->start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
117 if (*start < 0) *start += length;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
118 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
119 if (r->stop == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
120 *stop = *step < 0 ? -1 : length;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
121 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
122 if (!PyLong_Check(r->stop)) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
123 *stop = PyLong_AsSsize_t(r->stop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
124 if (*stop < 0) *stop += length;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
125 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
126 if (*stop > length) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
127 if (*start >= length) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
128 if (*step == 0) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
129 return 0;
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 }
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 22978
diff changeset
132 int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 35450
diff changeset
133 PySlice_GetIndicesEx(PySliceObject *r, Py_ssize_t length,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
134 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength)
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 22978
diff changeset
135 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
136 /* this is harder to get right than you might think */
26035
6ed2e23aae45 Some days, I think my comment of
Michael W. Hudson <mwh@python.net>
parents: 25228
diff changeset
137
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
138 Py_ssize_t defstart, defstop;
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 22978
diff changeset
139
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
140 if (r->step == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
141 *step = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
142 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
143 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
144 if (!_PyEval_SliceIndex(r->step, step)) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
145 if (*step == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
146 PyErr_SetString(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
147 "slice step cannot be zero");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
148 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
149 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
150 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 22978
diff changeset
151
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
152 defstart = *step < 0 ? length-1 : 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
153 defstop = *step < 0 ? -1 : length;
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 22978
diff changeset
154
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
155 if (r->start == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
156 *start = defstart;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
157 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
158 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
159 if (!_PyEval_SliceIndex(r->start, start)) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
160 if (*start < 0) *start += length;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
161 if (*start < 0) *start = (*step < 0) ? -1 : 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
162 if (*start >= length)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
163 *start = (*step < 0) ? length - 1 : length;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
164 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 22978
diff changeset
165
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
166 if (r->stop == Py_None) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
167 *stop = defstop;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
168 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
169 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
170 if (!_PyEval_SliceIndex(r->stop, stop)) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
171 if (*stop < 0) *stop += length;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
172 if (*stop < 0) *stop = (*step < 0) ? -1 : 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
173 if (*stop >= length)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
174 *stop = (*step < 0) ? length - 1 : length;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
175 }
26035
6ed2e23aae45 Some days, I think my comment of
Michael W. Hudson <mwh@python.net>
parents: 25228
diff changeset
176
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
177 if ((*step < 0 && *stop >= *start)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
178 || (*step > 0 && *start >= *stop)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
179 *slicelength = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
180 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
181 else if (*step < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
182 *slicelength = (*stop-*start+1)/(*step)+1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
183 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
184 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
185 *slicelength = (*stop-*start-1)/(*step)+1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
186 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 22978
diff changeset
187
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
188 return 0;
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 22978
diff changeset
189 }
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 22978
diff changeset
190
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
191 static PyObject *
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
192 slice_new(PyTypeObject *type, PyObject *args, PyObject *kw)
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
193 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
194 PyObject *start, *stop, *step;
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
195
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
196 start = stop = step = NULL;
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
197
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
198 if (!_PyArg_NoKeywords("slice()", kw))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
199 return NULL;
35450
97c97194e64b Disallow keyword arguments for type constructors that don't use them
Georg Brandl <georg@python.org>
parents: 30332
diff changeset
200
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
201 if (!PyArg_UnpackTuple(args, "slice", 1, 3, &start, &stop, &step))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
202 return NULL;
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
203
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
204 /* This swapping of stop and start is to maintain similarity with
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
205 range(). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
206 if (stop == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
207 stop = start;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
208 start = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
209 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
210 return PySlice_New(start, stop, step);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
211 }
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
212
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
213 PyDoc_STRVAR(slice_doc,
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
214 "slice([start,] stop[, step])\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
215 \n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
216 Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).");
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 23780
diff changeset
217
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 static void
13458
7908ec855665 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
219 slice_dealloc(PySliceObject *r)
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
221 Py_DECREF(r->step);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
222 Py_DECREF(r->start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
223 Py_DECREF(r->stop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
224 PyObject_Del(r);
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 }
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
226
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 static PyObject *
13458
7908ec855665 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 12576
diff changeset
228 slice_repr(PySliceObject *r)
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
230 return PyUnicode_FromFormat("slice(%R, %R, %R)", r->start, r->stop, r->step);
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 }
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
232
20012
3faabf54b8b8 Add optional docstrings to member descriptors. For backwards
Guido van Rossum <guido@python.org>
parents: 18933
diff changeset
233 static PyMemberDef slice_members[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
234 {"start", T_OBJECT, offsetof(PySliceObject, start), READONLY},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
235 {"stop", T_OBJECT, offsetof(PySliceObject, stop), READONLY},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
236 {"step", T_OBJECT, offsetof(PySliceObject, step), READONLY},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
237 {0}
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 17080
diff changeset
238 };
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
239
24319
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
240 static PyObject*
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
241 slice_indices(PySliceObject* self, PyObject* len)
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
242 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
243 Py_ssize_t ilen, start, stop, step, slicelength;
24319
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
244
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
245 ilen = PyNumber_AsSsize_t(len, PyExc_OverflowError);
24319
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
246
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
247 if (ilen == -1 && PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
248 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
249 }
24319
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
250
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
251 if (PySlice_GetIndicesEx(self, ilen, &start, &stop,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
252 &step, &slicelength) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
253 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
254 }
24319
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
255
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
256 return Py_BuildValue("(nnn)", start, stop, step);
24319
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
257 }
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
258
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
259 PyDoc_STRVAR(slice_indices_doc,
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
260 "S.indices(len) -> (start, stop, stride)\n\
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
261 \n\
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
262 Assuming a sequence of length len, calculate the start and stop\n\
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
263 indices, and the stride length of the extended slice described by\n\
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
264 S. Out of bounds indices are clipped in a manner consistent with the\n\
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
265 handling of normal slices.");
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
266
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
267 static PyObject *
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
268 slice_reduce(PySliceObject* self)
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
269 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
270 return Py_BuildValue("O(OOO)", Py_TYPE(self), self->start, self->stop, self->step);
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
271 }
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
272
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
273 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 39644
diff changeset
274
24319
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
275 static PyMethodDef slice_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
276 {"indices", (PyCFunction)slice_indices,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
277 METH_O, slice_indices_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
278 {"__reduce__", (PyCFunction)slice_reduce,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
279 METH_NOARGS, reduce_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
280 {NULL, NULL}
24319
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
281 };
c43466f7dae8 A few days ago, Guido said (in the thread "[Python-Dev] Python
Michael W. Hudson <mwh@python.net>
parents: 23868
diff changeset
282
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
283 static PyObject *
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
284 slice_richcompare(PyObject *v, PyObject *w, int op)
17080
52cb0c5fdf23 SF patch #408326 by Robin Thomas: slice objects comparable, not
Guido van Rossum <guido@python.org>
parents: 15563
diff changeset
285 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
286 PyObject *t1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
287 PyObject *t2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
288 PyObject *res;
17080
52cb0c5fdf23 SF patch #408326 by Robin Thomas: slice objects comparable, not
Guido van Rossum <guido@python.org>
parents: 15563
diff changeset
289
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
290 if (!PySlice_Check(v) || !PySlice_Check(w)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
291 Py_INCREF(Py_NotImplemented);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
292 return Py_NotImplemented;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
293 }
42955
30511068d3d4 Fix buglet in sliceobjects, they were not returning Py_NotImplemented when
Thomas Wouters <thomas@python.org>
parents: 42334
diff changeset
294
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
295 if (v == w) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
296 /* XXX Do we really need this shortcut?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
297 There's a unit test for it, but is that fair? */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
298 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
299 case Py_EQ:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
300 case Py_LE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
301 case Py_GE:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
302 res = Py_True;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
303 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
304 default:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
305 res = Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
306 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
307 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
308 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
309 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
310 }
17080
52cb0c5fdf23 SF patch #408326 by Robin Thomas: slice objects comparable, not
Guido van Rossum <guido@python.org>
parents: 15563
diff changeset
311
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
312 t1 = PyTuple_New(3);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
313 t2 = PyTuple_New(3);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
314 if (t1 == NULL || t2 == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
315 return NULL;
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
316
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
317 PyTuple_SET_ITEM(t1, 0, ((PySliceObject *)v)->start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
318 PyTuple_SET_ITEM(t1, 1, ((PySliceObject *)v)->stop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
319 PyTuple_SET_ITEM(t1, 2, ((PySliceObject *)v)->step);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
320 PyTuple_SET_ITEM(t2, 0, ((PySliceObject *)w)->start);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
321 PyTuple_SET_ITEM(t2, 1, ((PySliceObject *)w)->stop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
322 PyTuple_SET_ITEM(t2, 2, ((PySliceObject *)w)->step);
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
323
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
324 res = PyObject_RichCompare(t1, t2, op);
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
325
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
326 PyTuple_SET_ITEM(t1, 0, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
327 PyTuple_SET_ITEM(t1, 1, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
328 PyTuple_SET_ITEM(t1, 2, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
329 PyTuple_SET_ITEM(t2, 0, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
330 PyTuple_SET_ITEM(t2, 1, NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
331 PyTuple_SET_ITEM(t2, 2, NULL);
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
332
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
333 Py_DECREF(t1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
334 Py_DECREF(t2);
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39610
diff changeset
335
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
336 return res;
17080
52cb0c5fdf23 SF patch #408326 by Robin Thomas: slice objects comparable, not
Guido van Rossum <guido@python.org>
parents: 15563
diff changeset
337 }
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
338
30332
6b84802c9524 SF bug #800796: Difference between hash() and __hash__()
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
339 static long
6b84802c9524 SF bug #800796: Difference between hash() and __hash__()
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
340 slice_hash(PySliceObject *v)
6b84802c9524 SF bug #800796: Difference between hash() and __hash__()
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
341 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
342 PyErr_SetString(PyExc_TypeError, "unhashable type");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
343 return -1L;
30332
6b84802c9524 SF bug #800796: Difference between hash() and __hash__()
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
344 }
6b84802c9524 SF bug #800796: Difference between hash() and __hash__()
Raymond Hettinger <python@rcn.com>
parents: 26818
diff changeset
345
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 PyTypeObject PySlice_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
347 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
348 "slice", /* Name of this type */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
349 sizeof(PySliceObject), /* Basic object size */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
350 0, /* Item size for varobject */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
351 (destructor)slice_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
352 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
353 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
354 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
355 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
356 (reprfunc)slice_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
357 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
358 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
359 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
360 (hashfunc)slice_hash, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
361 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
362 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
363 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
364 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
365 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
366 Py_TPFLAGS_DEFAULT, /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
367 slice_doc, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
368 0, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
369 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
370 slice_richcompare, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
371 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
372 0, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
373 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
374 slice_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
375 slice_members, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
376 0, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
377 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
378 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
379 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
380 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
381 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
382 0, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
383 0, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 53368
diff changeset
384 slice_new, /* tp_new */
3837
2b2efa48f28d Added sliceobject.c
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 };