blob: 9e914cb6344858f2560cc4f84698f7d042a34dc3 [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"
Antoine Pitrou0197ff92012-03-22 14:38:16 +01005#include "accu.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
Guido van Rossum5ce78f82000-04-21 21:15:05 +00007/* Speed optimization to avoid frequent malloc/free of small tuples */
Christian Heimes2202f872008-02-06 14:31:34 +00008#ifndef PyTuple_MAXSAVESIZE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00009#define PyTuple_MAXSAVESIZE 20 /* Largest tuple to save on free list */
Guido van Rossum5ce78f82000-04-21 21:15:05 +000010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000011#ifndef PyTuple_MAXFREELIST
Christian Heimes2202f872008-02-06 14:31:34 +000012#define PyTuple_MAXFREELIST 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000013#endif
14
Christian Heimes2202f872008-02-06 14:31:34 +000015#if PyTuple_MAXSAVESIZE > 0
16/* Entries 1 up to PyTuple_MAXSAVESIZE are free lists, entry 0 is the empty
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000017 tuple () of which at most one instance will be allocated.
18*/
Christian Heimes2202f872008-02-06 14:31:34 +000019static PyTupleObject *free_list[PyTuple_MAXSAVESIZE];
20static int numfree[PyTuple_MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000021#endif
22#ifdef COUNT_ALLOCS
Benjamin Petersona4a37fe2009-01-11 17:13:55 +000023Py_ssize_t fast_tuple_allocs;
24Py_ssize_t tuple_zero_allocs;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000025#endif
26
Antoine Pitrou3a652b12009-03-23 18:52:06 +000027/* Debug statistic to count GC tracking of tuples.
28 Please note that tuples are only untracked when considered by the GC, and
29 many of them will be dead before. Therefore, a tracking rate close to 100%
30 does not necessarily prove that the heuristic is inefficient.
31*/
32#ifdef SHOW_TRACK_COUNT
33static Py_ssize_t count_untracked = 0;
34static Py_ssize_t count_tracked = 0;
35
36static void
37show_track(void)
38{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000039 fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n",
40 count_tracked + count_untracked);
41 fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T
42 "d\n", count_tracked);
43 fprintf(stderr, "%.2f%% tuple tracking rate\n\n",
44 (100.0*count_tracked/(count_untracked+count_tracked)));
Antoine Pitrou3a652b12009-03-23 18:52:06 +000045}
46#endif
47
48
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000050PyTuple_New(register Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 register PyTupleObject *op;
53 Py_ssize_t i;
54 if (size < 0) {
55 PyErr_BadInternalCall();
56 return NULL;
57 }
Christian Heimes2202f872008-02-06 14:31:34 +000058#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000059 if (size == 0 && free_list[0]) {
60 op = free_list[0];
61 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000062#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 tuple_zero_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 return (PyObject *) op;
66 }
67 if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {
68 free_list[size] = (PyTupleObject *) op->ob_item[0];
69 numfree[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000070#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 fast_tuple_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000072#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000074#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 Py_SIZE(op) = size;
76 Py_TYPE(op) = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 _Py_NewReference((PyObject *)op);
79 }
80 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000081#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 {
83 Py_ssize_t nbytes = size * sizeof(PyObject *);
84 /* Check for overflow */
85 if (nbytes / sizeof(PyObject *) != (size_t)size ||
86 (nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)))
87 {
88 return PyErr_NoMemory();
89 }
90 nbytes += sizeof(PyTupleObject) - sizeof(PyObject *);
Neal Norwitz3ce5d922008-08-24 07:08:55 +000091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
93 if (op == NULL)
94 return NULL;
95 }
96 for (i=0; i < size; i++)
97 op->ob_item[i] = NULL;
Christian Heimes2202f872008-02-06 14:31:34 +000098#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 if (size == 0) {
100 free_list[0] = op;
101 ++numfree[0];
102 Py_INCREF(op); /* extra INCREF so that this is never freed */
103 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000104#endif
Antoine Pitrouacc5d6b2009-03-23 19:19:54 +0000105#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 count_tracked++;
Antoine Pitrouacc5d6b2009-03-23 19:19:54 +0000107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 _PyObject_GC_TRACK(op);
109 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110}
111
Martin v. Löwis18e16552006-02-15 17:27:45 +0000112Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000113PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 if (!PyTuple_Check(op)) {
116 PyErr_BadInternalCall();
117 return -1;
118 }
119 else
120 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121}
122
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000124PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 if (!PyTuple_Check(op)) {
127 PyErr_BadInternalCall();
128 return NULL;
129 }
130 if (i < 0 || i >= Py_SIZE(op)) {
131 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
132 return NULL;
133 }
134 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135}
136
137int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000138PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 register PyObject *olditem;
141 register PyObject **p;
142 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
143 Py_XDECREF(newitem);
144 PyErr_BadInternalCall();
145 return -1;
146 }
147 if (i < 0 || i >= Py_SIZE(op)) {
148 Py_XDECREF(newitem);
149 PyErr_SetString(PyExc_IndexError,
150 "tuple assignment index out of range");
151 return -1;
152 }
153 p = ((PyTupleObject *)op) -> ob_item + i;
154 olditem = *p;
155 *p = newitem;
156 Py_XDECREF(olditem);
157 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158}
159
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000160void
161_PyTuple_MaybeUntrack(PyObject *op)
162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 PyTupleObject *t;
164 Py_ssize_t i, n;
165
166 if (!PyTuple_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
167 return;
168 t = (PyTupleObject *) op;
169 n = Py_SIZE(t);
170 for (i = 0; i < n; i++) {
171 PyObject *elt = PyTuple_GET_ITEM(t, i);
172 /* Tuple with NULL elements aren't
173 fully constructed, don't untrack
174 them yet. */
175 if (!elt ||
176 _PyObject_GC_MAY_BE_TRACKED(elt))
177 return;
178 }
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000179#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 count_tracked--;
181 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000184}
185
Raymond Hettingercb2da432003-10-12 18:24:34 +0000186PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000187PyTuple_Pack(Py_ssize_t n, ...)
Raymond Hettingercb2da432003-10-12 18:24:34 +0000188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 Py_ssize_t i;
190 PyObject *o;
191 PyObject *result;
192 PyObject **items;
193 va_list vargs;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 va_start(vargs, n);
196 result = PyTuple_New(n);
Christian Heimesd5a88042012-09-10 02:54:51 +0200197 if (result == NULL) {
198 va_end(vargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 return NULL;
Christian Heimesd5a88042012-09-10 02:54:51 +0200200 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 items = ((PyTupleObject *)result)->ob_item;
202 for (i = 0; i < n; i++) {
203 o = va_arg(vargs, PyObject *);
204 Py_INCREF(o);
205 items[i] = o;
206 }
207 va_end(vargs);
208 return result;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000209}
210
211
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212/* Methods */
213
214static void
Fred Drakeba096332000-07-09 07:04:36 +0000215tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 register Py_ssize_t i;
218 register Py_ssize_t len = Py_SIZE(op);
219 PyObject_GC_UnTrack(op);
220 Py_TRASHCAN_SAFE_BEGIN(op)
221 if (len > 0) {
222 i = len;
223 while (--i >= 0)
224 Py_XDECREF(op->ob_item[i]);
Christian Heimes2202f872008-02-06 14:31:34 +0000225#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 if (len < PyTuple_MAXSAVESIZE &&
227 numfree[len] < PyTuple_MAXFREELIST &&
228 Py_TYPE(op) == &PyTuple_Type)
229 {
230 op->ob_item[0] = (PyObject *) free_list[len];
231 numfree[len]++;
232 free_list[len] = op;
233 goto done; /* return */
234 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 }
237 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000238done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240}
241
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000243tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 Py_ssize_t i, n;
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200246 PyObject *s = NULL;
247 _PyAccu acc;
248 static PyObject *sep = NULL;
Tim Petersa7259592001-06-16 05:11:17 +0000249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 n = Py_SIZE(v);
251 if (n == 0)
252 return PyUnicode_FromString("()");
Tim Petersa7259592001-06-16 05:11:17 +0000253
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200254 if (sep == NULL) {
255 sep = PyUnicode_FromString(", ");
256 if (sep == NULL)
257 return NULL;
258 }
259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 /* While not mutable, it is still possible to end up with a cycle in a
261 tuple through an object that stores itself within a tuple (and thus
262 infinitely asks for the repr of itself). This should only be
263 possible within a type. */
264 i = Py_ReprEnter((PyObject *)v);
265 if (i != 0) {
266 return i > 0 ? PyUnicode_FromString("(...)") : NULL;
267 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000268
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200269 if (_PyAccu_Init(&acc))
270 goto error;
271
272 s = PyUnicode_FromString("(");
273 if (s == NULL || _PyAccu_Accumulate(&acc, s))
274 goto error;
275 Py_CLEAR(s);
Tim Petersa7259592001-06-16 05:11:17 +0000276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 /* Do repr() on each element. */
278 for (i = 0; i < n; ++i) {
279 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200280 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 s = PyObject_Repr(v->ob_item[i]);
282 Py_LeaveRecursiveCall();
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200283 if (i > 0 && _PyAccu_Accumulate(&acc, sep))
284 goto error;
285 if (s == NULL || _PyAccu_Accumulate(&acc, s))
286 goto error;
287 Py_CLEAR(s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 }
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200289 if (n > 1)
290 s = PyUnicode_FromString(")");
291 else
292 s = PyUnicode_FromString(",)");
293 if (s == NULL || _PyAccu_Accumulate(&acc, s))
294 goto error;
295 Py_CLEAR(s);
Tim Petersa7259592001-06-16 05:11:17 +0000296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 Py_ReprLeave((PyObject *)v);
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200298 return _PyAccu_Finish(&acc);
299
300error:
301 _PyAccu_Destroy(&acc);
302 Py_XDECREF(s);
303 Py_ReprLeave((PyObject *)v);
304 return NULL;
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{
Gregory P. Smitha6be61e2012-12-10 18:34:09 -0800318 register Py_uhash_t x; /* Unsigned for defined overflow behavior. */
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;
Gregory P. Smith27cbcd62012-12-10 18:15:46 -0800322 Py_uhash_t mult = _PyHASH_MULTIPLIER;
323 x = 0x345678UL;
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 */
Gregory P. Smith27cbcd62012-12-10 18:15:46 -0800331 mult += (Py_uhash_t)(82520UL + len + len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 }
Gregory P. Smith27cbcd62012-12-10 18:15:46 -0800333 x += 97531UL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 if (x == -1)
335 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);
Petri Lehtinenebfaabd2011-11-06 21:02:39 +0200490 PyObject *v;
Raymond Hettinger65baa342008-02-07 00:41:02 +0000491
Petri Lehtinenebfaabd2011-11-06 21:02:39 +0200492 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
493 _PyEval_SliceIndex, &start,
494 _PyEval_SliceIndex, &stop))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
551 Py_INCREF(Py_NotImplemented);
552 return Py_NotImplemented;
553 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 vt = (PyTupleObject *)v;
556 wt = (PyTupleObject *)w;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 vlen = Py_SIZE(vt);
559 wlen = Py_SIZE(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 /* Note: the corresponding code for lists has an "early out" test
562 * here when op is EQ or NE and the lengths differ. That pays there,
563 * but Tim was unable to find any real code where EQ/NE tuple
564 * compares don't have the same length, so testing for it here would
565 * have cost without benefit.
566 */
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 /* Search for the first index where items are different.
569 * Note that because tuples are immutable, it's safe to reuse
570 * vlen and wlen across the comparison calls.
571 */
572 for (i = 0; i < vlen && i < wlen; i++) {
573 int k = PyObject_RichCompareBool(vt->ob_item[i],
574 wt->ob_item[i], Py_EQ);
575 if (k < 0)
576 return NULL;
577 if (!k)
578 break;
579 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 if (i >= vlen || i >= wlen) {
582 /* No more items to compare -- compare sizes */
583 int cmp;
584 PyObject *res;
585 switch (op) {
586 case Py_LT: cmp = vlen < wlen; break;
587 case Py_LE: cmp = vlen <= wlen; break;
588 case Py_EQ: cmp = vlen == wlen; break;
589 case Py_NE: cmp = vlen != wlen; break;
590 case Py_GT: cmp = vlen > wlen; break;
591 case Py_GE: cmp = vlen >= wlen; break;
592 default: return NULL; /* cannot happen */
593 }
594 if (cmp)
595 res = Py_True;
596 else
597 res = Py_False;
598 Py_INCREF(res);
599 return res;
600 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 /* We have an item that differs -- shortcuts for EQ/NE */
603 if (op == Py_EQ) {
604 Py_INCREF(Py_False);
605 return Py_False;
606 }
607 if (op == Py_NE) {
608 Py_INCREF(Py_True);
609 return Py_True;
610 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 /* Compare the final item again using the proper operator */
613 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000614}
615
Jeremy Hylton938ace62002-07-17 16:30:39 +0000616static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000617tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
618
Tim Peters6d6c1a32001-08-02 04:15:00 +0000619static PyObject *
620tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 PyObject *arg = NULL;
623 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 if (type != &PyTuple_Type)
626 return tuple_subtype_new(type, args, kwds);
627 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
628 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 if (arg == NULL)
631 return PyTuple_New(0);
632 else
633 return PySequence_Tuple(arg);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000634}
635
Guido van Rossumae960af2001-08-30 03:11:59 +0000636static PyObject *
637tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 PyObject *tmp, *newobj, *item;
640 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 assert(PyType_IsSubtype(type, &PyTuple_Type));
643 tmp = tuple_new(&PyTuple_Type, args, kwds);
644 if (tmp == NULL)
645 return NULL;
646 assert(PyTuple_Check(tmp));
647 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
648 if (newobj == NULL)
649 return NULL;
650 for (i = 0; i < n; i++) {
651 item = PyTuple_GET_ITEM(tmp, i);
652 Py_INCREF(item);
653 PyTuple_SET_ITEM(newobj, i, item);
654 }
655 Py_DECREF(tmp);
656 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000657}
658
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000659PyDoc_STRVAR(tuple_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +0000660"tuple() -> empty tuple\n\
661tuple(iterable) -> tuple initialized from iterable's items\n\
662\n\
663If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000664
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000665static PySequenceMethods tuple_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 (lenfunc)tuplelength, /* sq_length */
667 (binaryfunc)tupleconcat, /* sq_concat */
668 (ssizeargfunc)tuplerepeat, /* sq_repeat */
669 (ssizeargfunc)tupleitem, /* sq_item */
670 0, /* sq_slice */
671 0, /* sq_ass_item */
672 0, /* sq_ass_slice */
673 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000674};
675
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000676static PyObject*
677tuplesubscript(PyTupleObject* self, PyObject* item)
678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 if (PyIndex_Check(item)) {
680 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
681 if (i == -1 && PyErr_Occurred())
682 return NULL;
683 if (i < 0)
684 i += PyTuple_GET_SIZE(self);
685 return tupleitem(self, i);
686 }
687 else if (PySlice_Check(item)) {
688 Py_ssize_t start, stop, step, slicelength, cur, i;
689 PyObject* result;
690 PyObject* it;
691 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000692
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000693 if (PySlice_GetIndicesEx(item,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 PyTuple_GET_SIZE(self),
695 &start, &stop, &step, &slicelength) < 0) {
696 return NULL;
697 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 if (slicelength <= 0) {
700 return PyTuple_New(0);
701 }
702 else if (start == 0 && step == 1 &&
703 slicelength == PyTuple_GET_SIZE(self) &&
704 PyTuple_CheckExact(self)) {
705 Py_INCREF(self);
706 return (PyObject *)self;
707 }
708 else {
709 result = PyTuple_New(slicelength);
710 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 src = self->ob_item;
713 dest = ((PyTupleObject *)result)->ob_item;
714 for (cur = start, i = 0; i < slicelength;
715 cur += step, i++) {
716 it = src[cur];
717 Py_INCREF(it);
718 dest[i] = it;
719 }
720
721 return result;
722 }
723 }
724 else {
725 PyErr_Format(PyExc_TypeError,
726 "tuple indices must be integers, not %.200s",
727 Py_TYPE(item)->tp_name);
728 return NULL;
729 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000730}
731
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000732static PyObject *
733tuple_getnewargs(PyTupleObject *v)
734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
736
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000737}
738
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000739static PyObject *
740tuple_sizeof(PyTupleObject *self)
741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 Py_ssize_t res;
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
745 return PyLong_FromSsize_t(res);
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000746}
747
Raymond Hettinger65baa342008-02-07 00:41:02 +0000748PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000749"T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
750"Raises ValueError if the value is not present."
751);
Raymond Hettinger65baa342008-02-07 00:41:02 +0000752PyDoc_STRVAR(count_doc,
753"T.count(value) -> integer -- return number of occurrences of value");
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000754PyDoc_STRVAR(sizeof_doc,
755"T.__sizeof__() -- size of T in memory, in bytes");
Raymond Hettinger65baa342008-02-07 00:41:02 +0000756
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000757static PyMethodDef tuple_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
759 {"__sizeof__", (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
760 {"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc},
761 {"count", (PyCFunction)tuplecount, METH_O, count_doc},
762 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000763};
764
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000765static PyMappingMethods tuple_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 (lenfunc)tuplelength,
767 (binaryfunc)tuplesubscript,
768 0
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000769};
770
Raymond Hettinger48923c52002-08-09 01:30:17 +0000771static PyObject *tuple_iter(PyObject *seq);
772
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000773PyTypeObject PyTuple_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 PyVarObject_HEAD_INIT(&PyType_Type, 0)
775 "tuple",
776 sizeof(PyTupleObject) - sizeof(PyObject *),
777 sizeof(PyObject *),
778 (destructor)tupledealloc, /* tp_dealloc */
779 0, /* tp_print */
780 0, /* tp_getattr */
781 0, /* tp_setattr */
782 0, /* tp_reserved */
783 (reprfunc)tuplerepr, /* tp_repr */
784 0, /* tp_as_number */
785 &tuple_as_sequence, /* tp_as_sequence */
786 &tuple_as_mapping, /* tp_as_mapping */
787 (hashfunc)tuplehash, /* tp_hash */
788 0, /* tp_call */
789 0, /* tp_str */
790 PyObject_GenericGetAttr, /* tp_getattro */
791 0, /* tp_setattro */
792 0, /* tp_as_buffer */
793 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
794 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
795 tuple_doc, /* tp_doc */
796 (traverseproc)tupletraverse, /* tp_traverse */
797 0, /* tp_clear */
798 tuplerichcompare, /* tp_richcompare */
799 0, /* tp_weaklistoffset */
800 tuple_iter, /* tp_iter */
801 0, /* tp_iternext */
802 tuple_methods, /* tp_methods */
803 0, /* tp_members */
804 0, /* tp_getset */
805 0, /* tp_base */
806 0, /* tp_dict */
807 0, /* tp_descr_get */
808 0, /* tp_descr_set */
809 0, /* tp_dictoffset */
810 0, /* tp_init */
811 0, /* tp_alloc */
812 tuple_new, /* tp_new */
813 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000814};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000815
816/* The following function breaks the notion that tuples are immutable:
817 it changes the size of a tuple. We get away with this only if there
818 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000819 as creating a new tuple object and destroying the old one, only more
820 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000821 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000822
823int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000824_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000825{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 register PyTupleObject *v;
827 register PyTupleObject *sv;
828 Py_ssize_t i;
829 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 v = (PyTupleObject *) *pv;
832 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
833 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
834 *pv = 0;
835 Py_XDECREF(v);
836 PyErr_BadInternalCall();
837 return -1;
838 }
839 oldsize = Py_SIZE(v);
840 if (oldsize == newsize)
841 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 if (oldsize == 0) {
844 /* Empty tuples are often shared, so we should never
845 resize them in-place even if we do own the only
846 (current) reference */
847 Py_DECREF(v);
848 *pv = PyTuple_New(newsize);
849 return *pv == NULL ? -1 : 0;
850 }
Thomas Wouters6a922372001-05-28 13:11:02 +0000851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 /* XXX UNREF/NEWREF interface should be more symmetrical */
853 _Py_DEC_REFTOTAL;
854 if (_PyObject_GC_IS_TRACKED(v))
855 _PyObject_GC_UNTRACK(v);
856 _Py_ForgetReference((PyObject *) v);
857 /* DECREF items deleted by shrinkage */
858 for (i = newsize; i < oldsize; i++) {
859 Py_XDECREF(v->ob_item[i]);
860 v->ob_item[i] = NULL;
861 }
862 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
863 if (sv == NULL) {
864 *pv = NULL;
865 PyObject_GC_Del(v);
866 return -1;
867 }
868 _Py_NewReference((PyObject *) sv);
869 /* Zero out items added by growing */
870 if (newsize > oldsize)
871 memset(&sv->ob_item[oldsize], 0,
872 sizeof(*sv->ob_item) * (newsize - oldsize));
873 *pv = (PyObject *) sv;
874 _PyObject_GC_TRACK(sv);
875 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000876}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000877
Christian Heimesa156e092008-02-16 07:38:31 +0000878int
879PyTuple_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 int freelist_size = 0;
Christian Heimes2202f872008-02-06 14:31:34 +0000882#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 int i;
884 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
885 PyTupleObject *p, *q;
886 p = free_list[i];
887 freelist_size += numfree[i];
888 free_list[i] = NULL;
889 numfree[i] = 0;
890 while (p) {
891 q = p;
892 p = (PyTupleObject *)(p->ob_item[0]);
893 PyObject_GC_Del(q);
894 }
895 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 return freelist_size;
Christian Heimesa156e092008-02-16 07:38:31 +0000898}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899
Christian Heimesa156e092008-02-16 07:38:31 +0000900void
901PyTuple_Fini(void)
902{
903#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 /* empty tuples are used all over the place and applications may
905 * rely on the fact that an empty tuple is a singleton. */
906 Py_XDECREF(free_list[0]);
907 free_list[0] = NULL;
Christian Heimesa156e092008-02-16 07:38:31 +0000908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 (void)PyTuple_ClearFreeList();
Christian Heimesa156e092008-02-16 07:38:31 +0000910#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000911#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 show_track();
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000913#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000914}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000915
916/*********************** Tuple Iterator **************************/
917
918typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 PyObject_HEAD
920 long it_index;
921 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000922} tupleiterobject;
923
Raymond Hettinger48923c52002-08-09 01:30:17 +0000924static void
925tupleiter_dealloc(tupleiterobject *it)
926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 _PyObject_GC_UNTRACK(it);
928 Py_XDECREF(it->it_seq);
929 PyObject_GC_Del(it);
Raymond Hettinger48923c52002-08-09 01:30:17 +0000930}
931
932static int
933tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 Py_VISIT(it->it_seq);
936 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000937}
938
Raymond Hettinger48923c52002-08-09 01:30:17 +0000939static PyObject *
940tupleiter_next(tupleiterobject *it)
941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 PyTupleObject *seq;
943 PyObject *item;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 assert(it != NULL);
946 seq = it->it_seq;
947 if (seq == NULL)
948 return NULL;
949 assert(PyTuple_Check(seq));
Raymond Hettinger48923c52002-08-09 01:30:17 +0000950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 if (it->it_index < PyTuple_GET_SIZE(seq)) {
952 item = PyTuple_GET_ITEM(seq, it->it_index);
953 ++it->it_index;
954 Py_INCREF(item);
955 return item;
956 }
Raymond Hettinger48923c52002-08-09 01:30:17 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 Py_DECREF(seq);
959 it->it_seq = NULL;
960 return NULL;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000961}
962
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000963static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +0000964tupleiter_len(tupleiterobject *it)
965{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 Py_ssize_t len = 0;
967 if (it->it_seq)
968 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
969 return PyLong_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +0000970}
971
Armin Rigof5b3e362006-02-11 21:32:43 +0000972PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000973
974static PyMethodDef tupleiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
976 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000977};
978
Raymond Hettinger48923c52002-08-09 01:30:17 +0000979PyTypeObject PyTupleIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 PyVarObject_HEAD_INIT(&PyType_Type, 0)
981 "tuple_iterator", /* tp_name */
982 sizeof(tupleiterobject), /* tp_basicsize */
983 0, /* tp_itemsize */
984 /* methods */
985 (destructor)tupleiter_dealloc, /* tp_dealloc */
986 0, /* tp_print */
987 0, /* tp_getattr */
988 0, /* tp_setattr */
989 0, /* tp_reserved */
990 0, /* tp_repr */
991 0, /* tp_as_number */
992 0, /* tp_as_sequence */
993 0, /* tp_as_mapping */
994 0, /* tp_hash */
995 0, /* tp_call */
996 0, /* tp_str */
997 PyObject_GenericGetAttr, /* tp_getattro */
998 0, /* tp_setattro */
999 0, /* tp_as_buffer */
1000 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1001 0, /* tp_doc */
1002 (traverseproc)tupleiter_traverse, /* tp_traverse */
1003 0, /* tp_clear */
1004 0, /* tp_richcompare */
1005 0, /* tp_weaklistoffset */
1006 PyObject_SelfIter, /* tp_iter */
1007 (iternextfunc)tupleiter_next, /* tp_iternext */
1008 tupleiter_methods, /* tp_methods */
1009 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +00001010};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001011
1012static PyObject *
1013tuple_iter(PyObject *seq)
1014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 tupleiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 if (!PyTuple_Check(seq)) {
1018 PyErr_BadInternalCall();
1019 return NULL;
1020 }
1021 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
1022 if (it == NULL)
1023 return NULL;
1024 it->it_index = 0;
1025 Py_INCREF(seq);
1026 it->it_seq = (PyTupleObject *)seq;
1027 _PyObject_GC_TRACK(it);
1028 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001029}