blob: 60878a43145ae96d7aabc0501e08516f8b8bb337 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Tuple object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Guido van Rossum5ce78f82000-04-21 21:15:05 +00006/* Speed optimization to avoid frequent malloc/free of small tuples */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +00007#ifndef MAXSAVESIZE
Guido van Rossum5ce78f82000-04-21 21:15:05 +00008#define MAXSAVESIZE 20 /* Largest tuple to save on free list */
9#endif
10#ifndef MAXSAVEDTUPLES
11#define MAXSAVEDTUPLES 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000012#endif
13
14#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +000015/* Entries 1 up to MAXSAVESIZE are free lists, entry 0 is the empty
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000016 tuple () of which at most one instance will be allocated.
17*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000018static PyTupleObject *free_tuples[MAXSAVESIZE];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000019static int num_free_tuples[MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000020#endif
21#ifdef COUNT_ALLOCS
22int fast_tuple_allocs;
23int tuple_zero_allocs;
24#endif
25
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026PyObject *
Fred Drakeba096332000-07-09 07:04:36 +000027PyTuple_New(register int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032 return NULL;
33 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000034#if MAXSAVESIZE > 0
Sjoerd Mullender615194a1993-11-01 13:46:50 +000035 if (size == 0 && free_tuples[0]) {
36 op = free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000038#ifdef COUNT_ALLOCS
39 tuple_zero_allocs++;
40#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000042 }
Raymond Hettinger325d1692004-03-15 00:16:34 +000043 if (size < MAXSAVESIZE && (op = free_tuples[size]) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000045 num_free_tuples[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000046#ifdef COUNT_ALLOCS
47 fast_tuple_allocs++;
48#endif
Guido van Rossume3a8e7e2002-08-19 19:26:42 +000049 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000050#ifdef Py_TRACE_REFS
Guido van Rossum68055ce1998-12-11 14:56:38 +000051 op->ob_size = size;
Guido van Rossumb18618d2000-05-03 23:44:39 +000052 op->ob_type = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000053#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000054 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000055 }
56 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000057#endif
58 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000059 int nbytes = size * sizeof(PyObject *);
60 /* Check for overflow */
61 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Neil Schemenauere83c00e2001-08-29 23:54:21 +000062 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
Guido van Rossum5bc51f21999-07-12 23:06:58 +000063 <= 0)
64 {
65 return PyErr_NoMemory();
66 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000067 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000068 if (op == NULL)
Neil Schemenauere83c00e2001-08-29 23:54:21 +000069 return NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000070 }
Neal Norwitz35fc7602002-06-13 21:11:11 +000071 memset(op->ob_item, 0, sizeof(*op->ob_item) * size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000072#if MAXSAVESIZE > 0
73 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000074 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +000075 ++num_free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000077 }
78#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +000079 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000080 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081}
82
83int
Fred Drakeba096332000-07-09 07:04:36 +000084PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 if (!PyTuple_Check(op)) {
87 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 return -1;
89 }
90 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092}
93
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094PyObject *
Fred Drakeba096332000-07-09 07:04:36 +000095PyTuple_GetItem(register PyObject *op, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 if (!PyTuple_Check(op)) {
98 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 return NULL;
100 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
102 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 return NULL;
104 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106}
107
108int
Fred Drakeba096332000-07-09 07:04:36 +0000109PyTuple_SetItem(register PyObject *op, register int i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111 register PyObject *olditem;
112 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000113 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 Py_XDECREF(newitem);
115 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000116 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
119 Py_XDECREF(newitem);
120 PyErr_SetString(PyExc_IndexError,
121 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000122 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000125 olditem = *p;
126 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 return 0;
129}
130
Raymond Hettingercb2da432003-10-12 18:24:34 +0000131PyObject *
132PyTuple_Pack(int n, ...)
133{
134 int i;
135 PyObject *o;
136 PyObject *result;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000137 PyObject **items;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000138 va_list vargs;
139
140 va_start(vargs, n);
141 result = PyTuple_New(n);
142 if (result == NULL)
143 return NULL;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000144 items = ((PyTupleObject *)result)->ob_item;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000145 for (i = 0; i < n; i++) {
146 o = va_arg(vargs, PyObject *);
147 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000148 items[i] = o;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000149 }
150 va_end(vargs);
151 return result;
152}
153
154
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155/* Methods */
156
157static void
Fred Drakeba096332000-07-09 07:04:36 +0000158tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159{
160 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000161 register int len = op->ob_size;
Guido van Rossumff413af2002-03-28 20:34:59 +0000162 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000163 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000164 if (len > 0) {
165 i = len;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000166 while (--i >= 0)
167 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000168#if MAXSAVESIZE > 0
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000169 if (len < MAXSAVESIZE &&
170 num_free_tuples[len] < MAXSAVEDTUPLES &&
171 op->ob_type == &PyTuple_Type)
172 {
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000173 op->ob_item[0] = (PyObject *) free_tuples[len];
174 num_free_tuples[len]++;
175 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000176 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000177 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000178#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000179 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000180 op->ob_type->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000181done:
182 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183}
184
Guido van Rossum49e85141991-06-07 22:59:30 +0000185static int
Fred Drakeba096332000-07-09 07:04:36 +0000186tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187{
188 int i;
189 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000190 for (i = 0; i < op->ob_size; i++) {
191 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000194 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 }
196 if (op->ob_size == 1)
197 fprintf(fp, ",");
198 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000199 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200}
201
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000203tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204{
Tim Petersa7259592001-06-16 05:11:17 +0000205 int i, n;
206 PyObject *s, *temp;
207 PyObject *pieces, *result = NULL;
208
209 n = v->ob_size;
210 if (n == 0)
211 return PyString_FromString("()");
212
213 pieces = PyTuple_New(n);
214 if (pieces == NULL)
215 return NULL;
216
217 /* Do repr() on each element. */
218 for (i = 0; i < n; ++i) {
219 s = PyObject_Repr(v->ob_item[i]);
220 if (s == NULL)
221 goto Done;
222 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223 }
Tim Petersa7259592001-06-16 05:11:17 +0000224
225 /* Add "()" decorations to the first and last items. */
226 assert(n > 0);
227 s = PyString_FromString("(");
228 if (s == NULL)
229 goto Done;
230 temp = PyTuple_GET_ITEM(pieces, 0);
231 PyString_ConcatAndDel(&s, temp);
232 PyTuple_SET_ITEM(pieces, 0, s);
233 if (s == NULL)
234 goto Done;
235
236 s = PyString_FromString(n == 1 ? ",)" : ")");
237 if (s == NULL)
238 goto Done;
239 temp = PyTuple_GET_ITEM(pieces, n-1);
240 PyString_ConcatAndDel(&temp, s);
241 PyTuple_SET_ITEM(pieces, n-1, temp);
242 if (temp == NULL)
243 goto Done;
244
245 /* Paste them all together with ", " between. */
246 s = PyString_FromString(", ");
247 if (s == NULL)
248 goto Done;
249 result = _PyString_Join(s, pieces);
250 Py_DECREF(s);
251
252Done:
253 Py_DECREF(pieces);
254 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255}
256
Guido van Rossum9bfef441993-03-29 10:43:31 +0000257static long
Fred Drakeba096332000-07-09 07:04:36 +0000258tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000259{
260 register long x, y;
261 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000263 x = 0x345678L;
264 p = v->ob_item;
265 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000267 if (y == -1)
268 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000269 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000270 }
271 x ^= v->ob_size;
272 if (x == -1)
273 x = -2;
274 return x;
275}
276
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277static int
Fred Drakeba096332000-07-09 07:04:36 +0000278tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279{
280 return a->ob_size;
281}
282
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000283static int
Fred Drakeba096332000-07-09 07:04:36 +0000284tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000285{
286 int i, cmp;
287
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000288 for (i = 0, cmp = 0 ; cmp == 0 && i < a->ob_size; ++i)
Guido van Rossumf77bc622001-01-18 00:00:53 +0000289 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000290 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000291 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000292}
293
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000295tupleitem(register PyTupleObject *a, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296{
297 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000298 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 return NULL;
300 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000302 return a->ob_item[i];
303}
304
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000306tupleslice(register PyTupleObject *a, register int ilow, register int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 register PyTupleObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000309 PyObject **src, **dest;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 register int i;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000311 int len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312 if (ilow < 0)
313 ilow = 0;
314 if (ihigh > a->ob_size)
315 ihigh = a->ob_size;
316 if (ihigh < ilow)
317 ihigh = ilow;
Tim Peters7b07a412001-09-11 19:48:03 +0000318 if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 Py_INCREF(a);
320 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 }
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000322 len = ihigh - ilow;
323 np = (PyTupleObject *)PyTuple_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324 if (np == NULL)
325 return NULL;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000326 src = a->ob_item + ilow;
327 dest = np->ob_item;
328 for (i = 0; i < len; i++) {
329 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000331 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334}
335
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000337PyTuple_GetSlice(PyObject *op, int i, int j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000338{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 if (op == NULL || !PyTuple_Check(op)) {
340 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000341 return NULL;
342 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000344}
345
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000347tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348{
349 register int size;
350 register int i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000351 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 PyTupleObject *np;
353 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000354 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000355 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000356 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357 return NULL;
358 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360 size = a->ob_size + b->ob_size;
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000361 if (size < 0)
362 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000365 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000367 src = a->ob_item;
368 dest = np->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369 for (i = 0; i < a->ob_size; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000370 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000372 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000374 src = b->ob_item;
375 dest = np->ob_item + a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376 for (i = 0; i < b->ob_size; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000377 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000379 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000380 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382#undef b
383}
384
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000386tuplerepeat(PyTupleObject *a, int n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000387{
388 int i, j;
389 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 PyTupleObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000391 PyObject **p, **items;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000392 if (n < 0)
393 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000394 if (a->ob_size == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000395 if (PyTuple_CheckExact(a)) {
396 /* Since tuples are immutable, we can return a shared
397 copy in this case */
398 Py_INCREF(a);
399 return (PyObject *)a;
400 }
401 if (a->ob_size == 0)
402 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000403 }
404 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000405 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000406 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000408 if (np == NULL)
409 return NULL;
410 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000411 items = a->ob_item;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000412 for (i = 0; i < n; i++) {
413 for (j = 0; j < a->ob_size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000414 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000416 p++;
417 }
418 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000420}
421
Jeremy Hylton8caad492000-06-23 14:18:11 +0000422static int
423tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
424{
425 int i, err;
426 PyObject *x;
427
428 for (i = o->ob_size; --i >= 0; ) {
429 x = o->ob_item[i];
430 if (x != NULL) {
431 err = visit(x, arg);
432 if (err)
433 return err;
434 }
435 }
436 return 0;
437}
438
Guido van Rossumf77bc622001-01-18 00:00:53 +0000439static PyObject *
440tuplerichcompare(PyObject *v, PyObject *w, int op)
441{
442 PyTupleObject *vt, *wt;
443 int i;
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000444 int vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000445
446 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
447 Py_INCREF(Py_NotImplemented);
448 return Py_NotImplemented;
449 }
450
451 vt = (PyTupleObject *)v;
452 wt = (PyTupleObject *)w;
453
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000454 vlen = vt->ob_size;
455 wlen = wt->ob_size;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000456
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000457 /* Note: the corresponding code for lists has an "early out" test
458 * here when op is EQ or NE and the lengths differ. That pays there,
459 * but Tim was unable to find any real code where EQ/NE tuple
460 * compares don't have the same length, so testing for it here would
461 * have cost without benefit.
462 */
463
464 /* Search for the first index where items are different.
465 * Note that because tuples are immutable, it's safe to reuse
466 * vlen and wlen across the comparison calls.
467 */
468 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000469 int k = PyObject_RichCompareBool(vt->ob_item[i],
470 wt->ob_item[i], Py_EQ);
471 if (k < 0)
472 return NULL;
473 if (!k)
474 break;
475 }
476
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000477 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000478 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000479 int cmp;
480 PyObject *res;
481 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000482 case Py_LT: cmp = vlen < wlen; break;
483 case Py_LE: cmp = vlen <= wlen; break;
484 case Py_EQ: cmp = vlen == wlen; break;
485 case Py_NE: cmp = vlen != wlen; break;
486 case Py_GT: cmp = vlen > wlen; break;
487 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000488 default: return NULL; /* cannot happen */
489 }
490 if (cmp)
491 res = Py_True;
492 else
493 res = Py_False;
494 Py_INCREF(res);
495 return res;
496 }
497
498 /* We have an item that differs -- shortcuts for EQ/NE */
499 if (op == Py_EQ) {
500 Py_INCREF(Py_False);
501 return Py_False;
502 }
503 if (op == Py_NE) {
504 Py_INCREF(Py_True);
505 return Py_True;
506 }
507
508 /* Compare the final item again using the proper operator */
509 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
510}
511
Jeremy Hylton938ace62002-07-17 16:30:39 +0000512static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000513tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
514
Tim Peters6d6c1a32001-08-02 04:15:00 +0000515static PyObject *
516tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
517{
518 PyObject *arg = NULL;
519 static char *kwlist[] = {"sequence", 0};
520
Guido van Rossumae960af2001-08-30 03:11:59 +0000521 if (type != &PyTuple_Type)
522 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000523 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
524 return NULL;
525
526 if (arg == NULL)
527 return PyTuple_New(0);
528 else
529 return PySequence_Tuple(arg);
530}
531
Guido van Rossumae960af2001-08-30 03:11:59 +0000532static PyObject *
533tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
534{
535 PyObject *tmp, *new, *item;
536 int i, n;
537
538 assert(PyType_IsSubtype(type, &PyTuple_Type));
539 tmp = tuple_new(&PyTuple_Type, args, kwds);
540 if (tmp == NULL)
541 return NULL;
542 assert(PyTuple_Check(tmp));
543 new = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
544 if (new == NULL)
545 return NULL;
546 for (i = 0; i < n; i++) {
547 item = PyTuple_GET_ITEM(tmp, i);
548 Py_INCREF(item);
549 PyTuple_SET_ITEM(new, i, item);
550 }
551 Py_DECREF(tmp);
552 return new;
553}
554
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000555PyDoc_STRVAR(tuple_doc,
Tim Peters1b8ca0d2001-09-02 06:42:25 +0000556"tuple() -> an empty tuple\n"
557"tuple(sequence) -> tuple initialized from sequence's items\n"
558"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000559"If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000560
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561static PySequenceMethods tuple_as_sequence = {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000562 (inquiry)tuplelength, /* sq_length */
563 (binaryfunc)tupleconcat, /* sq_concat */
564 (intargfunc)tuplerepeat, /* sq_repeat */
565 (intargfunc)tupleitem, /* sq_item */
566 (intintargfunc)tupleslice, /* sq_slice */
567 0, /* sq_ass_item */
568 0, /* sq_ass_slice */
569 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570};
571
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000572static PyObject*
573tuplesubscript(PyTupleObject* self, PyObject* item)
574{
575 if (PyInt_Check(item)) {
576 long i = PyInt_AS_LONG(item);
577 if (i < 0)
578 i += PyTuple_GET_SIZE(self);
579 return tupleitem(self, i);
580 }
581 else if (PyLong_Check(item)) {
582 long i = PyLong_AsLong(item);
583 if (i == -1 && PyErr_Occurred())
584 return NULL;
585 if (i < 0)
586 i += PyTuple_GET_SIZE(self);
587 return tupleitem(self, i);
588 }
589 else if (PySlice_Check(item)) {
590 int start, stop, step, slicelength, cur, i;
591 PyObject* result;
592 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000593 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000594
595 if (PySlice_GetIndicesEx((PySliceObject*)item,
596 PyTuple_GET_SIZE(self),
597 &start, &stop, &step, &slicelength) < 0) {
598 return NULL;
599 }
600
601 if (slicelength <= 0) {
602 return PyTuple_New(0);
603 }
604 else {
605 result = PyTuple_New(slicelength);
606
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000607 src = self->ob_item;
608 dest = ((PyTupleObject *)result)->ob_item;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000609 for (cur = start, i = 0; i < slicelength;
610 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000611 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000612 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000613 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000614 }
615
616 return result;
617 }
618 }
619 else {
620 PyErr_SetString(PyExc_TypeError,
621 "tuple indices must be integers");
622 return NULL;
623 }
624}
625
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000626static PyObject *
627tuple_getnewargs(PyTupleObject *v)
628{
629 return Py_BuildValue("(N)", tupleslice(v, 0, v->ob_size));
630
631}
632
633static PyMethodDef tuple_methods[] = {
634 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
635 {NULL, NULL} /* sentinel */
636};
637
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000638static PyMappingMethods tuple_as_mapping = {
639 (inquiry)tuplelength,
640 (binaryfunc)tuplesubscript,
641 0
642};
643
Raymond Hettinger48923c52002-08-09 01:30:17 +0000644static PyObject *tuple_iter(PyObject *seq);
645
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646PyTypeObject PyTuple_Type = {
647 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000648 0,
649 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000650 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000652 (destructor)tupledealloc, /* tp_dealloc */
653 (printfunc)tupleprint, /* tp_print */
654 0, /* tp_getattr */
655 0, /* tp_setattr */
656 0, /* tp_compare */
657 (reprfunc)tuplerepr, /* tp_repr */
658 0, /* tp_as_number */
659 &tuple_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000660 &tuple_as_mapping, /* tp_as_mapping */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000661 (hashfunc)tuplehash, /* tp_hash */
662 0, /* tp_call */
663 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000664 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000665 0, /* tp_setattro */
666 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000667 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
668 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000669 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000670 (traverseproc)tupletraverse, /* tp_traverse */
671 0, /* tp_clear */
672 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673 0, /* tp_weaklistoffset */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000674 tuple_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000676 tuple_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000677 0, /* tp_members */
678 0, /* tp_getset */
679 0, /* tp_base */
680 0, /* tp_dict */
681 0, /* tp_descr_get */
682 0, /* tp_descr_set */
683 0, /* tp_dictoffset */
684 0, /* tp_init */
685 0, /* tp_alloc */
686 tuple_new, /* tp_new */
Neil Schemenauer626d7742002-04-12 03:05:52 +0000687 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000688};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000689
690/* The following function breaks the notion that tuples are immutable:
691 it changes the size of a tuple. We get away with this only if there
692 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000693 as creating a new tuple object and destroying the old one, only more
694 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000695 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000696
697int
Tim Peters4324aa32001-05-28 22:30:08 +0000698_PyTuple_Resize(PyObject **pv, int newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000699{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700 register PyTupleObject *v;
701 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000702 int i;
Guido van Rossumf70590f2001-12-07 20:00:04 +0000703 int oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000704
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 v = (PyTupleObject *) *pv;
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000706 if (v == NULL || v->ob_type != &PyTuple_Type ||
Thomas Wouters6a922372001-05-28 13:11:02 +0000707 (v->ob_size != 0 && v->ob_refcnt != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000708 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000709 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000711 return -1;
712 }
Guido van Rossumf70590f2001-12-07 20:00:04 +0000713 oldsize = v->ob_size;
714 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000715 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000716
Guido van Rossumf70590f2001-12-07 20:00:04 +0000717 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000718 /* Empty tuples are often shared, so we should never
719 resize them in-place even if we do own the only
720 (current) reference */
721 Py_DECREF(v);
722 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000723 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000724 }
725
Guido van Rossum12d12c51993-10-26 17:58:25 +0000726 /* XXX UNREF/NEWREF interface should be more symmetrical */
Tim Peters34592512002-07-11 06:23:50 +0000727 _Py_DEC_REFTOTAL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000728 _PyObject_GC_UNTRACK(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000729 _Py_ForgetReference((PyObject *) v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000730 /* DECREF items deleted by shrinkage */
731 for (i = newsize; i < oldsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000732 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000733 v->ob_item[i] = NULL;
734 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000735 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000736 if (sv == NULL) {
737 *pv = NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000738 PyObject_GC_Del(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000739 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000740 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000741 _Py_NewReference((PyObject *) sv);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000742 /* Zero out items added by growing */
Neal Norwitz35fc7602002-06-13 21:11:11 +0000743 if (newsize > oldsize)
Jeremy Hylton8b47dff2002-06-20 23:13:17 +0000744 memset(&sv->ob_item[oldsize], 0,
745 sizeof(*sv->ob_item) * (newsize - oldsize));
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000746 *pv = (PyObject *) sv;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000747 _PyObject_GC_TRACK(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000748 return 0;
749}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000750
751void
Fred Drakeba096332000-07-09 07:04:36 +0000752PyTuple_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000753{
754#if MAXSAVESIZE > 0
755 int i;
756
757 Py_XDECREF(free_tuples[0]);
758 free_tuples[0] = NULL;
759
760 for (i = 1; i < MAXSAVESIZE; i++) {
761 PyTupleObject *p, *q;
762 p = free_tuples[i];
763 free_tuples[i] = NULL;
764 while (p) {
765 q = p;
766 p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000767 PyObject_GC_Del(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000768 }
769 }
770#endif
771}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000772
773/*********************** Tuple Iterator **************************/
774
775typedef struct {
776 PyObject_HEAD
777 long it_index;
778 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
779} tupleiterobject;
780
781PyTypeObject PyTupleIter_Type;
782
783static PyObject *
784tuple_iter(PyObject *seq)
785{
786 tupleiterobject *it;
787
788 if (!PyTuple_Check(seq)) {
789 PyErr_BadInternalCall();
790 return NULL;
791 }
792 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
793 if (it == NULL)
794 return NULL;
795 it->it_index = 0;
796 Py_INCREF(seq);
797 it->it_seq = (PyTupleObject *)seq;
798 _PyObject_GC_TRACK(it);
799 return (PyObject *)it;
800}
801
802static void
803tupleiter_dealloc(tupleiterobject *it)
804{
805 _PyObject_GC_UNTRACK(it);
806 Py_XDECREF(it->it_seq);
807 PyObject_GC_Del(it);
808}
809
810static int
811tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
812{
813 if (it->it_seq == NULL)
814 return 0;
815 return visit((PyObject *)it->it_seq, arg);
816}
817
Raymond Hettinger48923c52002-08-09 01:30:17 +0000818static PyObject *
819tupleiter_next(tupleiterobject *it)
820{
821 PyTupleObject *seq;
822 PyObject *item;
823
824 assert(it != NULL);
825 seq = it->it_seq;
826 if (seq == NULL)
827 return NULL;
828 assert(PyTuple_Check(seq));
829
830 if (it->it_index < PyTuple_GET_SIZE(seq)) {
831 item = PyTuple_GET_ITEM(seq, it->it_index);
832 ++it->it_index;
833 Py_INCREF(item);
834 return item;
835 }
836
837 Py_DECREF(seq);
838 it->it_seq = NULL;
839 return NULL;
840}
841
Raymond Hettinger435bf582004-03-18 22:43:10 +0000842static int
843tupleiter_len(tupleiterobject *it)
844{
845 if (it->it_seq)
846 return PyTuple_GET_SIZE(it->it_seq) - it->it_index;
847 return 0;
848}
849
850static PySequenceMethods tupleiter_as_sequence = {
851 (inquiry)tupleiter_len, /* sq_length */
852 0, /* sq_concat */
853};
854
Raymond Hettinger48923c52002-08-09 01:30:17 +0000855PyTypeObject PyTupleIter_Type = {
856 PyObject_HEAD_INIT(&PyType_Type)
857 0, /* ob_size */
858 "tupleiterator", /* tp_name */
859 sizeof(tupleiterobject), /* tp_basicsize */
860 0, /* tp_itemsize */
861 /* methods */
862 (destructor)tupleiter_dealloc, /* tp_dealloc */
863 0, /* tp_print */
864 0, /* tp_getattr */
865 0, /* tp_setattr */
866 0, /* tp_compare */
867 0, /* tp_repr */
868 0, /* tp_as_number */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000869 &tupleiter_as_sequence, /* tp_as_sequence */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000870 0, /* tp_as_mapping */
871 0, /* tp_hash */
872 0, /* tp_call */
873 0, /* tp_str */
874 PyObject_GenericGetAttr, /* tp_getattro */
875 0, /* tp_setattro */
876 0, /* tp_as_buffer */
877 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
878 0, /* tp_doc */
879 (traverseproc)tupleiter_traverse, /* tp_traverse */
880 0, /* tp_clear */
881 0, /* tp_richcompare */
882 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +0000883 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000884 (iternextfunc)tupleiter_next, /* tp_iternext */
885};