blob: 5d72806959d1682383631d3a33d9ae3867124255 [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 Pitrouc83ea132010-05-09 14:46:46 +00008#define PyTuple_MAXSAVESIZE 20 /* Largest tuple to save on free list */
Guido van Rossum5ce78f82000-04-21 21:15:05 +00009#endif
Brett Cannonfee3acb2010-05-05 20:18:23 +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
Martin v. Löwisb90304a2009-01-07 18:40:40 +000022Py_ssize_t fast_tuple_allocs;
23Py_ssize_t tuple_zero_allocs;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000024#endif
25
Antoine Pitrouf8387af2009-03-23 18:41:45 +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 Pitrouc83ea132010-05-09 14:46:46 +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 Pitrouf8387af2009-03-23 18:41:45 +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 Pitrouc83ea132010-05-09 14:46:46 +000051 register PyTupleObject *op;
52 Py_ssize_t i;
53 if (size < 0) {
54 PyErr_BadInternalCall();
55 return NULL;
56 }
Christian Heimes5b970ad2008-02-06 13:33:44 +000057#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +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 Pitrouc83ea132010-05-09 14:46:46 +000062 tuple_zero_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000063#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +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 Pitrouc83ea132010-05-09 14:46:46 +000070 fast_tuple_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000071#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +000072 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000073#ifdef Py_TRACE_REFS
Antoine Pitrouc83ea132010-05-09 14:46:46 +000074 Py_SIZE(op) = size;
75 Py_TYPE(op) = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000076#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +000077 _Py_NewReference((PyObject *)op);
78 }
79 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000080#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +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 }
Neal Norwitze7d8be82008-07-31 17:17:14 +000089
Antoine Pitrouc83ea132010-05-09 14:46:46 +000090 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
91 if (op == NULL)
92 return NULL;
93 }
94 for (i=0; i < size; i++)
95 op->ob_item[i] = NULL;
Christian Heimes5b970ad2008-02-06 13:33:44 +000096#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +000097 if (size == 0) {
98 free_list[0] = op;
99 ++numfree[0];
100 Py_INCREF(op); /* extra INCREF so that this is never freed */
101 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000102#endif
Antoine Pitrou1fba6242009-03-23 19:17:00 +0000103#ifdef SHOW_TRACK_COUNT
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000104 count_tracked++;
Antoine Pitrou1fba6242009-03-23 19:17:00 +0000105#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000106 _PyObject_GC_TRACK(op);
107 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108}
109
Martin v. Löwis18e16552006-02-15 17:27:45 +0000110Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000111PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000113 if (!PyTuple_Check(op)) {
114 PyErr_BadInternalCall();
115 return -1;
116 }
117 else
118 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119}
120
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000122PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000124 if (!PyTuple_Check(op)) {
125 PyErr_BadInternalCall();
126 return NULL;
127 }
128 if (i < 0 || i >= Py_SIZE(op)) {
129 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
130 return NULL;
131 }
132 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133}
134
135int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000136PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000138 register PyObject *olditem;
139 register PyObject **p;
140 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
141 Py_XDECREF(newitem);
142 PyErr_BadInternalCall();
143 return -1;
144 }
145 if (i < 0 || i >= Py_SIZE(op)) {
146 Py_XDECREF(newitem);
147 PyErr_SetString(PyExc_IndexError,
148 "tuple assignment index out of range");
149 return -1;
150 }
151 p = ((PyTupleObject *)op) -> ob_item + i;
152 olditem = *p;
153 *p = newitem;
154 Py_XDECREF(olditem);
155 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156}
157
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000158void
159_PyTuple_MaybeUntrack(PyObject *op)
160{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000161 PyTupleObject *t;
162 Py_ssize_t i, n;
163
164 if (!PyTuple_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
165 return;
166 t = (PyTupleObject *) op;
167 n = Py_SIZE(t);
168 for (i = 0; i < n; i++) {
169 PyObject *elt = PyTuple_GET_ITEM(t, i);
170 /* Tuple with NULL elements aren't
171 fully constructed, don't untrack
172 them yet. */
173 if (!elt ||
174 _PyObject_GC_MAY_BE_TRACKED(elt))
175 return;
176 }
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000177#ifdef SHOW_TRACK_COUNT
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000178 count_tracked--;
179 count_untracked++;
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000180#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000181 _PyObject_GC_UNTRACK(op);
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000182}
183
Raymond Hettingercb2da432003-10-12 18:24:34 +0000184PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000185PyTuple_Pack(Py_ssize_t n, ...)
Raymond Hettingercb2da432003-10-12 18:24:34 +0000186{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000187 Py_ssize_t i;
188 PyObject *o;
189 PyObject *result;
190 PyObject **items;
191 va_list vargs;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000192
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000193 va_start(vargs, n);
194 result = PyTuple_New(n);
Christian Heimes074ebce2012-09-10 02:54:51 +0200195 if (result == NULL) {
196 va_end(vargs);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000197 return NULL;
Christian Heimes074ebce2012-09-10 02:54:51 +0200198 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000199 items = ((PyTupleObject *)result)->ob_item;
200 for (i = 0; i < n; i++) {
201 o = va_arg(vargs, PyObject *);
202 Py_INCREF(o);
203 items[i] = o;
204 }
205 va_end(vargs);
206 return result;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000207}
208
209
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210/* Methods */
211
212static void
Fred Drakeba096332000-07-09 07:04:36 +0000213tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000215 register Py_ssize_t i;
216 register Py_ssize_t len = Py_SIZE(op);
217 PyObject_GC_UnTrack(op);
218 Py_TRASHCAN_SAFE_BEGIN(op)
219 if (len > 0) {
220 i = len;
221 while (--i >= 0)
222 Py_XDECREF(op->ob_item[i]);
Christian Heimes5b970ad2008-02-06 13:33:44 +0000223#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000224 if (len < PyTuple_MAXSAVESIZE &&
225 numfree[len] < PyTuple_MAXFREELIST &&
226 Py_TYPE(op) == &PyTuple_Type)
227 {
228 op->ob_item[0] = (PyObject *) free_list[len];
229 numfree[len]++;
230 free_list[len] = op;
231 goto done; /* return */
232 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000233#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000234 }
235 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000236done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000237 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238}
239
Guido van Rossum49e85141991-06-07 22:59:30 +0000240static int
Fred Drakeba096332000-07-09 07:04:36 +0000241tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000243 Py_ssize_t i;
244 Py_BEGIN_ALLOW_THREADS
245 fprintf(fp, "(");
246 Py_END_ALLOW_THREADS
247 for (i = 0; i < Py_SIZE(op); i++) {
248 if (i > 0) {
249 Py_BEGIN_ALLOW_THREADS
250 fprintf(fp, ", ");
251 Py_END_ALLOW_THREADS
252 }
253 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
254 return -1;
255 }
256 i = Py_SIZE(op);
257 Py_BEGIN_ALLOW_THREADS
258 if (i == 1)
259 fprintf(fp, ",");
260 fprintf(fp, ")");
261 Py_END_ALLOW_THREADS
262 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263}
264
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000265static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000266tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000268 Py_ssize_t i, n;
269 PyObject *s, *temp;
270 PyObject *pieces, *result = NULL;
Tim Petersa7259592001-06-16 05:11:17 +0000271
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000272 n = Py_SIZE(v);
273 if (n == 0)
274 return PyString_FromString("()");
Brett Cannon31ba8482007-09-30 20:37:19 +0000275
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000276 /* While not mutable, it is still possible to end up with a cycle in a
277 tuple through an object that stores itself within a tuple (and thus
278 infinitely asks for the repr of itself). This should only be
279 possible within a type. */
280 i = Py_ReprEnter((PyObject *)v);
281 if (i != 0) {
282 return i > 0 ? PyString_FromString("(...)") : NULL;
283 }
Brett Cannon0b14f242007-09-30 19:45:10 +0000284
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000285 pieces = PyTuple_New(n);
286 if (pieces == NULL)
287 return NULL;
Tim Petersa7259592001-06-16 05:11:17 +0000288
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000289 /* Do repr() on each element. */
290 for (i = 0; i < n; ++i) {
291 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
292 goto Done;
293 s = PyObject_Repr(v->ob_item[i]);
294 Py_LeaveRecursiveCall();
295 if (s == NULL)
296 goto Done;
297 PyTuple_SET_ITEM(pieces, i, s);
298 }
Tim Petersa7259592001-06-16 05:11:17 +0000299
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000300 /* Add "()" decorations to the first and last items. */
301 assert(n > 0);
302 s = PyString_FromString("(");
303 if (s == NULL)
304 goto Done;
305 temp = PyTuple_GET_ITEM(pieces, 0);
306 PyString_ConcatAndDel(&s, temp);
307 PyTuple_SET_ITEM(pieces, 0, s);
308 if (s == NULL)
309 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000310
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000311 s = PyString_FromString(n == 1 ? ",)" : ")");
312 if (s == NULL)
313 goto Done;
314 temp = PyTuple_GET_ITEM(pieces, n-1);
315 PyString_ConcatAndDel(&temp, s);
316 PyTuple_SET_ITEM(pieces, n-1, temp);
317 if (temp == NULL)
318 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000319
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000320 /* Paste them all together with ", " between. */
321 s = PyString_FromString(", ");
322 if (s == NULL)
323 goto Done;
324 result = _PyString_Join(s, pieces);
325 Py_DECREF(s);
Tim Petersa7259592001-06-16 05:11:17 +0000326
327Done:
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000328 Py_DECREF(pieces);
329 Py_ReprLeave((PyObject *)v);
330 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331}
332
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000333/* The addend 82520, was selected from the range(0, 1000000) for
334 generating the greatest number of prime multipliers for tuples
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000335 upto length eight:
336
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000337 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000338 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
339*/
340
Guido van Rossum9bfef441993-03-29 10:43:31 +0000341static long
Fred Drakeba096332000-07-09 07:04:36 +0000342tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000343{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000344 register long x, y;
345 register Py_ssize_t len = Py_SIZE(v);
346 register PyObject **p;
347 long mult = 1000003L;
348 x = 0x345678L;
349 p = v->ob_item;
350 while (--len >= 0) {
351 y = PyObject_Hash(*p++);
352 if (y == -1)
353 return -1;
354 x = (x ^ y) * mult;
355 /* the cast might truncate len; that doesn't change hash stability */
356 mult += (long)(82520L + len + len);
357 }
358 x += 97531L;
359 if (x == -1)
360 x = -2;
361 return x;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000362}
363
Martin v. Löwis18e16552006-02-15 17:27:45 +0000364static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000365tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000367 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368}
369
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000370static int
Fred Drakeba096332000-07-09 07:04:36 +0000371tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000372{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000373 Py_ssize_t i;
374 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000375
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000376 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
377 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
378 Py_EQ);
379 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000380}
381
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000383tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000385 if (i < 0 || i >= Py_SIZE(a)) {
386 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
387 return NULL;
388 }
389 Py_INCREF(a->ob_item[i]);
390 return a->ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391}
392
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393static PyObject *
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000394tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
395 register Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000397 register PyTupleObject *np;
398 PyObject **src, **dest;
399 register Py_ssize_t i;
400 Py_ssize_t len;
401 if (ilow < 0)
402 ilow = 0;
403 if (ihigh > Py_SIZE(a))
404 ihigh = Py_SIZE(a);
405 if (ihigh < ilow)
406 ihigh = ilow;
407 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
408 Py_INCREF(a);
409 return (PyObject *)a;
410 }
411 len = ihigh - ilow;
412 np = (PyTupleObject *)PyTuple_New(len);
413 if (np == NULL)
414 return NULL;
415 src = a->ob_item + ilow;
416 dest = np->ob_item;
417 for (i = 0; i < len; i++) {
418 PyObject *v = src[i];
419 Py_INCREF(v);
420 dest[i] = v;
421 }
422 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423}
424
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000426PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000427{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000428 if (op == NULL || !PyTuple_Check(op)) {
429 PyErr_BadInternalCall();
430 return NULL;
431 }
432 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000433}
434
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000436tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000438 register Py_ssize_t size;
439 register Py_ssize_t i;
440 PyObject **src, **dest;
441 PyTupleObject *np;
442 if (!PyTuple_Check(bb)) {
443 PyErr_Format(PyExc_TypeError,
444 "can only concatenate tuple (not \"%.200s\") to tuple",
445 Py_TYPE(bb)->tp_name);
446 return NULL;
447 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448#define b ((PyTupleObject *)bb)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000449 size = Py_SIZE(a) + Py_SIZE(b);
450 if (size < 0)
451 return PyErr_NoMemory();
452 np = (PyTupleObject *) PyTuple_New(size);
453 if (np == NULL) {
454 return NULL;
455 }
456 src = a->ob_item;
457 dest = np->ob_item;
458 for (i = 0; i < Py_SIZE(a); i++) {
459 PyObject *v = src[i];
460 Py_INCREF(v);
461 dest[i] = v;
462 }
463 src = b->ob_item;
464 dest = np->ob_item + Py_SIZE(a);
465 for (i = 0; i < Py_SIZE(b); i++) {
466 PyObject *v = src[i];
467 Py_INCREF(v);
468 dest[i] = v;
469 }
470 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471#undef b
472}
473
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000475tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000476{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000477 Py_ssize_t i, j;
478 Py_ssize_t size;
479 PyTupleObject *np;
480 PyObject **p, **items;
481 if (n < 0)
482 n = 0;
483 if (Py_SIZE(a) == 0 || n == 1) {
484 if (PyTuple_CheckExact(a)) {
485 /* Since tuples are immutable, we can return a shared
486 copy in this case */
487 Py_INCREF(a);
488 return (PyObject *)a;
489 }
490 if (Py_SIZE(a) == 0)
491 return PyTuple_New(0);
492 }
493 size = Py_SIZE(a) * n;
494 if (size/Py_SIZE(a) != n)
495 return PyErr_NoMemory();
496 np = (PyTupleObject *) PyTuple_New(size);
497 if (np == NULL)
498 return NULL;
499 p = np->ob_item;
500 items = a->ob_item;
501 for (i = 0; i < n; i++) {
502 for (j = 0; j < Py_SIZE(a); j++) {
503 *p = items[j];
504 Py_INCREF(*p);
505 p++;
506 }
507 }
508 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000509}
510
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000511static PyObject *
512tupleindex(PyTupleObject *self, PyObject *args)
513{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000514 Py_ssize_t i, start=0, stop=Py_SIZE(self);
Petri Lehtinen3b9d92a2011-11-06 20:58:50 +0200515 PyObject *v;
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000516
Petri Lehtinen3b9d92a2011-11-06 20:58:50 +0200517 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
518 _PyEval_SliceIndex, &start,
519 _PyEval_SliceIndex, &stop))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000520 return NULL;
521 if (start < 0) {
522 start += Py_SIZE(self);
523 if (start < 0)
524 start = 0;
525 }
526 if (stop < 0) {
527 stop += Py_SIZE(self);
528 if (stop < 0)
529 stop = 0;
530 }
531 for (i = start; i < stop && i < Py_SIZE(self); i++) {
532 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
533 if (cmp > 0)
534 return PyInt_FromSsize_t(i);
535 else if (cmp < 0)
536 return NULL;
537 }
538 PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in tuple");
539 return NULL;
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000540}
541
542static PyObject *
543tuplecount(PyTupleObject *self, PyObject *v)
544{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000545 Py_ssize_t count = 0;
546 Py_ssize_t i;
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000547
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000548 for (i = 0; i < Py_SIZE(self); i++) {
549 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
550 if (cmp > 0)
551 count++;
552 else if (cmp < 0)
553 return NULL;
554 }
555 return PyInt_FromSsize_t(count);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000556}
557
Jeremy Hylton8caad492000-06-23 14:18:11 +0000558static int
559tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
560{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000561 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000562
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000563 for (i = Py_SIZE(o); --i >= 0; )
564 Py_VISIT(o->ob_item[i]);
565 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000566}
567
Guido van Rossumf77bc622001-01-18 00:00:53 +0000568static PyObject *
569tuplerichcompare(PyObject *v, PyObject *w, int op)
570{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000571 PyTupleObject *vt, *wt;
572 Py_ssize_t i;
573 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000574
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000575 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
576 Py_INCREF(Py_NotImplemented);
577 return Py_NotImplemented;
578 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000579
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000580 vt = (PyTupleObject *)v;
581 wt = (PyTupleObject *)w;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000582
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000583 vlen = Py_SIZE(vt);
584 wlen = Py_SIZE(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000585
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000586 /* Note: the corresponding code for lists has an "early out" test
587 * here when op is EQ or NE and the lengths differ. That pays there,
588 * but Tim was unable to find any real code where EQ/NE tuple
589 * compares don't have the same length, so testing for it here would
590 * have cost without benefit.
591 */
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000592
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000593 /* Search for the first index where items are different.
594 * Note that because tuples are immutable, it's safe to reuse
595 * vlen and wlen across the comparison calls.
596 */
597 for (i = 0; i < vlen && i < wlen; i++) {
598 int k = PyObject_RichCompareBool(vt->ob_item[i],
599 wt->ob_item[i], Py_EQ);
600 if (k < 0)
601 return NULL;
602 if (!k)
603 break;
604 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000605
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000606 if (i >= vlen || i >= wlen) {
607 /* No more items to compare -- compare sizes */
608 int cmp;
609 PyObject *res;
610 switch (op) {
611 case Py_LT: cmp = vlen < wlen; break;
612 case Py_LE: cmp = vlen <= wlen; break;
613 case Py_EQ: cmp = vlen == wlen; break;
614 case Py_NE: cmp = vlen != wlen; break;
615 case Py_GT: cmp = vlen > wlen; break;
616 case Py_GE: cmp = vlen >= wlen; break;
617 default: return NULL; /* cannot happen */
618 }
619 if (cmp)
620 res = Py_True;
621 else
622 res = Py_False;
623 Py_INCREF(res);
624 return res;
625 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000626
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000627 /* We have an item that differs -- shortcuts for EQ/NE */
628 if (op == Py_EQ) {
629 Py_INCREF(Py_False);
630 return Py_False;
631 }
632 if (op == Py_NE) {
633 Py_INCREF(Py_True);
634 return Py_True;
635 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000636
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000637 /* Compare the final item again using the proper operator */
638 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000639}
640
Jeremy Hylton938ace62002-07-17 16:30:39 +0000641static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000642tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
643
Tim Peters6d6c1a32001-08-02 04:15:00 +0000644static PyObject *
645tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
646{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000647 PyObject *arg = NULL;
648 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000649
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000650 if (type != &PyTuple_Type)
651 return tuple_subtype_new(type, args, kwds);
652 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
653 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000654
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000655 if (arg == NULL)
656 return PyTuple_New(0);
657 else
658 return PySequence_Tuple(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000659}
660
Guido van Rossumae960af2001-08-30 03:11:59 +0000661static PyObject *
662tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
663{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000664 PyObject *tmp, *newobj, *item;
665 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000666
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000667 assert(PyType_IsSubtype(type, &PyTuple_Type));
668 tmp = tuple_new(&PyTuple_Type, args, kwds);
669 if (tmp == NULL)
670 return NULL;
671 assert(PyTuple_Check(tmp));
672 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
673 if (newobj == NULL)
674 return NULL;
675 for (i = 0; i < n; i++) {
676 item = PyTuple_GET_ITEM(tmp, i);
677 Py_INCREF(item);
678 PyTuple_SET_ITEM(newobj, i, item);
679 }
680 Py_DECREF(tmp);
681 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000682}
683
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000684PyDoc_STRVAR(tuple_doc,
Ezio Melottifb501122010-02-28 23:59:00 +0000685"tuple() -> empty tuple\n\
686tuple(iterable) -> tuple initialized from iterable's items\n\
687\n\
688If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690static PySequenceMethods tuple_as_sequence = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000691 (lenfunc)tuplelength, /* sq_length */
692 (binaryfunc)tupleconcat, /* sq_concat */
693 (ssizeargfunc)tuplerepeat, /* sq_repeat */
694 (ssizeargfunc)tupleitem, /* sq_item */
695 (ssizessizeargfunc)tupleslice, /* sq_slice */
696 0, /* sq_ass_item */
697 0, /* sq_ass_slice */
698 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000699};
700
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000701static PyObject*
702tuplesubscript(PyTupleObject* self, PyObject* item)
703{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000704 if (PyIndex_Check(item)) {
705 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
706 if (i == -1 && PyErr_Occurred())
707 return NULL;
708 if (i < 0)
709 i += PyTuple_GET_SIZE(self);
710 return tupleitem(self, i);
711 }
712 else if (PySlice_Check(item)) {
713 Py_ssize_t start, stop, step, slicelength, cur, i;
714 PyObject* result;
715 PyObject* it;
716 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000717
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000718 if (PySlice_GetIndicesEx((PySliceObject*)item,
719 PyTuple_GET_SIZE(self),
720 &start, &stop, &step, &slicelength) < 0) {
721 return NULL;
722 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000723
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000724 if (slicelength <= 0) {
725 return PyTuple_New(0);
726 }
727 else if (start == 0 && step == 1 &&
728 slicelength == PyTuple_GET_SIZE(self) &&
729 PyTuple_CheckExact(self)) {
730 Py_INCREF(self);
731 return (PyObject *)self;
732 }
733 else {
734 result = PyTuple_New(slicelength);
735 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000736
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000737 src = self->ob_item;
738 dest = ((PyTupleObject *)result)->ob_item;
739 for (cur = start, i = 0; i < slicelength;
740 cur += step, i++) {
741 it = src[cur];
742 Py_INCREF(it);
743 dest[i] = it;
744 }
745
746 return result;
747 }
748 }
749 else {
750 PyErr_Format(PyExc_TypeError,
751 "tuple indices must be integers, not %.200s",
752 Py_TYPE(item)->tp_name);
753 return NULL;
754 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000755}
756
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000757static PyObject *
758tuple_getnewargs(PyTupleObject *v)
759{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000760 return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
761
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000762}
763
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000764PyDoc_STRVAR(index_doc,
Andrew M. Kuchlingb15d6fb2008-10-04 01:03:42 +0000765"T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
766"Raises ValueError if the value is not present."
767);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000768PyDoc_STRVAR(count_doc,
769"T.count(value) -> integer -- return number of occurrences of value");
770
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000771static PyMethodDef tuple_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000772 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000773 {"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc},
774 {"count", (PyCFunction)tuplecount, METH_O, count_doc},
775 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000776};
777
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000778static PyMappingMethods tuple_as_mapping = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000779 (lenfunc)tuplelength,
780 (binaryfunc)tuplesubscript,
781 0
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000782};
783
Raymond Hettinger48923c52002-08-09 01:30:17 +0000784static PyObject *tuple_iter(PyObject *seq);
785
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000786PyTypeObject PyTuple_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000787 PyVarObject_HEAD_INIT(&PyType_Type, 0)
788 "tuple",
789 sizeof(PyTupleObject) - sizeof(PyObject *),
790 sizeof(PyObject *),
791 (destructor)tupledealloc, /* tp_dealloc */
792 (printfunc)tupleprint, /* tp_print */
793 0, /* tp_getattr */
794 0, /* tp_setattr */
795 0, /* tp_compare */
796 (reprfunc)tuplerepr, /* tp_repr */
797 0, /* tp_as_number */
798 &tuple_as_sequence, /* tp_as_sequence */
799 &tuple_as_mapping, /* tp_as_mapping */
800 (hashfunc)tuplehash, /* tp_hash */
801 0, /* tp_call */
802 0, /* tp_str */
803 PyObject_GenericGetAttr, /* tp_getattro */
804 0, /* tp_setattro */
805 0, /* tp_as_buffer */
806 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
807 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
808 tuple_doc, /* tp_doc */
809 (traverseproc)tupletraverse, /* tp_traverse */
810 0, /* tp_clear */
811 tuplerichcompare, /* tp_richcompare */
812 0, /* tp_weaklistoffset */
813 tuple_iter, /* tp_iter */
814 0, /* tp_iternext */
815 tuple_methods, /* tp_methods */
816 0, /* tp_members */
817 0, /* tp_getset */
818 0, /* tp_base */
819 0, /* tp_dict */
820 0, /* tp_descr_get */
821 0, /* tp_descr_set */
822 0, /* tp_dictoffset */
823 0, /* tp_init */
824 0, /* tp_alloc */
825 tuple_new, /* tp_new */
826 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000827};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000828
829/* The following function breaks the notion that tuples are immutable:
830 it changes the size of a tuple. We get away with this only if there
831 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000832 as creating a new tuple object and destroying the old one, only more
833 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000834 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000835
836int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000837_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000838{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000839 register PyTupleObject *v;
840 register PyTupleObject *sv;
841 Py_ssize_t i;
842 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000843
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000844 v = (PyTupleObject *) *pv;
845 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
846 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
847 *pv = 0;
848 Py_XDECREF(v);
849 PyErr_BadInternalCall();
850 return -1;
851 }
852 oldsize = Py_SIZE(v);
853 if (oldsize == newsize)
854 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000855
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000856 if (oldsize == 0) {
857 /* Empty tuples are often shared, so we should never
858 resize them in-place even if we do own the only
859 (current) reference */
860 Py_DECREF(v);
861 *pv = PyTuple_New(newsize);
862 return *pv == NULL ? -1 : 0;
863 }
Thomas Wouters6a922372001-05-28 13:11:02 +0000864
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000865 /* XXX UNREF/NEWREF interface should be more symmetrical */
866 _Py_DEC_REFTOTAL;
867 if (_PyObject_GC_IS_TRACKED(v))
868 _PyObject_GC_UNTRACK(v);
869 _Py_ForgetReference((PyObject *) v);
870 /* DECREF items deleted by shrinkage */
871 for (i = newsize; i < oldsize; i++) {
Serhiy Storchaka98a97222014-02-09 13:14:04 +0200872 Py_CLEAR(v->ob_item[i]);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000873 }
874 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
875 if (sv == NULL) {
876 *pv = NULL;
877 PyObject_GC_Del(v);
878 return -1;
879 }
880 _Py_NewReference((PyObject *) sv);
881 /* Zero out items added by growing */
882 if (newsize > oldsize)
883 memset(&sv->ob_item[oldsize], 0,
884 sizeof(*sv->ob_item) * (newsize - oldsize));
885 *pv = (PyObject *) sv;
886 _PyObject_GC_TRACK(sv);
887 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000888}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000889
Christian Heimes3b718a72008-02-14 12:47:33 +0000890int
891PyTuple_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000892{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000893 int freelist_size = 0;
Christian Heimes5b970ad2008-02-06 13:33:44 +0000894#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000895 int i;
896 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
897 PyTupleObject *p, *q;
898 p = free_list[i];
899 freelist_size += numfree[i];
900 free_list[i] = NULL;
901 numfree[i] = 0;
902 while (p) {
903 q = p;
904 p = (PyTupleObject *)(p->ob_item[0]);
905 PyObject_GC_Del(q);
906 }
907 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000908#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000909 return freelist_size;
Christian Heimes3b718a72008-02-14 12:47:33 +0000910}
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000911
Christian Heimes3b718a72008-02-14 12:47:33 +0000912void
913PyTuple_Fini(void)
914{
915#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000916 /* empty tuples are used all over the place and applications may
917 * rely on the fact that an empty tuple is a singleton. */
Serhiy Storchaka98a97222014-02-09 13:14:04 +0200918 Py_CLEAR(free_list[0]);
Christian Heimes3b718a72008-02-14 12:47:33 +0000919
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000920 (void)PyTuple_ClearFreeList();
Christian Heimes3b718a72008-02-14 12:47:33 +0000921#endif
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000922#ifdef SHOW_TRACK_COUNT
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000923 show_track();
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000924#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000925}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000926
927/*********************** Tuple Iterator **************************/
928
929typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000930 PyObject_HEAD
931 long it_index;
932 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000933} tupleiterobject;
934
Raymond Hettinger48923c52002-08-09 01:30:17 +0000935static void
936tupleiter_dealloc(tupleiterobject *it)
937{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000938 _PyObject_GC_UNTRACK(it);
939 Py_XDECREF(it->it_seq);
940 PyObject_GC_Del(it);
Raymond Hettinger48923c52002-08-09 01:30:17 +0000941}
942
943static int
944tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
945{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000946 Py_VISIT(it->it_seq);
947 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000948}
949
Raymond Hettinger48923c52002-08-09 01:30:17 +0000950static PyObject *
951tupleiter_next(tupleiterobject *it)
952{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000953 PyTupleObject *seq;
954 PyObject *item;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000955
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000956 assert(it != NULL);
957 seq = it->it_seq;
958 if (seq == NULL)
959 return NULL;
960 assert(PyTuple_Check(seq));
Raymond Hettinger48923c52002-08-09 01:30:17 +0000961
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000962 if (it->it_index < PyTuple_GET_SIZE(seq)) {
963 item = PyTuple_GET_ITEM(seq, it->it_index);
964 ++it->it_index;
965 Py_INCREF(item);
966 return item;
967 }
Raymond Hettinger48923c52002-08-09 01:30:17 +0000968
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000969 Py_DECREF(seq);
970 it->it_seq = NULL;
971 return NULL;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000972}
973
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000974static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +0000975tupleiter_len(tupleiterobject *it)
976{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000977 Py_ssize_t len = 0;
978 if (it->it_seq)
979 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
980 return PyInt_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +0000981}
982
Armin Rigof5b3e362006-02-11 21:32:43 +0000983PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000984
985static PyMethodDef tupleiter_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000986 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
987 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000988};
989
Raymond Hettinger48923c52002-08-09 01:30:17 +0000990PyTypeObject PyTupleIter_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000991 PyVarObject_HEAD_INIT(&PyType_Type, 0)
992 "tupleiterator", /* tp_name */
993 sizeof(tupleiterobject), /* tp_basicsize */
994 0, /* tp_itemsize */
995 /* methods */
996 (destructor)tupleiter_dealloc, /* tp_dealloc */
997 0, /* tp_print */
998 0, /* tp_getattr */
999 0, /* tp_setattr */
1000 0, /* tp_compare */
1001 0, /* tp_repr */
1002 0, /* tp_as_number */
1003 0, /* tp_as_sequence */
1004 0, /* tp_as_mapping */
1005 0, /* tp_hash */
1006 0, /* tp_call */
1007 0, /* tp_str */
1008 PyObject_GenericGetAttr, /* tp_getattro */
1009 0, /* tp_setattro */
1010 0, /* tp_as_buffer */
1011 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1012 0, /* tp_doc */
1013 (traverseproc)tupleiter_traverse, /* tp_traverse */
1014 0, /* tp_clear */
1015 0, /* tp_richcompare */
1016 0, /* tp_weaklistoffset */
1017 PyObject_SelfIter, /* tp_iter */
1018 (iternextfunc)tupleiter_next, /* tp_iternext */
1019 tupleiter_methods, /* tp_methods */
1020 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +00001021};
Martin v. Löwis72d20672006-04-11 09:04:12 +00001022
1023static PyObject *
1024tuple_iter(PyObject *seq)
1025{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001026 tupleiterobject *it;
Martin v. Löwis72d20672006-04-11 09:04:12 +00001027
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001028 if (!PyTuple_Check(seq)) {
1029 PyErr_BadInternalCall();
1030 return NULL;
1031 }
1032 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
1033 if (it == NULL)
1034 return NULL;
1035 it->it_index = 0;
1036 Py_INCREF(seq);
1037 it->it_seq = (PyTupleObject *)seq;
1038 _PyObject_GC_TRACK(it);
1039 return (PyObject *)it;
Martin v. Löwis72d20672006-04-11 09:04:12 +00001040}