blob: bbc78f4ddbdf1e31187d34253b6f3692049969da [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 */
Christian Heimes5b970ad2008-02-06 13:33:44 +00007#ifndef PyTuple_MAXSAVESIZE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +00008#define PyTuple_MAXSAVESIZE 20 /* Largest tuple to save on free list */
Guido van Rossum5ce78f82000-04-21 21:15:05 +00009#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000010#ifndef PyTuple_MAXFREELIST
Christian Heimes5b970ad2008-02-06 13:33:44 +000011#define PyTuple_MAXFREELIST 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000012#endif
13
Christian Heimes5b970ad2008-02-06 13:33:44 +000014#if PyTuple_MAXSAVESIZE > 0
15/* Entries 1 up to PyTuple_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*/
Christian Heimes5b970ad2008-02-06 13:33:44 +000018static PyTupleObject *free_list[PyTuple_MAXSAVESIZE];
19static int numfree[PyTuple_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 *
Martin v. Löwis18e16552006-02-15 17:27:45 +000027PyTuple_New(register Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000029 register PyTupleObject *op;
30 Py_ssize_t i;
31 if (size < 0) {
32 PyErr_BadInternalCall();
33 return NULL;
34 }
Christian Heimes5b970ad2008-02-06 13:33:44 +000035#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000036 if (size == 0 && free_list[0]) {
37 op = free_list[0];
38 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000039#ifdef COUNT_ALLOCS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000040 tuple_zero_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000041#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000042 return (PyObject *) op;
43 }
44 if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {
45 free_list[size] = (PyTupleObject *) op->ob_item[0];
46 numfree[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000047#ifdef COUNT_ALLOCS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000048 fast_tuple_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000049#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000050 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000051#ifdef Py_TRACE_REFS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000052 Py_SIZE(op) = size;
53 Py_TYPE(op) = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000054#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000055 _Py_NewReference((PyObject *)op);
56 }
57 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000058#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000059 {
60 Py_ssize_t nbytes = size * sizeof(PyObject *);
61 /* Check for overflow */
62 if (nbytes / sizeof(PyObject *) != (size_t)size ||
63 (nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)))
64 {
65 return PyErr_NoMemory();
66 }
67 nbytes += sizeof(PyTupleObject) - sizeof(PyObject *);
Neal Norwitze7d8be82008-07-31 17:17:14 +000068
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000069 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
70 if (op == NULL)
71 return NULL;
72 }
73 for (i=0; i < size; i++)
74 op->ob_item[i] = NULL;
Christian Heimes5b970ad2008-02-06 13:33:44 +000075#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000076 if (size == 0) {
77 free_list[0] = op;
78 ++numfree[0];
79 Py_INCREF(op); /* extra INCREF so that this is never freed */
80 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000081#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000082 _PyObject_GC_TRACK(op);
83 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084}
85
Martin v. Löwis18e16552006-02-15 17:27:45 +000086Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +000087PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000089 if (!PyTuple_Check(op)) {
90 PyErr_BadInternalCall();
91 return -1;
92 }
93 else
94 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095}
96
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000098PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000100 if (!PyTuple_Check(op)) {
101 PyErr_BadInternalCall();
102 return NULL;
103 }
104 if (i < 0 || i >= Py_SIZE(op)) {
105 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
106 return NULL;
107 }
108 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109}
110
111int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000112PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000114 register PyObject *olditem;
115 register PyObject **p;
116 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
117 Py_XDECREF(newitem);
118 PyErr_BadInternalCall();
119 return -1;
120 }
121 if (i < 0 || i >= Py_SIZE(op)) {
122 Py_XDECREF(newitem);
123 PyErr_SetString(PyExc_IndexError,
124 "tuple assignment index out of range");
125 return -1;
126 }
127 p = ((PyTupleObject *)op) -> ob_item + i;
128 olditem = *p;
129 *p = newitem;
130 Py_XDECREF(olditem);
131 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Raymond Hettingercb2da432003-10-12 18:24:34 +0000134PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000135PyTuple_Pack(Py_ssize_t n, ...)
Raymond Hettingercb2da432003-10-12 18:24:34 +0000136{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000137 Py_ssize_t i;
138 PyObject *o;
139 PyObject *result;
140 PyObject **items;
141 va_list vargs;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000142
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000143 va_start(vargs, n);
144 result = PyTuple_New(n);
145 if (result == NULL)
146 return NULL;
147 items = ((PyTupleObject *)result)->ob_item;
148 for (i = 0; i < n; i++) {
149 o = va_arg(vargs, PyObject *);
150 Py_INCREF(o);
151 items[i] = o;
152 }
153 va_end(vargs);
154 return result;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000155}
156
157
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158/* Methods */
159
160static void
Fred Drakeba096332000-07-09 07:04:36 +0000161tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000163 register Py_ssize_t i;
164 register Py_ssize_t len = Py_SIZE(op);
165 PyObject_GC_UnTrack(op);
166 Py_TRASHCAN_SAFE_BEGIN(op)
167 if (len > 0) {
168 i = len;
169 while (--i >= 0)
170 Py_XDECREF(op->ob_item[i]);
Christian Heimes5b970ad2008-02-06 13:33:44 +0000171#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000172 if (len < PyTuple_MAXSAVESIZE &&
173 numfree[len] < PyTuple_MAXFREELIST &&
174 Py_TYPE(op) == &PyTuple_Type)
175 {
176 op->ob_item[0] = (PyObject *) free_list[len];
177 numfree[len]++;
178 free_list[len] = op;
179 goto done; /* return */
180 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000181#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000182 }
183 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000184done:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000185 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186}
187
Guido van Rossum49e85141991-06-07 22:59:30 +0000188static int
Fred Drakeba096332000-07-09 07:04:36 +0000189tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000191 Py_ssize_t i;
192 Py_BEGIN_ALLOW_THREADS
193 fprintf(fp, "(");
194 Py_END_ALLOW_THREADS
195 for (i = 0; i < Py_SIZE(op); i++) {
196 if (i > 0) {
197 Py_BEGIN_ALLOW_THREADS
198 fprintf(fp, ", ");
199 Py_END_ALLOW_THREADS
200 }
201 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
202 return -1;
203 }
204 i = Py_SIZE(op);
205 Py_BEGIN_ALLOW_THREADS
206 if (i == 1)
207 fprintf(fp, ",");
208 fprintf(fp, ")");
209 Py_END_ALLOW_THREADS
210 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211}
212
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000214tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000216 Py_ssize_t i, n;
217 PyObject *s, *temp;
218 PyObject *pieces, *result = NULL;
Tim Petersa7259592001-06-16 05:11:17 +0000219
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000220 n = Py_SIZE(v);
221 if (n == 0)
222 return PyString_FromString("()");
Brett Cannon31ba8482007-09-30 20:37:19 +0000223
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000224 /* While not mutable, it is still possible to end up with a cycle in a
225 tuple through an object that stores itself within a tuple (and thus
226 infinitely asks for the repr of itself). This should only be
227 possible within a type. */
228 i = Py_ReprEnter((PyObject *)v);
229 if (i != 0) {
230 return i > 0 ? PyString_FromString("(...)") : NULL;
231 }
Brett Cannon0b14f242007-09-30 19:45:10 +0000232
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000233 pieces = PyTuple_New(n);
234 if (pieces == NULL)
235 return NULL;
Tim Petersa7259592001-06-16 05:11:17 +0000236
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000237 /* Do repr() on each element. */
238 for (i = 0; i < n; ++i) {
239 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
240 goto Done;
241 s = PyObject_Repr(v->ob_item[i]);
242 Py_LeaveRecursiveCall();
243 if (s == NULL)
244 goto Done;
245 PyTuple_SET_ITEM(pieces, i, s);
246 }
Tim Petersa7259592001-06-16 05:11:17 +0000247
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000248 /* Add "()" decorations to the first and last items. */
249 assert(n > 0);
250 s = PyString_FromString("(");
251 if (s == NULL)
252 goto Done;
253 temp = PyTuple_GET_ITEM(pieces, 0);
254 PyString_ConcatAndDel(&s, temp);
255 PyTuple_SET_ITEM(pieces, 0, s);
256 if (s == NULL)
257 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000258
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000259 s = PyString_FromString(n == 1 ? ",)" : ")");
260 if (s == NULL)
261 goto Done;
262 temp = PyTuple_GET_ITEM(pieces, n-1);
263 PyString_ConcatAndDel(&temp, s);
264 PyTuple_SET_ITEM(pieces, n-1, temp);
265 if (temp == NULL)
266 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000267
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000268 /* Paste them all together with ", " between. */
269 s = PyString_FromString(", ");
270 if (s == NULL)
271 goto Done;
272 result = _PyString_Join(s, pieces);
273 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000274
275Done:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000276 Py_DECREF(pieces);
277 Py_ReprLeave((PyObject *)v);
278 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279}
280
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000281/* The addend 82520, was selected from the range(0, 1000000) for
282 generating the greatest number of prime multipliers for tuples
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000283 upto length eight:
284
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000285 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000286 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
287*/
288
Guido van Rossum9bfef441993-03-29 10:43:31 +0000289static long
Fred Drakeba096332000-07-09 07:04:36 +0000290tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000291{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000292 register long x, y;
293 register Py_ssize_t len = Py_SIZE(v);
294 register PyObject **p;
295 long mult = 1000003L;
296 x = 0x345678L;
297 p = v->ob_item;
298 while (--len >= 0) {
299 y = PyObject_Hash(*p++);
300 if (y == -1)
301 return -1;
302 x = (x ^ y) * mult;
303 /* the cast might truncate len; that doesn't change hash stability */
304 mult += (long)(82520L + len + len);
305 }
306 x += 97531L;
307 if (x == -1)
308 x = -2;
309 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000310}
311
Martin v. Löwis18e16552006-02-15 17:27:45 +0000312static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000313tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000315 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316}
317
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000318static int
Fred Drakeba096332000-07-09 07:04:36 +0000319tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000320{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000321 Py_ssize_t i;
322 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000323
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000324 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
325 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
326 Py_EQ);
327 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000328}
329
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000331tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000333 if (i < 0 || i >= Py_SIZE(a)) {
334 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
335 return NULL;
336 }
337 Py_INCREF(a->ob_item[i]);
338 return a->ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339}
340
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341static PyObject *
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000342tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
343 register Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000345 register PyTupleObject *np;
346 PyObject **src, **dest;
347 register Py_ssize_t i;
348 Py_ssize_t len;
349 if (ilow < 0)
350 ilow = 0;
351 if (ihigh > Py_SIZE(a))
352 ihigh = Py_SIZE(a);
353 if (ihigh < ilow)
354 ihigh = ilow;
355 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
356 Py_INCREF(a);
357 return (PyObject *)a;
358 }
359 len = ihigh - ilow;
360 np = (PyTupleObject *)PyTuple_New(len);
361 if (np == NULL)
362 return NULL;
363 src = a->ob_item + ilow;
364 dest = np->ob_item;
365 for (i = 0; i < len; i++) {
366 PyObject *v = src[i];
367 Py_INCREF(v);
368 dest[i] = v;
369 }
370 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371}
372
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000374PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000375{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000376 if (op == NULL || !PyTuple_Check(op)) {
377 PyErr_BadInternalCall();
378 return NULL;
379 }
380 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000381}
382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000384tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000386 register Py_ssize_t size;
387 register Py_ssize_t i;
388 PyObject **src, **dest;
389 PyTupleObject *np;
390 if (!PyTuple_Check(bb)) {
391 PyErr_Format(PyExc_TypeError,
392 "can only concatenate tuple (not \"%.200s\") to tuple",
393 Py_TYPE(bb)->tp_name);
394 return NULL;
395 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396#define b ((PyTupleObject *)bb)
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000397 size = Py_SIZE(a) + Py_SIZE(b);
398 if (size < 0)
399 return PyErr_NoMemory();
400 np = (PyTupleObject *) PyTuple_New(size);
401 if (np == NULL) {
402 return NULL;
403 }
404 src = a->ob_item;
405 dest = np->ob_item;
406 for (i = 0; i < Py_SIZE(a); i++) {
407 PyObject *v = src[i];
408 Py_INCREF(v);
409 dest[i] = v;
410 }
411 src = b->ob_item;
412 dest = np->ob_item + Py_SIZE(a);
413 for (i = 0; i < Py_SIZE(b); i++) {
414 PyObject *v = src[i];
415 Py_INCREF(v);
416 dest[i] = v;
417 }
418 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419#undef b
420}
421
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000423tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000424{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000425 Py_ssize_t i, j;
426 Py_ssize_t size;
427 PyTupleObject *np;
428 PyObject **p, **items;
429 if (n < 0)
430 n = 0;
431 if (Py_SIZE(a) == 0 || n == 1) {
432 if (PyTuple_CheckExact(a)) {
433 /* Since tuples are immutable, we can return a shared
434 copy in this case */
435 Py_INCREF(a);
436 return (PyObject *)a;
437 }
438 if (Py_SIZE(a) == 0)
439 return PyTuple_New(0);
440 }
441 size = Py_SIZE(a) * n;
442 if (size/Py_SIZE(a) != n)
443 return PyErr_NoMemory();
444 np = (PyTupleObject *) PyTuple_New(size);
445 if (np == NULL)
446 return NULL;
447 p = np->ob_item;
448 items = a->ob_item;
449 for (i = 0; i < n; i++) {
450 for (j = 0; j < Py_SIZE(a); j++) {
451 *p = items[j];
452 Py_INCREF(*p);
453 p++;
454 }
455 }
456 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000457}
458
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000459static PyObject *
460tupleindex(PyTupleObject *self, PyObject *args)
461{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000462 Py_ssize_t i, start=0, stop=Py_SIZE(self);
463 PyObject *v;
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000464
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000465 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
466 _PyEval_SliceIndex, &start,
467 _PyEval_SliceIndex, &stop))
468 return NULL;
469 if (start < 0) {
470 start += Py_SIZE(self);
471 if (start < 0)
472 start = 0;
473 }
474 if (stop < 0) {
475 stop += Py_SIZE(self);
476 if (stop < 0)
477 stop = 0;
478 }
479 for (i = start; i < stop && i < Py_SIZE(self); i++) {
480 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
481 if (cmp > 0)
482 return PyInt_FromSsize_t(i);
483 else if (cmp < 0)
484 return NULL;
485 }
486 PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in list");
487 return NULL;
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000488}
489
490static PyObject *
491tuplecount(PyTupleObject *self, PyObject *v)
492{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000493 Py_ssize_t count = 0;
494 Py_ssize_t i;
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000495
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000496 for (i = 0; i < Py_SIZE(self); i++) {
497 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
498 if (cmp > 0)
499 count++;
500 else if (cmp < 0)
501 return NULL;
502 }
503 return PyInt_FromSsize_t(count);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000504}
505
Jeremy Hylton8caad492000-06-23 14:18:11 +0000506static int
507tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
508{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000509 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000510
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000511 for (i = Py_SIZE(o); --i >= 0; )
512 Py_VISIT(o->ob_item[i]);
513 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000514}
515
Guido van Rossumf77bc622001-01-18 00:00:53 +0000516static PyObject *
517tuplerichcompare(PyObject *v, PyObject *w, int op)
518{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000519 PyTupleObject *vt, *wt;
520 Py_ssize_t i;
521 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000522
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000523 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
524 Py_INCREF(Py_NotImplemented);
525 return Py_NotImplemented;
526 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000527
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000528 vt = (PyTupleObject *)v;
529 wt = (PyTupleObject *)w;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000530
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000531 vlen = Py_SIZE(vt);
532 wlen = Py_SIZE(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000533
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000534 /* Note: the corresponding code for lists has an "early out" test
535 * here when op is EQ or NE and the lengths differ. That pays there,
536 * but Tim was unable to find any real code where EQ/NE tuple
537 * compares don't have the same length, so testing for it here would
538 * have cost without benefit.
539 */
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000540
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000541 /* Search for the first index where items are different.
542 * Note that because tuples are immutable, it's safe to reuse
543 * vlen and wlen across the comparison calls.
544 */
545 for (i = 0; i < vlen && i < wlen; i++) {
546 int k = PyObject_RichCompareBool(vt->ob_item[i],
547 wt->ob_item[i], Py_EQ);
548 if (k < 0)
549 return NULL;
550 if (!k)
551 break;
552 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000553
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000554 if (i >= vlen || i >= wlen) {
555 /* No more items to compare -- compare sizes */
556 int cmp;
557 PyObject *res;
558 switch (op) {
559 case Py_LT: cmp = vlen < wlen; break;
560 case Py_LE: cmp = vlen <= wlen; break;
561 case Py_EQ: cmp = vlen == wlen; break;
562 case Py_NE: cmp = vlen != wlen; break;
563 case Py_GT: cmp = vlen > wlen; break;
564 case Py_GE: cmp = vlen >= wlen; break;
565 default: return NULL; /* cannot happen */
566 }
567 if (cmp)
568 res = Py_True;
569 else
570 res = Py_False;
571 Py_INCREF(res);
572 return res;
573 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000574
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000575 /* We have an item that differs -- shortcuts for EQ/NE */
576 if (op == Py_EQ) {
577 Py_INCREF(Py_False);
578 return Py_False;
579 }
580 if (op == Py_NE) {
581 Py_INCREF(Py_True);
582 return Py_True;
583 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000584
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000585 /* Compare the final item again using the proper operator */
586 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000587}
588
Jeremy Hylton938ace62002-07-17 16:30:39 +0000589static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000590tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
591
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592static PyObject *
593tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
594{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000595 PyObject *arg = NULL;
596 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000597
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000598 if (type != &PyTuple_Type)
599 return tuple_subtype_new(type, args, kwds);
600 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
601 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000602
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000603 if (arg == NULL)
604 return PyTuple_New(0);
605 else
606 return PySequence_Tuple(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000607}
608
Guido van Rossumae960af2001-08-30 03:11:59 +0000609static PyObject *
610tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
611{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000612 PyObject *tmp, *newobj, *item;
613 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000614
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000615 assert(PyType_IsSubtype(type, &PyTuple_Type));
616 tmp = tuple_new(&PyTuple_Type, args, kwds);
617 if (tmp == NULL)
618 return NULL;
619 assert(PyTuple_Check(tmp));
620 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
621 if (newobj == NULL)
622 return NULL;
623 for (i = 0; i < n; i++) {
624 item = PyTuple_GET_ITEM(tmp, i);
625 Py_INCREF(item);
626 PyTuple_SET_ITEM(newobj, i, item);
627 }
628 Py_DECREF(tmp);
629 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000630}
631
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000632PyDoc_STRVAR(tuple_doc,
Ezio Melotti56f16822010-03-01 04:05:56 +0000633"tuple() -> empty tuple\n\
634tuple(iterable) -> tuple initialized from iterable's items\n\
635\n\
636If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000637
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000638static PySequenceMethods tuple_as_sequence = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000639 (lenfunc)tuplelength, /* sq_length */
640 (binaryfunc)tupleconcat, /* sq_concat */
641 (ssizeargfunc)tuplerepeat, /* sq_repeat */
642 (ssizeargfunc)tupleitem, /* sq_item */
643 (ssizessizeargfunc)tupleslice, /* sq_slice */
644 0, /* sq_ass_item */
645 0, /* sq_ass_slice */
646 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647};
648
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000649static PyObject*
650tuplesubscript(PyTupleObject* self, PyObject* item)
651{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000652 if (PyIndex_Check(item)) {
653 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
654 if (i == -1 && PyErr_Occurred())
655 return NULL;
656 if (i < 0)
657 i += PyTuple_GET_SIZE(self);
658 return tupleitem(self, i);
659 }
660 else if (PySlice_Check(item)) {
661 Py_ssize_t start, stop, step, slicelength, cur, i;
662 PyObject* result;
663 PyObject* it;
664 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000665
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000666 if (PySlice_GetIndicesEx((PySliceObject*)item,
667 PyTuple_GET_SIZE(self),
668 &start, &stop, &step, &slicelength) < 0) {
669 return NULL;
670 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000671
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000672 if (slicelength <= 0) {
673 return PyTuple_New(0);
674 }
675 else if (start == 0 && step == 1 &&
676 slicelength == PyTuple_GET_SIZE(self) &&
677 PyTuple_CheckExact(self)) {
678 Py_INCREF(self);
679 return (PyObject *)self;
680 }
681 else {
682 result = PyTuple_New(slicelength);
683 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000684
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000685 src = self->ob_item;
686 dest = ((PyTupleObject *)result)->ob_item;
687 for (cur = start, i = 0; i < slicelength;
688 cur += step, i++) {
689 it = src[cur];
690 Py_INCREF(it);
691 dest[i] = it;
692 }
693
694 return result;
695 }
696 }
697 else {
698 PyErr_Format(PyExc_TypeError,
699 "tuple indices must be integers, not %.200s",
700 Py_TYPE(item)->tp_name);
701 return NULL;
702 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000703}
704
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000705static PyObject *
706tuple_getnewargs(PyTupleObject *v)
707{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000708 return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
709
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000710}
711
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000712static PyObject *
713tuple_sizeof(PyTupleObject *self)
714{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000715 Py_ssize_t res;
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000716
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000717 res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
718 return PyInt_FromSsize_t(res);
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000719}
720
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000721PyDoc_STRVAR(index_doc,
Benjamin Petersonbe2c0a92008-10-04 21:33:08 +0000722"T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
723"Raises ValueError if the value is not present."
724);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000725PyDoc_STRVAR(count_doc,
726"T.count(value) -> integer -- return number of occurrences of value");
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000727PyDoc_STRVAR(sizeof_doc,
728"T.__sizeof__() -- size of T in memory, in bytes");
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000729
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000730static PyMethodDef tuple_methods[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000731 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
732 {"__sizeof__", (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
733 {"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc},
734 {"count", (PyCFunction)tuplecount, METH_O, count_doc},
735 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000736};
737
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000738static PyMappingMethods tuple_as_mapping = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000739 (lenfunc)tuplelength,
740 (binaryfunc)tuplesubscript,
741 0
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000742};
743
Raymond Hettinger48923c52002-08-09 01:30:17 +0000744static PyObject *tuple_iter(PyObject *seq);
745
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000746PyTypeObject PyTuple_Type = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000747 PyVarObject_HEAD_INIT(&PyType_Type, 0)
748 "tuple",
749 sizeof(PyTupleObject) - sizeof(PyObject *),
750 sizeof(PyObject *),
751 (destructor)tupledealloc, /* tp_dealloc */
752 (printfunc)tupleprint, /* tp_print */
753 0, /* tp_getattr */
754 0, /* tp_setattr */
755 0, /* tp_compare */
756 (reprfunc)tuplerepr, /* tp_repr */
757 0, /* tp_as_number */
758 &tuple_as_sequence, /* tp_as_sequence */
759 &tuple_as_mapping, /* tp_as_mapping */
760 (hashfunc)tuplehash, /* tp_hash */
761 0, /* tp_call */
762 0, /* tp_str */
763 PyObject_GenericGetAttr, /* tp_getattro */
764 0, /* tp_setattro */
765 0, /* tp_as_buffer */
766 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
767 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
768 tuple_doc, /* tp_doc */
769 (traverseproc)tupletraverse, /* tp_traverse */
770 0, /* tp_clear */
771 tuplerichcompare, /* tp_richcompare */
772 0, /* tp_weaklistoffset */
773 tuple_iter, /* tp_iter */
774 0, /* tp_iternext */
775 tuple_methods, /* tp_methods */
776 0, /* tp_members */
777 0, /* tp_getset */
778 0, /* tp_base */
779 0, /* tp_dict */
780 0, /* tp_descr_get */
781 0, /* tp_descr_set */
782 0, /* tp_dictoffset */
783 0, /* tp_init */
784 0, /* tp_alloc */
785 tuple_new, /* tp_new */
786 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000787};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000788
789/* The following function breaks the notion that tuples are immutable:
790 it changes the size of a tuple. We get away with this only if there
791 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000792 as creating a new tuple object and destroying the old one, only more
793 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000794 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000795
796int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000797_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000798{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000799 register PyTupleObject *v;
800 register PyTupleObject *sv;
801 Py_ssize_t i;
802 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000803
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000804 v = (PyTupleObject *) *pv;
805 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
806 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
807 *pv = 0;
808 Py_XDECREF(v);
809 PyErr_BadInternalCall();
810 return -1;
811 }
812 oldsize = Py_SIZE(v);
813 if (oldsize == newsize)
814 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000815
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000816 if (oldsize == 0) {
817 /* Empty tuples are often shared, so we should never
818 resize them in-place even if we do own the only
819 (current) reference */
820 Py_DECREF(v);
821 *pv = PyTuple_New(newsize);
822 return *pv == NULL ? -1 : 0;
823 }
Thomas Wouters6a922372001-05-28 13:11:02 +0000824
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000825 /* XXX UNREF/NEWREF interface should be more symmetrical */
826 _Py_DEC_REFTOTAL;
827 _PyObject_GC_UNTRACK(v);
828 _Py_ForgetReference((PyObject *) v);
829 /* DECREF items deleted by shrinkage */
830 for (i = newsize; i < oldsize; i++) {
831 Py_XDECREF(v->ob_item[i]);
832 v->ob_item[i] = NULL;
833 }
834 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
835 if (sv == NULL) {
836 *pv = NULL;
837 PyObject_GC_Del(v);
838 return -1;
839 }
840 _Py_NewReference((PyObject *) sv);
841 /* Zero out items added by growing */
842 if (newsize > oldsize)
843 memset(&sv->ob_item[oldsize], 0,
844 sizeof(*sv->ob_item) * (newsize - oldsize));
845 *pv = (PyObject *) sv;
846 _PyObject_GC_TRACK(sv);
847 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000848}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000849
Christian Heimes3b718a72008-02-14 12:47:33 +0000850int
851PyTuple_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000852{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000853 int freelist_size = 0;
Christian Heimes5b970ad2008-02-06 13:33:44 +0000854#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000855 int i;
856 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
857 PyTupleObject *p, *q;
858 p = free_list[i];
859 freelist_size += numfree[i];
860 free_list[i] = NULL;
861 numfree[i] = 0;
862 while (p) {
863 q = p;
864 p = (PyTupleObject *)(p->ob_item[0]);
865 PyObject_GC_Del(q);
866 }
867 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000868#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000869 return freelist_size;
Christian Heimes3b718a72008-02-14 12:47:33 +0000870}
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000871
Christian Heimes3b718a72008-02-14 12:47:33 +0000872void
873PyTuple_Fini(void)
874{
875#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000876 /* empty tuples are used all over the place and applications may
877 * rely on the fact that an empty tuple is a singleton. */
878 Py_XDECREF(free_list[0]);
879 free_list[0] = NULL;
Christian Heimes3b718a72008-02-14 12:47:33 +0000880
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000881 (void)PyTuple_ClearFreeList();
Christian Heimes3b718a72008-02-14 12:47:33 +0000882#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000883}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000884
885/*********************** Tuple Iterator **************************/
886
887typedef struct {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000888 PyObject_HEAD
889 long it_index;
890 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000891} tupleiterobject;
892
Raymond Hettinger48923c52002-08-09 01:30:17 +0000893static void
894tupleiter_dealloc(tupleiterobject *it)
895{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000896 _PyObject_GC_UNTRACK(it);
897 Py_XDECREF(it->it_seq);
898 PyObject_GC_Del(it);
Raymond Hettinger48923c52002-08-09 01:30:17 +0000899}
900
901static int
902tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
903{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000904 Py_VISIT(it->it_seq);
905 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000906}
907
Raymond Hettinger48923c52002-08-09 01:30:17 +0000908static PyObject *
909tupleiter_next(tupleiterobject *it)
910{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000911 PyTupleObject *seq;
912 PyObject *item;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000913
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000914 assert(it != NULL);
915 seq = it->it_seq;
916 if (seq == NULL)
917 return NULL;
918 assert(PyTuple_Check(seq));
Raymond Hettinger48923c52002-08-09 01:30:17 +0000919
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000920 if (it->it_index < PyTuple_GET_SIZE(seq)) {
921 item = PyTuple_GET_ITEM(seq, it->it_index);
922 ++it->it_index;
923 Py_INCREF(item);
924 return item;
925 }
Raymond Hettinger48923c52002-08-09 01:30:17 +0000926
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000927 Py_DECREF(seq);
928 it->it_seq = NULL;
929 return NULL;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000930}
931
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000932static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +0000933tupleiter_len(tupleiterobject *it)
934{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000935 Py_ssize_t len = 0;
936 if (it->it_seq)
937 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
938 return PyInt_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +0000939}
940
Armin Rigof5b3e362006-02-11 21:32:43 +0000941PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000942
943static PyMethodDef tupleiter_methods[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000944 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
945 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000946};
947
Raymond Hettinger48923c52002-08-09 01:30:17 +0000948PyTypeObject PyTupleIter_Type = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000949 PyVarObject_HEAD_INIT(&PyType_Type, 0)
950 "tupleiterator", /* tp_name */
951 sizeof(tupleiterobject), /* tp_basicsize */
952 0, /* tp_itemsize */
953 /* methods */
954 (destructor)tupleiter_dealloc, /* tp_dealloc */
955 0, /* tp_print */
956 0, /* tp_getattr */
957 0, /* tp_setattr */
958 0, /* tp_compare */
959 0, /* tp_repr */
960 0, /* tp_as_number */
961 0, /* tp_as_sequence */
962 0, /* tp_as_mapping */
963 0, /* tp_hash */
964 0, /* tp_call */
965 0, /* tp_str */
966 PyObject_GenericGetAttr, /* tp_getattro */
967 0, /* tp_setattro */
968 0, /* tp_as_buffer */
969 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
970 0, /* tp_doc */
971 (traverseproc)tupleiter_traverse, /* tp_traverse */
972 0, /* tp_clear */
973 0, /* tp_richcompare */
974 0, /* tp_weaklistoffset */
975 PyObject_SelfIter, /* tp_iter */
976 (iternextfunc)tupleiter_next, /* tp_iternext */
977 tupleiter_methods, /* tp_methods */
978 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +0000979};
Martin v. Löwis72d20672006-04-11 09:04:12 +0000980
981static PyObject *
982tuple_iter(PyObject *seq)
983{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000984 tupleiterobject *it;
Martin v. Löwis72d20672006-04-11 09:04:12 +0000985
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000986 if (!PyTuple_Check(seq)) {
987 PyErr_BadInternalCall();
988 return NULL;
989 }
990 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
991 if (it == NULL)
992 return NULL;
993 it->it_index = 0;
994 Py_INCREF(seq);
995 it->it_seq = (PyTupleObject *)seq;
996 _PyObject_GC_TRACK(it);
997 return (PyObject *)it;
Martin v. Löwis72d20672006-04-11 09:04:12 +0000998}