blob: 9794bec8ba28dc1804fc3e1f02f3adc063d39ef7 [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;
Armin Rigo7cdf3e82004-03-20 21:35:09 +000030 int i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033 return NULL;
34 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000035#if MAXSAVESIZE > 0
Sjoerd Mullender615194a1993-11-01 13:46:50 +000036 if (size == 0 && free_tuples[0]) {
37 op = free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000039#ifdef COUNT_ALLOCS
40 tuple_zero_allocs++;
41#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000043 }
Raymond Hettinger325d1692004-03-15 00:16:34 +000044 if (size < MAXSAVESIZE && (op = free_tuples[size]) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000046 num_free_tuples[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000047#ifdef COUNT_ALLOCS
48 fast_tuple_allocs++;
49#endif
Guido van Rossume3a8e7e2002-08-19 19:26:42 +000050 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000051#ifdef Py_TRACE_REFS
Guido van Rossum68055ce1998-12-11 14:56:38 +000052 op->ob_size = size;
Guido van Rossumb18618d2000-05-03 23:44:39 +000053 op->ob_type = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000054#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000055 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000056 }
57 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000058#endif
59 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000060 int nbytes = size * sizeof(PyObject *);
61 /* Check for overflow */
62 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Neil Schemenauere83c00e2001-08-29 23:54:21 +000063 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
Guido van Rossum5bc51f21999-07-12 23:06:58 +000064 <= 0)
65 {
66 return PyErr_NoMemory();
67 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000068 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000069 if (op == NULL)
Neil Schemenauere83c00e2001-08-29 23:54:21 +000070 return NULL;
Armin Rigo56716152004-03-21 20:27:49 +000071 memset(op->ob_item, 0, size*sizeof(PyObject*));
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000072 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000073#if MAXSAVESIZE > 0
74 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000075 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +000076 ++num_free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000077 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000078 }
79#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +000080 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082}
83
84int
Fred Drakeba096332000-07-09 07:04:36 +000085PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 if (!PyTuple_Check(op)) {
88 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 return -1;
90 }
91 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093}
94
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095PyObject *
Fred Drakeba096332000-07-09 07:04:36 +000096PyTuple_GetItem(register PyObject *op, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 if (!PyTuple_Check(op)) {
99 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100 return NULL;
101 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
103 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104 return NULL;
105 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107}
108
109int
Fred Drakeba096332000-07-09 07:04:36 +0000110PyTuple_SetItem(register PyObject *op, register int i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112 register PyObject *olditem;
113 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000114 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_XDECREF(newitem);
116 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000117 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
120 Py_XDECREF(newitem);
121 PyErr_SetString(PyExc_IndexError,
122 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000123 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000126 olditem = *p;
127 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129 return 0;
130}
131
Raymond Hettingercb2da432003-10-12 18:24:34 +0000132PyObject *
133PyTuple_Pack(int n, ...)
134{
135 int i;
136 PyObject *o;
137 PyObject *result;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000138 PyObject **items;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000139 va_list vargs;
140
141 va_start(vargs, n);
142 result = PyTuple_New(n);
143 if (result == NULL)
144 return NULL;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000145 items = ((PyTupleObject *)result)->ob_item;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000146 for (i = 0; i < n; i++) {
147 o = va_arg(vargs, PyObject *);
148 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000149 items[i] = o;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000150 }
151 va_end(vargs);
152 return result;
153}
154
155
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156/* Methods */
157
158static void
Fred Drakeba096332000-07-09 07:04:36 +0000159tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160{
161 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000162 register int len = op->ob_size;
Guido van Rossumff413af2002-03-28 20:34:59 +0000163 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000164 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000165 if (len > 0) {
166 i = len;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000167#if MAXSAVESIZE > 0
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000168 if (len < MAXSAVESIZE &&
169 num_free_tuples[len] < MAXSAVEDTUPLES &&
170 op->ob_type == &PyTuple_Type)
171 {
Armin Rigo56716152004-03-21 20:27:49 +0000172 while (--i >= 0) {
173 PyObject* o = op->ob_item[i];
174 if (o != NULL) {
175 op->ob_item[i] = NULL;
176 Py_DECREF(o);
177 }
178 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000179 op->ob_item[0] = (PyObject *) free_tuples[len];
180 num_free_tuples[len]++;
181 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000182 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000183 }
Armin Rigo56716152004-03-21 20:27:49 +0000184 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000185#endif
Armin Rigo56716152004-03-21 20:27:49 +0000186 while (--i >= 0)
187 Py_XDECREF(op->ob_item[i]);
Guido van Rossum1bb26871998-06-26 15:53:50 +0000188 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000189 op->ob_type->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000190done:
191 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192}
193
Guido van Rossum49e85141991-06-07 22:59:30 +0000194static int
Fred Drakeba096332000-07-09 07:04:36 +0000195tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196{
197 int i;
198 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000199 for (i = 0; i < op->ob_size; i++) {
200 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000203 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 }
205 if (op->ob_size == 1)
206 fprintf(fp, ",");
207 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000208 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209}
210
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000212tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213{
Tim Petersa7259592001-06-16 05:11:17 +0000214 int i, n;
215 PyObject *s, *temp;
216 PyObject *pieces, *result = NULL;
217
218 n = v->ob_size;
219 if (n == 0)
220 return PyString_FromString("()");
221
222 pieces = PyTuple_New(n);
223 if (pieces == NULL)
224 return NULL;
225
226 /* Do repr() on each element. */
227 for (i = 0; i < n; ++i) {
228 s = PyObject_Repr(v->ob_item[i]);
229 if (s == NULL)
230 goto Done;
231 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 }
Tim Petersa7259592001-06-16 05:11:17 +0000233
234 /* Add "()" decorations to the first and last items. */
235 assert(n > 0);
236 s = PyString_FromString("(");
237 if (s == NULL)
238 goto Done;
239 temp = PyTuple_GET_ITEM(pieces, 0);
240 PyString_ConcatAndDel(&s, temp);
241 PyTuple_SET_ITEM(pieces, 0, s);
242 if (s == NULL)
243 goto Done;
244
245 s = PyString_FromString(n == 1 ? ",)" : ")");
246 if (s == NULL)
247 goto Done;
248 temp = PyTuple_GET_ITEM(pieces, n-1);
249 PyString_ConcatAndDel(&temp, s);
250 PyTuple_SET_ITEM(pieces, n-1, temp);
251 if (temp == NULL)
252 goto Done;
253
254 /* Paste them all together with ", " between. */
255 s = PyString_FromString(", ");
256 if (s == NULL)
257 goto Done;
258 result = _PyString_Join(s, pieces);
259 Py_DECREF(s);
260
261Done:
262 Py_DECREF(pieces);
263 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264}
265
Guido van Rossum9bfef441993-03-29 10:43:31 +0000266static long
Fred Drakeba096332000-07-09 07:04:36 +0000267tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000268{
269 register long x, y;
270 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000271 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000272 x = 0x345678L;
273 p = v->ob_item;
274 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000276 if (y == -1)
277 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000278 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000279 }
280 x ^= v->ob_size;
281 if (x == -1)
282 x = -2;
283 return x;
284}
285
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286static int
Fred Drakeba096332000-07-09 07:04:36 +0000287tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288{
289 return a->ob_size;
290}
291
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000292static int
Fred Drakeba096332000-07-09 07:04:36 +0000293tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000294{
295 int i, cmp;
296
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000297 for (i = 0, cmp = 0 ; cmp == 0 && i < a->ob_size; ++i)
Guido van Rossumf77bc622001-01-18 00:00:53 +0000298 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000299 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000300 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000301}
302
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000304tupleitem(register PyTupleObject *a, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305{
306 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 return NULL;
309 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 return a->ob_item[i];
312}
313
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000315tupleslice(register PyTupleObject *a, register int ilow, register int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317 register PyTupleObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000318 PyObject **src, **dest;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 register int i;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000320 int len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 if (ilow < 0)
322 ilow = 0;
323 if (ihigh > a->ob_size)
324 ihigh = a->ob_size;
325 if (ihigh < ilow)
326 ihigh = ilow;
Tim Peters7b07a412001-09-11 19:48:03 +0000327 if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 Py_INCREF(a);
329 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 }
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000331 len = ihigh - ilow;
332 np = (PyTupleObject *)PyTuple_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333 if (np == NULL)
334 return NULL;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000335 src = a->ob_item + ilow;
336 dest = np->ob_item;
337 for (i = 0; i < len; i++) {
338 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000340 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343}
344
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000346PyTuple_GetSlice(PyObject *op, int i, int j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000347{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 if (op == NULL || !PyTuple_Check(op)) {
349 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000350 return NULL;
351 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000353}
354
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000356tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357{
358 register int size;
359 register int i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000360 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 PyTupleObject *np;
362 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000363 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000364 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000365 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 return NULL;
367 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369 size = a->ob_size + b->ob_size;
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000370 if (size < 0)
371 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000374 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000376 src = a->ob_item;
377 dest = np->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378 for (i = 0; i < a->ob_size; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000379 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000381 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000383 src = b->ob_item;
384 dest = np->ob_item + a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 for (i = 0; i < b->ob_size; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000386 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000388 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391#undef b
392}
393
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000394static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000395tuplerepeat(PyTupleObject *a, int n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000396{
397 int i, j;
398 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399 PyTupleObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000400 PyObject **p, **items;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000401 if (n < 0)
402 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000403 if (a->ob_size == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000404 if (PyTuple_CheckExact(a)) {
405 /* Since tuples are immutable, we can return a shared
406 copy in this case */
407 Py_INCREF(a);
408 return (PyObject *)a;
409 }
410 if (a->ob_size == 0)
411 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000412 }
413 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000414 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000415 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000417 if (np == NULL)
418 return NULL;
419 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000420 items = a->ob_item;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000421 for (i = 0; i < n; i++) {
422 for (j = 0; j < a->ob_size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000423 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000425 p++;
426 }
427 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000429}
430
Jeremy Hylton8caad492000-06-23 14:18:11 +0000431static int
432tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
433{
434 int i, err;
435 PyObject *x;
436
437 for (i = o->ob_size; --i >= 0; ) {
438 x = o->ob_item[i];
439 if (x != NULL) {
440 err = visit(x, arg);
441 if (err)
442 return err;
443 }
444 }
445 return 0;
446}
447
Guido van Rossumf77bc622001-01-18 00:00:53 +0000448static PyObject *
449tuplerichcompare(PyObject *v, PyObject *w, int op)
450{
451 PyTupleObject *vt, *wt;
452 int i;
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000453 int vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000454
455 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
456 Py_INCREF(Py_NotImplemented);
457 return Py_NotImplemented;
458 }
459
460 vt = (PyTupleObject *)v;
461 wt = (PyTupleObject *)w;
462
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000463 vlen = vt->ob_size;
464 wlen = wt->ob_size;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000465
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000466 /* Note: the corresponding code for lists has an "early out" test
467 * here when op is EQ or NE and the lengths differ. That pays there,
468 * but Tim was unable to find any real code where EQ/NE tuple
469 * compares don't have the same length, so testing for it here would
470 * have cost without benefit.
471 */
472
473 /* Search for the first index where items are different.
474 * Note that because tuples are immutable, it's safe to reuse
475 * vlen and wlen across the comparison calls.
476 */
477 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000478 int k = PyObject_RichCompareBool(vt->ob_item[i],
479 wt->ob_item[i], Py_EQ);
480 if (k < 0)
481 return NULL;
482 if (!k)
483 break;
484 }
485
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000486 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000487 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000488 int cmp;
489 PyObject *res;
490 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000491 case Py_LT: cmp = vlen < wlen; break;
492 case Py_LE: cmp = vlen <= wlen; break;
493 case Py_EQ: cmp = vlen == wlen; break;
494 case Py_NE: cmp = vlen != wlen; break;
495 case Py_GT: cmp = vlen > wlen; break;
496 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000497 default: return NULL; /* cannot happen */
498 }
499 if (cmp)
500 res = Py_True;
501 else
502 res = Py_False;
503 Py_INCREF(res);
504 return res;
505 }
506
507 /* We have an item that differs -- shortcuts for EQ/NE */
508 if (op == Py_EQ) {
509 Py_INCREF(Py_False);
510 return Py_False;
511 }
512 if (op == Py_NE) {
513 Py_INCREF(Py_True);
514 return Py_True;
515 }
516
517 /* Compare the final item again using the proper operator */
518 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
519}
520
Jeremy Hylton938ace62002-07-17 16:30:39 +0000521static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000522tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
523
Tim Peters6d6c1a32001-08-02 04:15:00 +0000524static PyObject *
525tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
526{
527 PyObject *arg = NULL;
528 static char *kwlist[] = {"sequence", 0};
529
Guido van Rossumae960af2001-08-30 03:11:59 +0000530 if (type != &PyTuple_Type)
531 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000532 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
533 return NULL;
534
535 if (arg == NULL)
536 return PyTuple_New(0);
537 else
538 return PySequence_Tuple(arg);
539}
540
Guido van Rossumae960af2001-08-30 03:11:59 +0000541static PyObject *
542tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
543{
544 PyObject *tmp, *new, *item;
545 int i, n;
546
547 assert(PyType_IsSubtype(type, &PyTuple_Type));
548 tmp = tuple_new(&PyTuple_Type, args, kwds);
549 if (tmp == NULL)
550 return NULL;
551 assert(PyTuple_Check(tmp));
552 new = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
553 if (new == NULL)
554 return NULL;
555 for (i = 0; i < n; i++) {
556 item = PyTuple_GET_ITEM(tmp, i);
557 Py_INCREF(item);
558 PyTuple_SET_ITEM(new, i, item);
559 }
560 Py_DECREF(tmp);
561 return new;
562}
563
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000564PyDoc_STRVAR(tuple_doc,
Tim Peters1b8ca0d2001-09-02 06:42:25 +0000565"tuple() -> an empty tuple\n"
566"tuple(sequence) -> tuple initialized from sequence's items\n"
567"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000568"If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000569
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570static PySequenceMethods tuple_as_sequence = {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000571 (inquiry)tuplelength, /* sq_length */
572 (binaryfunc)tupleconcat, /* sq_concat */
573 (intargfunc)tuplerepeat, /* sq_repeat */
574 (intargfunc)tupleitem, /* sq_item */
575 (intintargfunc)tupleslice, /* sq_slice */
576 0, /* sq_ass_item */
577 0, /* sq_ass_slice */
578 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000579};
580
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000581static PyObject*
582tuplesubscript(PyTupleObject* self, PyObject* item)
583{
584 if (PyInt_Check(item)) {
585 long i = PyInt_AS_LONG(item);
586 if (i < 0)
587 i += PyTuple_GET_SIZE(self);
588 return tupleitem(self, i);
589 }
590 else if (PyLong_Check(item)) {
591 long i = PyLong_AsLong(item);
592 if (i == -1 && PyErr_Occurred())
593 return NULL;
594 if (i < 0)
595 i += PyTuple_GET_SIZE(self);
596 return tupleitem(self, i);
597 }
598 else if (PySlice_Check(item)) {
599 int start, stop, step, slicelength, cur, i;
600 PyObject* result;
601 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000602 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000603
604 if (PySlice_GetIndicesEx((PySliceObject*)item,
605 PyTuple_GET_SIZE(self),
606 &start, &stop, &step, &slicelength) < 0) {
607 return NULL;
608 }
609
610 if (slicelength <= 0) {
611 return PyTuple_New(0);
612 }
613 else {
614 result = PyTuple_New(slicelength);
615
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000616 src = self->ob_item;
617 dest = ((PyTupleObject *)result)->ob_item;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000618 for (cur = start, i = 0; i < slicelength;
619 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000620 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000621 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000622 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000623 }
624
625 return result;
626 }
627 }
628 else {
629 PyErr_SetString(PyExc_TypeError,
630 "tuple indices must be integers");
631 return NULL;
632 }
633}
634
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000635static PyObject *
636tuple_getnewargs(PyTupleObject *v)
637{
638 return Py_BuildValue("(N)", tupleslice(v, 0, v->ob_size));
639
640}
641
642static PyMethodDef tuple_methods[] = {
643 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
644 {NULL, NULL} /* sentinel */
645};
646
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000647static PyMappingMethods tuple_as_mapping = {
648 (inquiry)tuplelength,
649 (binaryfunc)tuplesubscript,
650 0
651};
652
Raymond Hettinger48923c52002-08-09 01:30:17 +0000653static PyObject *tuple_iter(PyObject *seq);
654
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000655PyTypeObject PyTuple_Type = {
656 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000657 0,
658 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000659 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000661 (destructor)tupledealloc, /* tp_dealloc */
662 (printfunc)tupleprint, /* tp_print */
663 0, /* tp_getattr */
664 0, /* tp_setattr */
665 0, /* tp_compare */
666 (reprfunc)tuplerepr, /* tp_repr */
667 0, /* tp_as_number */
668 &tuple_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000669 &tuple_as_mapping, /* tp_as_mapping */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000670 (hashfunc)tuplehash, /* tp_hash */
671 0, /* tp_call */
672 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000674 0, /* tp_setattro */
675 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000676 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
677 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000678 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000679 (traverseproc)tupletraverse, /* tp_traverse */
680 0, /* tp_clear */
681 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000682 0, /* tp_weaklistoffset */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000683 tuple_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000684 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000685 tuple_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000686 0, /* tp_members */
687 0, /* tp_getset */
688 0, /* tp_base */
689 0, /* tp_dict */
690 0, /* tp_descr_get */
691 0, /* tp_descr_set */
692 0, /* tp_dictoffset */
693 0, /* tp_init */
694 0, /* tp_alloc */
695 tuple_new, /* tp_new */
Neil Schemenauer626d7742002-04-12 03:05:52 +0000696 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000697};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000698
699/* The following function breaks the notion that tuples are immutable:
700 it changes the size of a tuple. We get away with this only if there
701 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000702 as creating a new tuple object and destroying the old one, only more
703 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000704 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000705
706int
Tim Peters4324aa32001-05-28 22:30:08 +0000707_PyTuple_Resize(PyObject **pv, int newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000708{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000709 register PyTupleObject *v;
710 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000711 int i;
Guido van Rossumf70590f2001-12-07 20:00:04 +0000712 int oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000713
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000714 v = (PyTupleObject *) *pv;
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000715 if (v == NULL || v->ob_type != &PyTuple_Type ||
Thomas Wouters6a922372001-05-28 13:11:02 +0000716 (v->ob_size != 0 && v->ob_refcnt != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000717 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000718 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000720 return -1;
721 }
Guido van Rossumf70590f2001-12-07 20:00:04 +0000722 oldsize = v->ob_size;
723 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000724 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000725
Guido van Rossumf70590f2001-12-07 20:00:04 +0000726 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000727 /* Empty tuples are often shared, so we should never
728 resize them in-place even if we do own the only
729 (current) reference */
730 Py_DECREF(v);
731 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000732 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000733 }
734
Guido van Rossum12d12c51993-10-26 17:58:25 +0000735 /* XXX UNREF/NEWREF interface should be more symmetrical */
Tim Peters34592512002-07-11 06:23:50 +0000736 _Py_DEC_REFTOTAL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000737 _PyObject_GC_UNTRACK(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000738 _Py_ForgetReference((PyObject *) v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000739 /* DECREF items deleted by shrinkage */
740 for (i = newsize; i < oldsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000742 v->ob_item[i] = NULL;
743 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000744 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000745 if (sv == NULL) {
746 *pv = NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000747 PyObject_GC_Del(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000748 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000749 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000750 _Py_NewReference((PyObject *) sv);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000751 /* Zero out items added by growing */
Neal Norwitz35fc7602002-06-13 21:11:11 +0000752 if (newsize > oldsize)
Jeremy Hylton8b47dff2002-06-20 23:13:17 +0000753 memset(&sv->ob_item[oldsize], 0,
754 sizeof(*sv->ob_item) * (newsize - oldsize));
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000755 *pv = (PyObject *) sv;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000756 _PyObject_GC_TRACK(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000757 return 0;
758}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000759
760void
Fred Drakeba096332000-07-09 07:04:36 +0000761PyTuple_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000762{
763#if MAXSAVESIZE > 0
764 int i;
765
766 Py_XDECREF(free_tuples[0]);
767 free_tuples[0] = NULL;
768
769 for (i = 1; i < MAXSAVESIZE; i++) {
770 PyTupleObject *p, *q;
771 p = free_tuples[i];
772 free_tuples[i] = NULL;
773 while (p) {
774 q = p;
775 p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000776 PyObject_GC_Del(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000777 }
778 }
779#endif
780}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000781
782/*********************** Tuple Iterator **************************/
783
784typedef struct {
785 PyObject_HEAD
786 long it_index;
787 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
788} tupleiterobject;
789
790PyTypeObject PyTupleIter_Type;
791
792static PyObject *
793tuple_iter(PyObject *seq)
794{
795 tupleiterobject *it;
796
797 if (!PyTuple_Check(seq)) {
798 PyErr_BadInternalCall();
799 return NULL;
800 }
801 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
802 if (it == NULL)
803 return NULL;
804 it->it_index = 0;
805 Py_INCREF(seq);
806 it->it_seq = (PyTupleObject *)seq;
807 _PyObject_GC_TRACK(it);
808 return (PyObject *)it;
809}
810
811static void
812tupleiter_dealloc(tupleiterobject *it)
813{
814 _PyObject_GC_UNTRACK(it);
815 Py_XDECREF(it->it_seq);
816 PyObject_GC_Del(it);
817}
818
819static int
820tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
821{
822 if (it->it_seq == NULL)
823 return 0;
824 return visit((PyObject *)it->it_seq, arg);
825}
826
Raymond Hettinger48923c52002-08-09 01:30:17 +0000827static PyObject *
828tupleiter_next(tupleiterobject *it)
829{
830 PyTupleObject *seq;
831 PyObject *item;
832
833 assert(it != NULL);
834 seq = it->it_seq;
835 if (seq == NULL)
836 return NULL;
837 assert(PyTuple_Check(seq));
838
839 if (it->it_index < PyTuple_GET_SIZE(seq)) {
840 item = PyTuple_GET_ITEM(seq, it->it_index);
841 ++it->it_index;
842 Py_INCREF(item);
843 return item;
844 }
845
846 Py_DECREF(seq);
847 it->it_seq = NULL;
848 return NULL;
849}
850
Raymond Hettinger435bf582004-03-18 22:43:10 +0000851static int
852tupleiter_len(tupleiterobject *it)
853{
854 if (it->it_seq)
855 return PyTuple_GET_SIZE(it->it_seq) - it->it_index;
856 return 0;
857}
858
859static PySequenceMethods tupleiter_as_sequence = {
860 (inquiry)tupleiter_len, /* sq_length */
861 0, /* sq_concat */
862};
863
Raymond Hettinger48923c52002-08-09 01:30:17 +0000864PyTypeObject PyTupleIter_Type = {
865 PyObject_HEAD_INIT(&PyType_Type)
866 0, /* ob_size */
867 "tupleiterator", /* tp_name */
868 sizeof(tupleiterobject), /* tp_basicsize */
869 0, /* tp_itemsize */
870 /* methods */
871 (destructor)tupleiter_dealloc, /* tp_dealloc */
872 0, /* tp_print */
873 0, /* tp_getattr */
874 0, /* tp_setattr */
875 0, /* tp_compare */
876 0, /* tp_repr */
877 0, /* tp_as_number */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000878 &tupleiter_as_sequence, /* tp_as_sequence */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000879 0, /* tp_as_mapping */
880 0, /* tp_hash */
881 0, /* tp_call */
882 0, /* tp_str */
883 PyObject_GenericGetAttr, /* tp_getattro */
884 0, /* tp_setattro */
885 0, /* tp_as_buffer */
886 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
887 0, /* tp_doc */
888 (traverseproc)tupleiter_traverse, /* tp_traverse */
889 0, /* tp_clear */
890 0, /* tp_richcompare */
891 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +0000892 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000893 (iternextfunc)tupleiter_next, /* tp_iternext */
894};