blob: ddb69e48507183642fee821885121949de47d973 [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 Heimes2202f872008-02-06 14:31:34 +00007#ifndef PyTuple_MAXSAVESIZE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00008#define PyTuple_MAXSAVESIZE 20 /* Largest tuple to save on free list */
Guido van Rossum5ce78f82000-04-21 21:15:05 +00009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000010#ifndef PyTuple_MAXFREELIST
Christian Heimes2202f872008-02-06 14:31:34 +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 Heimes2202f872008-02-06 14:31:34 +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 Heimes2202f872008-02-06 14:31:34 +000018static PyTupleObject *free_list[PyTuple_MAXSAVESIZE];
19static int numfree[PyTuple_MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000020#endif
21#ifdef COUNT_ALLOCS
Benjamin Petersona4a37fe2009-01-11 17:13:55 +000022Py_ssize_t fast_tuple_allocs;
23Py_ssize_t tuple_zero_allocs;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000024#endif
25
Antoine Pitrou3a652b12009-03-23 18:52:06 +000026/* Debug statistic to count GC tracking of tuples.
27 Please note that tuples are only untracked when considered by the GC, and
28 many of them will be dead before. Therefore, a tracking rate close to 100%
29 does not necessarily prove that the heuristic is inefficient.
30*/
31#ifdef SHOW_TRACK_COUNT
32static Py_ssize_t count_untracked = 0;
33static Py_ssize_t count_tracked = 0;
34
35static void
36show_track(void)
37{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038 fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n",
39 count_tracked + count_untracked);
40 fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T
41 "d\n", count_tracked);
42 fprintf(stderr, "%.2f%% tuple tracking rate\n\n",
43 (100.0*count_tracked/(count_untracked+count_tracked)));
Antoine Pitrou3a652b12009-03-23 18:52:06 +000044}
45#endif
46
47
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000049PyTuple_New(register Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 register PyTupleObject *op;
52 Py_ssize_t i;
53 if (size < 0) {
54 PyErr_BadInternalCall();
55 return NULL;
56 }
Christian Heimes2202f872008-02-06 14:31:34 +000057#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 if (size == 0 && free_list[0]) {
59 op = free_list[0];
60 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000061#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 tuple_zero_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 return (PyObject *) op;
65 }
66 if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {
67 free_list[size] = (PyTupleObject *) op->ob_item[0];
68 numfree[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000069#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 fast_tuple_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000073#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 Py_SIZE(op) = size;
75 Py_TYPE(op) = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 _Py_NewReference((PyObject *)op);
78 }
79 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 {
82 Py_ssize_t nbytes = size * sizeof(PyObject *);
83 /* Check for overflow */
84 if (nbytes / sizeof(PyObject *) != (size_t)size ||
85 (nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)))
86 {
87 return PyErr_NoMemory();
88 }
Brett Cannonb94767f2011-02-22 20:15:44 +000089 /* nbytes += sizeof(PyTupleObject) - sizeof(PyObject *); */
Neal Norwitz3ce5d922008-08-24 07:08:55 +000090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
92 if (op == NULL)
93 return NULL;
94 }
95 for (i=0; i < size; i++)
96 op->ob_item[i] = NULL;
Christian Heimes2202f872008-02-06 14:31:34 +000097#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 if (size == 0) {
99 free_list[0] = op;
100 ++numfree[0];
101 Py_INCREF(op); /* extra INCREF so that this is never freed */
102 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000103#endif
Antoine Pitrouacc5d6b2009-03-23 19:19:54 +0000104#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 count_tracked++;
Antoine Pitrouacc5d6b2009-03-23 19:19:54 +0000106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 _PyObject_GC_TRACK(op);
108 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109}
110
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000112PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 if (!PyTuple_Check(op)) {
115 PyErr_BadInternalCall();
116 return -1;
117 }
118 else
119 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120}
121
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 if (!PyTuple_Check(op)) {
126 PyErr_BadInternalCall();
127 return NULL;
128 }
129 if (i < 0 || i >= Py_SIZE(op)) {
130 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
131 return NULL;
132 }
133 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134}
135
136int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000137PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 register PyObject *olditem;
140 register PyObject **p;
141 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
142 Py_XDECREF(newitem);
143 PyErr_BadInternalCall();
144 return -1;
145 }
146 if (i < 0 || i >= Py_SIZE(op)) {
147 Py_XDECREF(newitem);
148 PyErr_SetString(PyExc_IndexError,
149 "tuple assignment index out of range");
150 return -1;
151 }
152 p = ((PyTupleObject *)op) -> ob_item + i;
153 olditem = *p;
154 *p = newitem;
155 Py_XDECREF(olditem);
156 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157}
158
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000159void
160_PyTuple_MaybeUntrack(PyObject *op)
161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 PyTupleObject *t;
163 Py_ssize_t i, n;
164
165 if (!PyTuple_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
166 return;
167 t = (PyTupleObject *) op;
168 n = Py_SIZE(t);
169 for (i = 0; i < n; i++) {
170 PyObject *elt = PyTuple_GET_ITEM(t, i);
171 /* Tuple with NULL elements aren't
172 fully constructed, don't untrack
173 them yet. */
174 if (!elt ||
175 _PyObject_GC_MAY_BE_TRACKED(elt))
176 return;
177 }
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000178#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 count_tracked--;
180 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000181#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000183}
184
Raymond Hettingercb2da432003-10-12 18:24:34 +0000185PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000186PyTuple_Pack(Py_ssize_t n, ...)
Raymond Hettingercb2da432003-10-12 18:24:34 +0000187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 Py_ssize_t i;
189 PyObject *o;
190 PyObject *result;
191 PyObject **items;
192 va_list vargs;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 va_start(vargs, n);
195 result = PyTuple_New(n);
196 if (result == NULL)
197 return NULL;
198 items = ((PyTupleObject *)result)->ob_item;
199 for (i = 0; i < n; i++) {
200 o = va_arg(vargs, PyObject *);
201 Py_INCREF(o);
202 items[i] = o;
203 }
204 va_end(vargs);
205 return result;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000206}
207
208
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209/* Methods */
210
211static void
Fred Drakeba096332000-07-09 07:04:36 +0000212tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 register Py_ssize_t i;
215 register Py_ssize_t len = Py_SIZE(op);
216 PyObject_GC_UnTrack(op);
217 Py_TRASHCAN_SAFE_BEGIN(op)
218 if (len > 0) {
219 i = len;
220 while (--i >= 0)
221 Py_XDECREF(op->ob_item[i]);
Christian Heimes2202f872008-02-06 14:31:34 +0000222#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 if (len < PyTuple_MAXSAVESIZE &&
224 numfree[len] < PyTuple_MAXFREELIST &&
225 Py_TYPE(op) == &PyTuple_Type)
226 {
227 op->ob_item[0] = (PyObject *) free_list[len];
228 numfree[len]++;
229 free_list[len] = op;
230 goto done; /* return */
231 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 }
234 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000235done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237}
238
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000240tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 Py_ssize_t i, n;
243 PyObject *s, *temp;
244 PyObject *pieces, *result = NULL;
Tim Petersa7259592001-06-16 05:11:17 +0000245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 n = Py_SIZE(v);
247 if (n == 0)
248 return PyUnicode_FromString("()");
Tim Petersa7259592001-06-16 05:11:17 +0000249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 /* While not mutable, it is still possible to end up with a cycle in a
251 tuple through an object that stores itself within a tuple (and thus
252 infinitely asks for the repr of itself). This should only be
253 possible within a type. */
254 i = Py_ReprEnter((PyObject *)v);
255 if (i != 0) {
256 return i > 0 ? PyUnicode_FromString("(...)") : NULL;
257 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 pieces = PyTuple_New(n);
260 if (pieces == NULL)
261 return NULL;
Tim Petersa7259592001-06-16 05:11:17 +0000262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 /* Do repr() on each element. */
264 for (i = 0; i < n; ++i) {
265 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
266 goto Done;
267 s = PyObject_Repr(v->ob_item[i]);
268 Py_LeaveRecursiveCall();
269 if (s == NULL)
270 goto Done;
271 PyTuple_SET_ITEM(pieces, i, s);
272 }
Tim Petersa7259592001-06-16 05:11:17 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 /* Add "()" decorations to the first and last items. */
275 assert(n > 0);
276 s = PyUnicode_FromString("(");
277 if (s == NULL)
278 goto Done;
279 temp = PyTuple_GET_ITEM(pieces, 0);
280 PyUnicode_AppendAndDel(&s, temp);
281 PyTuple_SET_ITEM(pieces, 0, s);
282 if (s == NULL)
283 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 s = PyUnicode_FromString(n == 1 ? ",)" : ")");
286 if (s == NULL)
287 goto Done;
288 temp = PyTuple_GET_ITEM(pieces, n-1);
289 PyUnicode_AppendAndDel(&temp, s);
290 PyTuple_SET_ITEM(pieces, n-1, temp);
291 if (temp == NULL)
292 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 /* Paste them all together with ", " between. */
295 s = PyUnicode_FromString(", ");
296 if (s == NULL)
297 goto Done;
298 result = PyUnicode_Join(s, pieces);
299 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000300
301Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 Py_DECREF(pieces);
303 Py_ReprLeave((PyObject *)v);
304 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305}
306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307/* The addend 82520, was selected from the range(0, 1000000) for
308 generating the greatest number of prime multipliers for tuples
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000309 upto length eight:
310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000312 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
313*/
314
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000315static Py_hash_t
Fred Drakeba096332000-07-09 07:04:36 +0000316tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000317{
Mark Dickinson57e683e2011-09-24 18:18:40 +0100318 register Py_uhash_t x;
319 register Py_hash_t y;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 register Py_ssize_t len = Py_SIZE(v);
321 register PyObject **p;
Mark Dickinson57e683e2011-09-24 18:18:40 +0100322 Py_uhash_t mult = 1000003;
323 x = 0x345678;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 p = v->ob_item;
325 while (--len >= 0) {
326 y = PyObject_Hash(*p++);
327 if (y == -1)
328 return -1;
329 x = (x ^ y) * mult;
330 /* the cast might truncate len; that doesn't change hash stability */
Benjamin Peterson8035bc52010-10-23 16:20:50 +0000331 mult += (Py_hash_t)(82520L + len + len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 }
333 x += 97531L;
Mark Dickinson57e683e2011-09-24 18:18:40 +0100334 if (x == (Py_uhash_t)-1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 x = -2;
336 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000337}
338
Martin v. Löwis18e16552006-02-15 17:27:45 +0000339static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000340tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343}
344
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000345static int
Fred Drakeba096332000-07-09 07:04:36 +0000346tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000347{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 Py_ssize_t i;
349 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
352 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
353 Py_EQ);
354 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000355}
356
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000358tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 if (i < 0 || i >= Py_SIZE(a)) {
361 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
362 return NULL;
363 }
364 Py_INCREF(a->ob_item[i]);
365 return a->ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366}
367
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368static PyObject *
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
370 register Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 register PyTupleObject *np;
373 PyObject **src, **dest;
374 register Py_ssize_t i;
375 Py_ssize_t len;
376 if (ilow < 0)
377 ilow = 0;
378 if (ihigh > Py_SIZE(a))
379 ihigh = Py_SIZE(a);
380 if (ihigh < ilow)
381 ihigh = ilow;
382 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
383 Py_INCREF(a);
384 return (PyObject *)a;
385 }
386 len = ihigh - ilow;
387 np = (PyTupleObject *)PyTuple_New(len);
388 if (np == NULL)
389 return NULL;
390 src = a->ob_item + ilow;
391 dest = np->ob_item;
392 for (i = 0; i < len; i++) {
393 PyObject *v = src[i];
394 Py_INCREF(v);
395 dest[i] = v;
396 }
397 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398}
399
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000401PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 if (op == NULL || !PyTuple_Check(op)) {
404 PyErr_BadInternalCall();
405 return NULL;
406 }
407 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000408}
409
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000411tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 register Py_ssize_t size;
414 register Py_ssize_t i;
415 PyObject **src, **dest;
416 PyTupleObject *np;
417 if (!PyTuple_Check(bb)) {
418 PyErr_Format(PyExc_TypeError,
419 "can only concatenate tuple (not \"%.200s\") to tuple",
420 Py_TYPE(bb)->tp_name);
421 return NULL;
422 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423#define b ((PyTupleObject *)bb)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 size = Py_SIZE(a) + Py_SIZE(b);
425 if (size < 0)
426 return PyErr_NoMemory();
427 np = (PyTupleObject *) PyTuple_New(size);
428 if (np == NULL) {
429 return NULL;
430 }
431 src = a->ob_item;
432 dest = np->ob_item;
433 for (i = 0; i < Py_SIZE(a); i++) {
434 PyObject *v = src[i];
435 Py_INCREF(v);
436 dest[i] = v;
437 }
438 src = b->ob_item;
439 dest = np->ob_item + Py_SIZE(a);
440 for (i = 0; i < Py_SIZE(b); i++) {
441 PyObject *v = src[i];
442 Py_INCREF(v);
443 dest[i] = v;
444 }
445 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446#undef b
447}
448
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000450tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 Py_ssize_t i, j;
453 Py_ssize_t size;
454 PyTupleObject *np;
455 PyObject **p, **items;
456 if (n < 0)
457 n = 0;
458 if (Py_SIZE(a) == 0 || n == 1) {
459 if (PyTuple_CheckExact(a)) {
460 /* Since tuples are immutable, we can return a shared
461 copy in this case */
462 Py_INCREF(a);
463 return (PyObject *)a;
464 }
465 if (Py_SIZE(a) == 0)
466 return PyTuple_New(0);
467 }
468 size = Py_SIZE(a) * n;
469 if (size/Py_SIZE(a) != n)
470 return PyErr_NoMemory();
471 np = (PyTupleObject *) PyTuple_New(size);
472 if (np == NULL)
473 return NULL;
474 p = np->ob_item;
475 items = a->ob_item;
476 for (i = 0; i < n; i++) {
477 for (j = 0; j < Py_SIZE(a); j++) {
478 *p = items[j];
479 Py_INCREF(*p);
480 p++;
481 }
482 }
483 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000484}
485
Raymond Hettinger65baa342008-02-07 00:41:02 +0000486static PyObject *
487tupleindex(PyTupleObject *self, PyObject *args)
488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 Py_ssize_t i, start=0, stop=Py_SIZE(self);
490 PyObject *v;
Raymond Hettinger65baa342008-02-07 00:41:02 +0000491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
493 _PyEval_SliceIndex, &start,
494 _PyEval_SliceIndex, &stop))
495 return NULL;
496 if (start < 0) {
497 start += Py_SIZE(self);
498 if (start < 0)
499 start = 0;
500 }
501 if (stop < 0) {
502 stop += Py_SIZE(self);
503 if (stop < 0)
504 stop = 0;
505 }
506 for (i = start; i < stop && i < Py_SIZE(self); i++) {
507 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
508 if (cmp > 0)
509 return PyLong_FromSsize_t(i);
510 else if (cmp < 0)
511 return NULL;
512 }
513 PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in tuple");
514 return NULL;
Raymond Hettinger65baa342008-02-07 00:41:02 +0000515}
516
517static PyObject *
518tuplecount(PyTupleObject *self, PyObject *v)
519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 Py_ssize_t count = 0;
521 Py_ssize_t i;
Raymond Hettinger65baa342008-02-07 00:41:02 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 for (i = 0; i < Py_SIZE(self); i++) {
524 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
525 if (cmp > 0)
526 count++;
527 else if (cmp < 0)
528 return NULL;
529 }
530 return PyLong_FromSsize_t(count);
Raymond Hettinger65baa342008-02-07 00:41:02 +0000531}
532
Jeremy Hylton8caad492000-06-23 14:18:11 +0000533static int
534tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 for (i = Py_SIZE(o); --i >= 0; )
539 Py_VISIT(o->ob_item[i]);
540 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000541}
542
Guido van Rossumf77bc622001-01-18 00:00:53 +0000543static PyObject *
544tuplerichcompare(PyObject *v, PyObject *w, int op)
545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 PyTupleObject *vt, *wt;
547 Py_ssize_t i;
548 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000549
Brian Curtindfc80e32011-08-10 20:28:54 -0500550 if (!PyTuple_Check(v) || !PyTuple_Check(w))
551 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 vt = (PyTupleObject *)v;
554 wt = (PyTupleObject *)w;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 vlen = Py_SIZE(vt);
557 wlen = Py_SIZE(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 /* Note: the corresponding code for lists has an "early out" test
560 * here when op is EQ or NE and the lengths differ. That pays there,
561 * but Tim was unable to find any real code where EQ/NE tuple
562 * compares don't have the same length, so testing for it here would
563 * have cost without benefit.
564 */
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 /* Search for the first index where items are different.
567 * Note that because tuples are immutable, it's safe to reuse
568 * vlen and wlen across the comparison calls.
569 */
570 for (i = 0; i < vlen && i < wlen; i++) {
571 int k = PyObject_RichCompareBool(vt->ob_item[i],
572 wt->ob_item[i], Py_EQ);
573 if (k < 0)
574 return NULL;
575 if (!k)
576 break;
577 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (i >= vlen || i >= wlen) {
580 /* No more items to compare -- compare sizes */
581 int cmp;
582 PyObject *res;
583 switch (op) {
584 case Py_LT: cmp = vlen < wlen; break;
585 case Py_LE: cmp = vlen <= wlen; break;
586 case Py_EQ: cmp = vlen == wlen; break;
587 case Py_NE: cmp = vlen != wlen; break;
588 case Py_GT: cmp = vlen > wlen; break;
589 case Py_GE: cmp = vlen >= wlen; break;
590 default: return NULL; /* cannot happen */
591 }
592 if (cmp)
593 res = Py_True;
594 else
595 res = Py_False;
596 Py_INCREF(res);
597 return res;
598 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 /* We have an item that differs -- shortcuts for EQ/NE */
601 if (op == Py_EQ) {
602 Py_INCREF(Py_False);
603 return Py_False;
604 }
605 if (op == Py_NE) {
606 Py_INCREF(Py_True);
607 return Py_True;
608 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 /* Compare the final item again using the proper operator */
611 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000612}
613
Jeremy Hylton938ace62002-07-17 16:30:39 +0000614static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000615tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
616
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617static PyObject *
618tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 PyObject *arg = NULL;
621 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 if (type != &PyTuple_Type)
624 return tuple_subtype_new(type, args, kwds);
625 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
626 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 if (arg == NULL)
629 return PyTuple_New(0);
630 else
631 return PySequence_Tuple(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000632}
633
Guido van Rossumae960af2001-08-30 03:11:59 +0000634static PyObject *
635tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 PyObject *tmp, *newobj, *item;
638 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 assert(PyType_IsSubtype(type, &PyTuple_Type));
641 tmp = tuple_new(&PyTuple_Type, args, kwds);
642 if (tmp == NULL)
643 return NULL;
644 assert(PyTuple_Check(tmp));
645 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
646 if (newobj == NULL)
647 return NULL;
648 for (i = 0; i < n; i++) {
649 item = PyTuple_GET_ITEM(tmp, i);
650 Py_INCREF(item);
651 PyTuple_SET_ITEM(newobj, i, item);
652 }
653 Py_DECREF(tmp);
654 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000655}
656
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000657PyDoc_STRVAR(tuple_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +0000658"tuple() -> empty tuple\n\
659tuple(iterable) -> tuple initialized from iterable's items\n\
660\n\
661If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000662
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663static PySequenceMethods tuple_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 (lenfunc)tuplelength, /* sq_length */
665 (binaryfunc)tupleconcat, /* sq_concat */
666 (ssizeargfunc)tuplerepeat, /* sq_repeat */
667 (ssizeargfunc)tupleitem, /* sq_item */
668 0, /* sq_slice */
669 0, /* sq_ass_item */
670 0, /* sq_ass_slice */
671 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000672};
673
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000674static PyObject*
675tuplesubscript(PyTupleObject* self, PyObject* item)
676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 if (PyIndex_Check(item)) {
678 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
679 if (i == -1 && PyErr_Occurred())
680 return NULL;
681 if (i < 0)
682 i += PyTuple_GET_SIZE(self);
683 return tupleitem(self, i);
684 }
685 else if (PySlice_Check(item)) {
686 Py_ssize_t start, stop, step, slicelength, cur, i;
687 PyObject* result;
688 PyObject* it;
689 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000690
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000691 if (PySlice_GetIndicesEx(item,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 PyTuple_GET_SIZE(self),
693 &start, &stop, &step, &slicelength) < 0) {
694 return NULL;
695 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 if (slicelength <= 0) {
698 return PyTuple_New(0);
699 }
700 else if (start == 0 && step == 1 &&
701 slicelength == PyTuple_GET_SIZE(self) &&
702 PyTuple_CheckExact(self)) {
703 Py_INCREF(self);
704 return (PyObject *)self;
705 }
706 else {
707 result = PyTuple_New(slicelength);
708 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 src = self->ob_item;
711 dest = ((PyTupleObject *)result)->ob_item;
712 for (cur = start, i = 0; i < slicelength;
713 cur += step, i++) {
714 it = src[cur];
715 Py_INCREF(it);
716 dest[i] = it;
717 }
718
719 return result;
720 }
721 }
722 else {
723 PyErr_Format(PyExc_TypeError,
724 "tuple indices must be integers, not %.200s",
725 Py_TYPE(item)->tp_name);
726 return NULL;
727 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000728}
729
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000730static PyObject *
731tuple_getnewargs(PyTupleObject *v)
732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
734
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000735}
736
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000737static PyObject *
738tuple_sizeof(PyTupleObject *self)
739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 Py_ssize_t res;
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
743 return PyLong_FromSsize_t(res);
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000744}
745
Raymond Hettinger65baa342008-02-07 00:41:02 +0000746PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000747"T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
748"Raises ValueError if the value is not present."
749);
Raymond Hettinger65baa342008-02-07 00:41:02 +0000750PyDoc_STRVAR(count_doc,
751"T.count(value) -> integer -- return number of occurrences of value");
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000752PyDoc_STRVAR(sizeof_doc,
753"T.__sizeof__() -- size of T in memory, in bytes");
Raymond Hettinger65baa342008-02-07 00:41:02 +0000754
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000755static PyMethodDef tuple_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
757 {"__sizeof__", (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
758 {"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc},
759 {"count", (PyCFunction)tuplecount, METH_O, count_doc},
760 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000761};
762
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000763static PyMappingMethods tuple_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 (lenfunc)tuplelength,
765 (binaryfunc)tuplesubscript,
766 0
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000767};
768
Raymond Hettinger48923c52002-08-09 01:30:17 +0000769static PyObject *tuple_iter(PyObject *seq);
770
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000771PyTypeObject PyTuple_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 PyVarObject_HEAD_INIT(&PyType_Type, 0)
773 "tuple",
774 sizeof(PyTupleObject) - sizeof(PyObject *),
775 sizeof(PyObject *),
776 (destructor)tupledealloc, /* tp_dealloc */
777 0, /* tp_print */
778 0, /* tp_getattr */
779 0, /* tp_setattr */
780 0, /* tp_reserved */
781 (reprfunc)tuplerepr, /* tp_repr */
782 0, /* tp_as_number */
783 &tuple_as_sequence, /* tp_as_sequence */
784 &tuple_as_mapping, /* tp_as_mapping */
785 (hashfunc)tuplehash, /* tp_hash */
786 0, /* tp_call */
787 0, /* tp_str */
788 PyObject_GenericGetAttr, /* tp_getattro */
789 0, /* tp_setattro */
790 0, /* tp_as_buffer */
791 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
792 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
793 tuple_doc, /* tp_doc */
794 (traverseproc)tupletraverse, /* tp_traverse */
795 0, /* tp_clear */
796 tuplerichcompare, /* tp_richcompare */
797 0, /* tp_weaklistoffset */
798 tuple_iter, /* tp_iter */
799 0, /* tp_iternext */
800 tuple_methods, /* tp_methods */
801 0, /* tp_members */
802 0, /* tp_getset */
803 0, /* tp_base */
804 0, /* tp_dict */
805 0, /* tp_descr_get */
806 0, /* tp_descr_set */
807 0, /* tp_dictoffset */
808 0, /* tp_init */
809 0, /* tp_alloc */
810 tuple_new, /* tp_new */
811 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000812};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000813
814/* The following function breaks the notion that tuples are immutable:
815 it changes the size of a tuple. We get away with this only if there
816 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000817 as creating a new tuple object and destroying the old one, only more
818 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000819 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000820
821int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000822_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 register PyTupleObject *v;
825 register PyTupleObject *sv;
826 Py_ssize_t i;
827 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 v = (PyTupleObject *) *pv;
830 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
831 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
832 *pv = 0;
833 Py_XDECREF(v);
834 PyErr_BadInternalCall();
835 return -1;
836 }
837 oldsize = Py_SIZE(v);
838 if (oldsize == newsize)
839 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 if (oldsize == 0) {
842 /* Empty tuples are often shared, so we should never
843 resize them in-place even if we do own the only
844 (current) reference */
845 Py_DECREF(v);
846 *pv = PyTuple_New(newsize);
847 return *pv == NULL ? -1 : 0;
848 }
Thomas Wouters6a922372001-05-28 13:11:02 +0000849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 /* XXX UNREF/NEWREF interface should be more symmetrical */
851 _Py_DEC_REFTOTAL;
852 if (_PyObject_GC_IS_TRACKED(v))
853 _PyObject_GC_UNTRACK(v);
854 _Py_ForgetReference((PyObject *) v);
855 /* DECREF items deleted by shrinkage */
856 for (i = newsize; i < oldsize; i++) {
857 Py_XDECREF(v->ob_item[i]);
858 v->ob_item[i] = NULL;
859 }
860 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
861 if (sv == NULL) {
862 *pv = NULL;
863 PyObject_GC_Del(v);
864 return -1;
865 }
866 _Py_NewReference((PyObject *) sv);
867 /* Zero out items added by growing */
868 if (newsize > oldsize)
869 memset(&sv->ob_item[oldsize], 0,
870 sizeof(*sv->ob_item) * (newsize - oldsize));
871 *pv = (PyObject *) sv;
872 _PyObject_GC_TRACK(sv);
873 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000874}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000875
Christian Heimesa156e092008-02-16 07:38:31 +0000876int
877PyTuple_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 int freelist_size = 0;
Christian Heimes2202f872008-02-06 14:31:34 +0000880#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 int i;
882 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
883 PyTupleObject *p, *q;
884 p = free_list[i];
885 freelist_size += numfree[i];
886 free_list[i] = NULL;
887 numfree[i] = 0;
888 while (p) {
889 q = p;
890 p = (PyTupleObject *)(p->ob_item[0]);
891 PyObject_GC_Del(q);
892 }
893 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 return freelist_size;
Christian Heimesa156e092008-02-16 07:38:31 +0000896}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897
Christian Heimesa156e092008-02-16 07:38:31 +0000898void
899PyTuple_Fini(void)
900{
901#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 /* empty tuples are used all over the place and applications may
903 * rely on the fact that an empty tuple is a singleton. */
904 Py_XDECREF(free_list[0]);
905 free_list[0] = NULL;
Christian Heimesa156e092008-02-16 07:38:31 +0000906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 (void)PyTuple_ClearFreeList();
Christian Heimesa156e092008-02-16 07:38:31 +0000908#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000909#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 show_track();
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000911#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000912}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000913
914/*********************** Tuple Iterator **************************/
915
916typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 PyObject_HEAD
918 long it_index;
919 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000920} tupleiterobject;
921
Raymond Hettinger48923c52002-08-09 01:30:17 +0000922static void
923tupleiter_dealloc(tupleiterobject *it)
924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 _PyObject_GC_UNTRACK(it);
926 Py_XDECREF(it->it_seq);
927 PyObject_GC_Del(it);
Raymond Hettinger48923c52002-08-09 01:30:17 +0000928}
929
930static int
931tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
932{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 Py_VISIT(it->it_seq);
934 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000935}
936
Raymond Hettinger48923c52002-08-09 01:30:17 +0000937static PyObject *
938tupleiter_next(tupleiterobject *it)
939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 PyTupleObject *seq;
941 PyObject *item;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 assert(it != NULL);
944 seq = it->it_seq;
945 if (seq == NULL)
946 return NULL;
947 assert(PyTuple_Check(seq));
Raymond Hettinger48923c52002-08-09 01:30:17 +0000948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 if (it->it_index < PyTuple_GET_SIZE(seq)) {
950 item = PyTuple_GET_ITEM(seq, it->it_index);
951 ++it->it_index;
952 Py_INCREF(item);
953 return item;
954 }
Raymond Hettinger48923c52002-08-09 01:30:17 +0000955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 Py_DECREF(seq);
957 it->it_seq = NULL;
958 return NULL;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000959}
960
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000961static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +0000962tupleiter_len(tupleiterobject *it)
963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 Py_ssize_t len = 0;
965 if (it->it_seq)
966 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
967 return PyLong_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +0000968}
969
Armin Rigof5b3e362006-02-11 21:32:43 +0000970PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000971
972static PyMethodDef tupleiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
974 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000975};
976
Raymond Hettinger48923c52002-08-09 01:30:17 +0000977PyTypeObject PyTupleIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 PyVarObject_HEAD_INIT(&PyType_Type, 0)
979 "tuple_iterator", /* tp_name */
980 sizeof(tupleiterobject), /* tp_basicsize */
981 0, /* tp_itemsize */
982 /* methods */
983 (destructor)tupleiter_dealloc, /* tp_dealloc */
984 0, /* tp_print */
985 0, /* tp_getattr */
986 0, /* tp_setattr */
987 0, /* tp_reserved */
988 0, /* tp_repr */
989 0, /* tp_as_number */
990 0, /* tp_as_sequence */
991 0, /* tp_as_mapping */
992 0, /* tp_hash */
993 0, /* tp_call */
994 0, /* tp_str */
995 PyObject_GenericGetAttr, /* tp_getattro */
996 0, /* tp_setattro */
997 0, /* tp_as_buffer */
998 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
999 0, /* tp_doc */
1000 (traverseproc)tupleiter_traverse, /* tp_traverse */
1001 0, /* tp_clear */
1002 0, /* tp_richcompare */
1003 0, /* tp_weaklistoffset */
1004 PyObject_SelfIter, /* tp_iter */
1005 (iternextfunc)tupleiter_next, /* tp_iternext */
1006 tupleiter_methods, /* tp_methods */
1007 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +00001008};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001009
1010static PyObject *
1011tuple_iter(PyObject *seq)
1012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 tupleiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 if (!PyTuple_Check(seq)) {
1016 PyErr_BadInternalCall();
1017 return NULL;
1018 }
1019 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
1020 if (it == NULL)
1021 return NULL;
1022 it->it_index = 0;
1023 Py_INCREF(seq);
1024 it->it_seq = (PyTupleObject *)seq;
1025 _PyObject_GC_TRACK(it);
1026 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001027}