blob: 9145b58806a1fba9a6753daa6096a3557ecd654c [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
8#define PyTuple_MAXSAVESIZE 20 /* Largest tuple to save on free list */
Guido van Rossum5ce78f82000-04-21 21:15:05 +00009#endif
Christian Heimes2202f872008-02-06 14:31:34 +000010#ifndef PyTuple_MAXFREELIST
11#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{
38 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)));
44}
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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 register PyTupleObject *op;
Martin v. Löwis18e16552006-02-15 17:27:45 +000052 Py_ssize_t i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055 return NULL;
56 }
Christian Heimes2202f872008-02-06 14:31:34 +000057#if PyTuple_MAXSAVESIZE > 0
58 if (size == 0 && free_list[0]) {
59 op = free_list[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000061#ifdef COUNT_ALLOCS
62 tuple_zero_allocs++;
63#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000065 }
Christian Heimes2202f872008-02-06 14:31:34 +000066 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
70 fast_tuple_allocs++;
71#endif
Guido van Rossume3a8e7e2002-08-19 19:26:42 +000072 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000073#ifdef Py_TRACE_REFS
Christian Heimes90aa7642007-12-19 02:45:37 +000074 Py_SIZE(op) = size;
75 Py_TYPE(op) = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000076#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000077 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000078 }
79 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000080#endif
81 {
Martin v. Löwis18e16552006-02-15 17:27:45 +000082 Py_ssize_t nbytes = size * sizeof(PyObject *);
Guido van Rossum5bc51f21999-07-12 23:06:58 +000083 /* Check for overflow */
84 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Neal Norwitz3ce5d922008-08-24 07:08:55 +000085 (nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)))
Guido van Rossum5bc51f21999-07-12 23:06:58 +000086 {
87 return PyErr_NoMemory();
88 }
Neal Norwitz3ce5d922008-08-24 07:08:55 +000089 nbytes += sizeof(PyTupleObject) - sizeof(PyObject *);
90
Neil Schemenauere83c00e2001-08-29 23:54:21 +000091 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000092 if (op == NULL)
Neil Schemenauere83c00e2001-08-29 23:54:21 +000093 return NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000094 }
Armin Rigo6fce78e2004-03-21 22:29:05 +000095 for (i=0; i < size; i++)
96 op->ob_item[i] = NULL;
Christian Heimes2202f872008-02-06 14:31:34 +000097#if PyTuple_MAXSAVESIZE > 0
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000098 if (size == 0) {
Christian Heimes2202f872008-02-06 14:31:34 +000099 free_list[0] = op;
100 ++numfree[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000102 }
103#endif
Antoine Pitrouacc5d6b2009-03-23 19:19:54 +0000104#ifdef SHOW_TRACK_COUNT
105 count_tracked++;
106#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000107 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 if (!PyTuple_Check(op)) {
115 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 return -1;
117 }
118 else
Christian Heimes90aa7642007-12-19 02:45:37 +0000119 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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 if (!PyTuple_Check(op)) {
126 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127 return NULL;
128 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000129 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131 return NULL;
132 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 register PyObject *olditem;
140 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000141 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 Py_XDECREF(newitem);
143 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000144 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000146 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 Py_XDECREF(newitem);
148 PyErr_SetString(PyExc_IndexError,
149 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000150 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000153 olditem = *p;
154 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156 return 0;
157}
158
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000159void
160_PyTuple_MaybeUntrack(PyObject *op)
161{
162 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 }
178#ifdef SHOW_TRACK_COUNT
179 count_tracked--;
180 count_untracked++;
181#endif
182 _PyObject_GC_UNTRACK(op);
183}
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{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000188 Py_ssize_t i;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000189 PyObject *o;
190 PyObject *result;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000191 PyObject **items;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000192 va_list vargs;
193
194 va_start(vargs, n);
195 result = PyTuple_New(n);
196 if (result == NULL)
197 return NULL;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000198 items = ((PyTupleObject *)result)->ob_item;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000199 for (i = 0; i < n; i++) {
200 o = va_arg(vargs, PyObject *);
201 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000202 items[i] = o;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000203 }
204 va_end(vargs);
205 return result;
206}
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{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000214 register Py_ssize_t i;
Christian Heimes90aa7642007-12-19 02:45:37 +0000215 register Py_ssize_t len = Py_SIZE(op);
Guido van Rossumff413af2002-03-28 20:34:59 +0000216 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000217 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000218 if (len > 0) {
219 i = len;
Armin Rigo6fce78e2004-03-21 22:29:05 +0000220 while (--i >= 0)
221 Py_XDECREF(op->ob_item[i]);
Christian Heimes2202f872008-02-06 14:31:34 +0000222#if PyTuple_MAXSAVESIZE > 0
223 if (len < PyTuple_MAXSAVESIZE &&
224 numfree[len] < PyTuple_MAXFREELIST &&
Christian Heimes90aa7642007-12-19 02:45:37 +0000225 Py_TYPE(op) == &PyTuple_Type)
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000226 {
Christian Heimes2202f872008-02-06 14:31:34 +0000227 op->ob_item[0] = (PyObject *) free_list[len];
228 numfree[len]++;
229 free_list[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000230 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000231 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000232#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000233 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000234 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000235done:
236 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{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000242 Py_ssize_t i, n;
Tim Petersa7259592001-06-16 05:11:17 +0000243 PyObject *s, *temp;
244 PyObject *pieces, *result = NULL;
245
Christian Heimes90aa7642007-12-19 02:45:37 +0000246 n = Py_SIZE(v);
Tim Petersa7259592001-06-16 05:11:17 +0000247 if (n == 0)
Walter Dörwald1ab83302007-05-18 17:15:44 +0000248 return PyUnicode_FromString("()");
Tim Petersa7259592001-06-16 05:11:17 +0000249
Guido van Rossum8ce8a782007-11-01 19:42:39 +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) {
Alexandre Vassalotti3fe82162008-05-03 01:37:08 +0000256 return i > 0 ? PyUnicode_FromString("(...)") : NULL;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000257 }
258
Tim Petersa7259592001-06-16 05:11:17 +0000259 pieces = PyTuple_New(n);
260 if (pieces == NULL)
261 return NULL;
262
263 /* Do repr() on each element. */
264 for (i = 0; i < n; ++i) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000265 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
266 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000267 s = PyObject_Repr(v->ob_item[i]);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000268 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000269 if (s == NULL)
270 goto Done;
271 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272 }
Tim Petersa7259592001-06-16 05:11:17 +0000273
274 /* Add "()" decorations to the first and last items. */
275 assert(n > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000276 s = PyUnicode_FromString("(");
Tim Petersa7259592001-06-16 05:11:17 +0000277 if (s == NULL)
278 goto Done;
279 temp = PyTuple_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000280 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000281 PyTuple_SET_ITEM(pieces, 0, s);
282 if (s == NULL)
283 goto Done;
284
Walter Dörwald1ab83302007-05-18 17:15:44 +0000285 s = PyUnicode_FromString(n == 1 ? ",)" : ")");
Tim Petersa7259592001-06-16 05:11:17 +0000286 if (s == NULL)
287 goto Done;
288 temp = PyTuple_GET_ITEM(pieces, n-1);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000289 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000290 PyTuple_SET_ITEM(pieces, n-1, temp);
291 if (temp == NULL)
292 goto Done;
293
294 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +0000295 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000296 if (s == NULL)
297 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000298 result = PyUnicode_Join(s, pieces);
Tim Petersa7259592001-06-16 05:11:17 +0000299 Py_DECREF(s);
300
301Done:
302 Py_DECREF(pieces);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000303 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000304 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305}
306
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000307/* The addend 82520, was selected from the range(0, 1000000) for
308 generating the greatest number of prime multipliers for tuples
309 upto length eight:
310
311 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
312 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
313*/
314
Guido van Rossum9bfef441993-03-29 10:43:31 +0000315static long
Fred Drakeba096332000-07-09 07:04:36 +0000316tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000317{
318 register long x, y;
Christian Heimes90aa7642007-12-19 02:45:37 +0000319 register Py_ssize_t len = Py_SIZE(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 register PyObject **p;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000321 long mult = 1000003L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000322 x = 0x345678L;
323 p = v->ob_item;
324 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000326 if (y == -1)
327 return -1;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000328 x = (x ^ y) * mult;
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000329 /* the cast might truncate len; that doesn't change hash stability */
330 mult += (long)(82520L + len + len);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000331 }
Raymond Hettinger57c2d932004-06-10 18:42:15 +0000332 x += 97531L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000333 if (x == -1)
334 x = -2;
335 return x;
336}
337
Martin v. Löwis18e16552006-02-15 17:27:45 +0000338static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000339tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340{
Christian Heimes90aa7642007-12-19 02:45:37 +0000341 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342}
343
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000344static int
Fred Drakeba096332000-07-09 07:04:36 +0000345tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000346{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000347 Py_ssize_t i;
348 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000349
Christian Heimes90aa7642007-12-19 02:45:37 +0000350 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
Guido van Rossumf77bc622001-01-18 00:00:53 +0000351 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000352 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000353 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000354}
355
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000357tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358{
Christian Heimes90aa7642007-12-19 02:45:37 +0000359 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361 return NULL;
362 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364 return a->ob_item[i];
365}
366
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000368tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
369 register Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 register PyTupleObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000372 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000373 register Py_ssize_t i;
374 Py_ssize_t len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 if (ilow < 0)
376 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000377 if (ihigh > Py_SIZE(a))
378 ihigh = Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379 if (ihigh < ilow)
380 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000381 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 Py_INCREF(a);
383 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 }
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000385 len = ihigh - ilow;
386 np = (PyTupleObject *)PyTuple_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387 if (np == NULL)
388 return NULL;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000389 src = a->ob_item + ilow;
390 dest = np->ob_item;
391 for (i = 0; i < len; i++) {
392 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000394 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397}
398
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000400PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000401{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 if (op == NULL || !PyTuple_Check(op)) {
403 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000404 return NULL;
405 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000407}
408
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000410tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000412 register Py_ssize_t size;
413 register Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000414 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 PyTupleObject *np;
416 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000417 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000418 "can only concatenate tuple (not \"%.200s\") to tuple",
Christian Heimes90aa7642007-12-19 02:45:37 +0000419 Py_TYPE(bb)->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 return NULL;
421 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422#define b ((PyTupleObject *)bb)
Christian Heimes90aa7642007-12-19 02:45:37 +0000423 size = Py_SIZE(a) + Py_SIZE(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000424 if (size < 0)
425 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000428 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000430 src = a->ob_item;
431 dest = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000432 for (i = 0; i < Py_SIZE(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000433 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000435 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000437 src = b->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000438 dest = np->ob_item + Py_SIZE(a);
439 for (i = 0; i < Py_SIZE(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000440 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000442 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445#undef b
446}
447
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000449tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000450{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000451 Py_ssize_t i, j;
452 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 PyTupleObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000454 PyObject **p, **items;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000455 if (n < 0)
456 n = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000457 if (Py_SIZE(a) == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000458 if (PyTuple_CheckExact(a)) {
459 /* Since tuples are immutable, we can return a shared
460 copy in this case */
461 Py_INCREF(a);
462 return (PyObject *)a;
463 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000464 if (Py_SIZE(a) == 0)
Tim Peters7b07a412001-09-11 19:48:03 +0000465 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000466 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000467 size = Py_SIZE(a) * n;
468 if (size/Py_SIZE(a) != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000469 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000471 if (np == NULL)
472 return NULL;
473 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000474 items = a->ob_item;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000475 for (i = 0; i < n; i++) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000476 for (j = 0; j < Py_SIZE(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000477 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000479 p++;
480 }
481 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000483}
484
Raymond Hettinger65baa342008-02-07 00:41:02 +0000485static PyObject *
486tupleindex(PyTupleObject *self, PyObject *args)
487{
488 Py_ssize_t i, start=0, stop=Py_SIZE(self);
489 PyObject *v;
490
491 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
492 _PyEval_SliceIndex, &start,
493 _PyEval_SliceIndex, &stop))
494 return NULL;
495 if (start < 0) {
496 start += Py_SIZE(self);
497 if (start < 0)
498 start = 0;
499 }
500 if (stop < 0) {
501 stop += Py_SIZE(self);
502 if (stop < 0)
503 stop = 0;
504 }
505 for (i = start; i < stop && i < Py_SIZE(self); i++) {
506 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
507 if (cmp > 0)
508 return PyLong_FromSsize_t(i);
509 else if (cmp < 0)
510 return NULL;
511 }
Benjamin Petersonf07d0022009-03-21 17:31:58 +0000512 PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in tuple");
Raymond Hettinger65baa342008-02-07 00:41:02 +0000513 return NULL;
514}
515
516static PyObject *
517tuplecount(PyTupleObject *self, PyObject *v)
518{
519 Py_ssize_t count = 0;
520 Py_ssize_t i;
521
522 for (i = 0; i < Py_SIZE(self); i++) {
523 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
524 if (cmp > 0)
525 count++;
526 else if (cmp < 0)
527 return NULL;
528 }
529 return PyLong_FromSsize_t(count);
530}
531
Jeremy Hylton8caad492000-06-23 14:18:11 +0000532static int
533tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
534{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000535 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000536
Christian Heimes90aa7642007-12-19 02:45:37 +0000537 for (i = Py_SIZE(o); --i >= 0; )
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000538 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000539 return 0;
540}
541
Guido van Rossumf77bc622001-01-18 00:00:53 +0000542static PyObject *
543tuplerichcompare(PyObject *v, PyObject *w, int op)
544{
545 PyTupleObject *vt, *wt;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000546 Py_ssize_t i;
547 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000548
549 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
550 Py_INCREF(Py_NotImplemented);
551 return Py_NotImplemented;
552 }
553
554 vt = (PyTupleObject *)v;
555 wt = (PyTupleObject *)w;
556
Christian Heimes90aa7642007-12-19 02:45:37 +0000557 vlen = Py_SIZE(vt);
558 wlen = Py_SIZE(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000559
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000560 /* Note: the corresponding code for lists has an "early out" test
561 * here when op is EQ or NE and the lengths differ. That pays there,
562 * but Tim was unable to find any real code where EQ/NE tuple
563 * compares don't have the same length, so testing for it here would
564 * have cost without benefit.
565 */
566
567 /* Search for the first index where items are different.
568 * Note that because tuples are immutable, it's safe to reuse
569 * vlen and wlen across the comparison calls.
570 */
571 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000572 int k = PyObject_RichCompareBool(vt->ob_item[i],
573 wt->ob_item[i], Py_EQ);
574 if (k < 0)
575 return NULL;
576 if (!k)
577 break;
578 }
579
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000580 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000581 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000582 int cmp;
583 PyObject *res;
584 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000585 case Py_LT: cmp = vlen < wlen; break;
586 case Py_LE: cmp = vlen <= wlen; break;
587 case Py_EQ: cmp = vlen == wlen; break;
588 case Py_NE: cmp = vlen != wlen; break;
589 case Py_GT: cmp = vlen > wlen; break;
590 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000591 default: return NULL; /* cannot happen */
592 }
593 if (cmp)
594 res = Py_True;
595 else
596 res = Py_False;
597 Py_INCREF(res);
598 return res;
599 }
600
601 /* We have an item that differs -- shortcuts for EQ/NE */
602 if (op == Py_EQ) {
603 Py_INCREF(Py_False);
604 return Py_False;
605 }
606 if (op == Py_NE) {
607 Py_INCREF(Py_True);
608 return Py_True;
609 }
610
611 /* Compare the final item again using the proper operator */
612 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
613}
614
Jeremy Hylton938ace62002-07-17 16:30:39 +0000615static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000616tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
617
Tim Peters6d6c1a32001-08-02 04:15:00 +0000618static PyObject *
619tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
620{
621 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000622 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623
Guido van Rossumae960af2001-08-30 03:11:59 +0000624 if (type != &PyTuple_Type)
625 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000626 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
627 return NULL;
628
629 if (arg == NULL)
630 return PyTuple_New(0);
631 else
632 return PySequence_Tuple(arg);
633}
634
Guido van Rossumae960af2001-08-30 03:11:59 +0000635static PyObject *
636tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
637{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000638 PyObject *tmp, *newobj, *item;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000639 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000640
641 assert(PyType_IsSubtype(type, &PyTuple_Type));
642 tmp = tuple_new(&PyTuple_Type, args, kwds);
643 if (tmp == NULL)
644 return NULL;
645 assert(PyTuple_Check(tmp));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000646 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
647 if (newobj == NULL)
Guido van Rossumae960af2001-08-30 03:11:59 +0000648 return NULL;
649 for (i = 0; i < n; i++) {
650 item = PyTuple_GET_ITEM(tmp, i);
651 Py_INCREF(item);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000652 PyTuple_SET_ITEM(newobj, i, item);
Guido van Rossumae960af2001-08-30 03:11:59 +0000653 }
654 Py_DECREF(tmp);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000655 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000656}
657
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000658PyDoc_STRVAR(tuple_doc,
Ezio Melotti7f807b72010-03-01 04:08:34 +0000659"tuple() -> empty tuple\n\
660tuple(iterable) -> tuple initialized from iterable's items\n\
661\n\
662If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000663
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664static PySequenceMethods tuple_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000665 (lenfunc)tuplelength, /* sq_length */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000666 (binaryfunc)tupleconcat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000667 (ssizeargfunc)tuplerepeat, /* sq_repeat */
668 (ssizeargfunc)tupleitem, /* sq_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000669 0, /* sq_slice */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000670 0, /* sq_ass_item */
671 0, /* sq_ass_slice */
672 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000673};
674
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000675static PyObject*
676tuplesubscript(PyTupleObject* self, PyObject* item)
677{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000678 if (PyIndex_Check(item)) {
679 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000680 if (i == -1 && PyErr_Occurred())
681 return NULL;
682 if (i < 0)
683 i += PyTuple_GET_SIZE(self);
684 return tupleitem(self, i);
685 }
686 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000687 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000688 PyObject* result;
689 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000690 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000691
692 if (PySlice_GetIndicesEx((PySliceObject*)item,
693 PyTuple_GET_SIZE(self),
694 &start, &stop, &step, &slicelength) < 0) {
695 return NULL;
696 }
697
698 if (slicelength <= 0) {
699 return PyTuple_New(0);
700 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000701 else if (start == 0 && step == 1 &&
702 slicelength == PyTuple_GET_SIZE(self) &&
703 PyTuple_CheckExact(self)) {
704 Py_INCREF(self);
705 return (PyObject *)self;
706 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000707 else {
708 result = PyTuple_New(slicelength);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000709 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000710
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000711 src = self->ob_item;
712 dest = ((PyTupleObject *)result)->ob_item;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000713 for (cur = start, i = 0; i < slicelength;
714 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000715 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000716 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000717 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000718 }
719
720 return result;
721 }
722 }
723 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000724 PyErr_Format(PyExc_TypeError,
725 "tuple indices must be integers, not %.200s",
Christian Heimes90aa7642007-12-19 02:45:37 +0000726 Py_TYPE(item)->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000727 return NULL;
728 }
729}
730
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000731static PyObject *
732tuple_getnewargs(PyTupleObject *v)
733{
Christian Heimes90aa7642007-12-19 02:45:37 +0000734 return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000735
736}
737
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000738static PyObject *
739tuple_sizeof(PyTupleObject *self)
740{
741 Py_ssize_t res;
742
743 res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
744 return PyLong_FromSsize_t(res);
745}
746
Raymond Hettinger65baa342008-02-07 00:41:02 +0000747PyDoc_STRVAR(index_doc,
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000748"T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
749"Raises ValueError if the value is not present."
750);
Raymond Hettinger65baa342008-02-07 00:41:02 +0000751PyDoc_STRVAR(count_doc,
752"T.count(value) -> integer -- return number of occurrences of value");
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000753PyDoc_STRVAR(sizeof_doc,
754"T.__sizeof__() -- size of T in memory, in bytes");
Raymond Hettinger65baa342008-02-07 00:41:02 +0000755
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000756static PyMethodDef tuple_methods[] = {
757 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000758 {"__sizeof__", (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
Raymond Hettinger65baa342008-02-07 00:41:02 +0000759 {"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc},
760 {"count", (PyCFunction)tuplecount, METH_O, count_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000761 {NULL, NULL} /* sentinel */
762};
763
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000764static PyMappingMethods tuple_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000765 (lenfunc)tuplelength,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000766 (binaryfunc)tuplesubscript,
767 0
768};
769
Raymond Hettinger48923c52002-08-09 01:30:17 +0000770static PyObject *tuple_iter(PyObject *seq);
771
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772PyTypeObject PyTuple_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000773 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000774 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000775 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000776 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000777 (destructor)tupledealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +0000778 0, /* tp_print */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000779 0, /* tp_getattr */
780 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000781 0, /* tp_reserved */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000782 (reprfunc)tuplerepr, /* tp_repr */
783 0, /* tp_as_number */
784 &tuple_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000785 &tuple_as_mapping, /* tp_as_mapping */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000786 (hashfunc)tuplehash, /* tp_hash */
787 0, /* tp_call */
788 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000789 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000790 0, /* tp_setattro */
791 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000792 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +0000793 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000794 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000795 (traverseproc)tupletraverse, /* tp_traverse */
796 0, /* tp_clear */
797 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000798 0, /* tp_weaklistoffset */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000799 tuple_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000800 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000801 tuple_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000802 0, /* tp_members */
803 0, /* tp_getset */
804 0, /* tp_base */
805 0, /* tp_dict */
806 0, /* tp_descr_get */
807 0, /* tp_descr_set */
808 0, /* tp_dictoffset */
809 0, /* tp_init */
810 0, /* tp_alloc */
811 tuple_new, /* tp_new */
Neil Schemenauer626d7742002-04-12 03:05:52 +0000812 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000813};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000814
815/* The following function breaks the notion that tuples are immutable:
816 it changes the size of a tuple. We get away with this only if there
817 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000818 as creating a new tuple object and destroying the old one, only more
819 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000820 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000821
822int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000823_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000824{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000825 register PyTupleObject *v;
826 register PyTupleObject *sv;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000827 Py_ssize_t i;
828 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000829
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000830 v = (PyTupleObject *) *pv;
Christian Heimes90aa7642007-12-19 02:45:37 +0000831 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
832 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000833 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000834 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000835 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000836 return -1;
837 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000838 oldsize = Py_SIZE(v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000839 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000840 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000841
Guido van Rossumf70590f2001-12-07 20:00:04 +0000842 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000843 /* Empty tuples are often shared, so we should never
844 resize them in-place even if we do own the only
845 (current) reference */
846 Py_DECREF(v);
847 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000848 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000849 }
850
Guido van Rossum12d12c51993-10-26 17:58:25 +0000851 /* XXX UNREF/NEWREF interface should be more symmetrical */
Tim Peters34592512002-07-11 06:23:50 +0000852 _Py_DEC_REFTOTAL;
Antoine Pitrou6b7dfc92009-12-12 19:18:27 +0000853 if (_PyObject_GC_IS_TRACKED(v))
854 _PyObject_GC_UNTRACK(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000855 _Py_ForgetReference((PyObject *) v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000856 /* DECREF items deleted by shrinkage */
857 for (i = newsize; i < oldsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000858 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000859 v->ob_item[i] = NULL;
860 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000861 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000862 if (sv == NULL) {
863 *pv = NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000864 PyObject_GC_Del(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000865 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000866 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000867 _Py_NewReference((PyObject *) sv);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000868 /* Zero out items added by growing */
Neal Norwitz35fc7602002-06-13 21:11:11 +0000869 if (newsize > oldsize)
Jeremy Hylton8b47dff2002-06-20 23:13:17 +0000870 memset(&sv->ob_item[oldsize], 0,
871 sizeof(*sv->ob_item) * (newsize - oldsize));
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000872 *pv = (PyObject *) sv;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000873 _PyObject_GC_TRACK(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000874 return 0;
875}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000876
Christian Heimesa156e092008-02-16 07:38:31 +0000877int
878PyTuple_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000879{
Christian Heimesa156e092008-02-16 07:38:31 +0000880 int freelist_size = 0;
Christian Heimes2202f872008-02-06 14:31:34 +0000881#if PyTuple_MAXSAVESIZE > 0
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000882 int i;
Christian Heimes2202f872008-02-06 14:31:34 +0000883 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000884 PyTupleObject *p, *q;
Christian Heimes2202f872008-02-06 14:31:34 +0000885 p = free_list[i];
Christian Heimesa156e092008-02-16 07:38:31 +0000886 freelist_size += numfree[i];
Christian Heimes2202f872008-02-06 14:31:34 +0000887 free_list[i] = NULL;
Christian Heimesa156e092008-02-16 07:38:31 +0000888 numfree[i] = 0;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000889 while (p) {
890 q = p;
891 p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000892 PyObject_GC_Del(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000893 }
894 }
895#endif
Christian Heimesa156e092008-02-16 07:38:31 +0000896 return freelist_size;
897}
898
899void
900PyTuple_Fini(void)
901{
902#if PyTuple_MAXSAVESIZE > 0
903 /* empty tuples are used all over the place and applications may
904 * rely on the fact that an empty tuple is a singleton. */
905 Py_XDECREF(free_list[0]);
906 free_list[0] = NULL;
907
908 (void)PyTuple_ClearFreeList();
909#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000910#ifdef SHOW_TRACK_COUNT
911 show_track();
912#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000913}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000914
915/*********************** Tuple Iterator **************************/
916
917typedef struct {
918 PyObject_HEAD
919 long it_index;
920 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
921} tupleiterobject;
922
Raymond Hettinger48923c52002-08-09 01:30:17 +0000923static void
924tupleiter_dealloc(tupleiterobject *it)
925{
926 _PyObject_GC_UNTRACK(it);
927 Py_XDECREF(it->it_seq);
928 PyObject_GC_Del(it);
929}
930
931static int
932tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
933{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000934 Py_VISIT(it->it_seq);
935 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000936}
937
Raymond Hettinger48923c52002-08-09 01:30:17 +0000938static PyObject *
939tupleiter_next(tupleiterobject *it)
940{
941 PyTupleObject *seq;
942 PyObject *item;
943
944 assert(it != NULL);
945 seq = it->it_seq;
946 if (seq == NULL)
947 return NULL;
948 assert(PyTuple_Check(seq));
949
950 if (it->it_index < PyTuple_GET_SIZE(seq)) {
951 item = PyTuple_GET_ITEM(seq, it->it_index);
952 ++it->it_index;
953 Py_INCREF(item);
954 return item;
955 }
956
957 Py_DECREF(seq);
958 it->it_seq = NULL;
959 return NULL;
960}
961
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000962static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +0000963tupleiter_len(tupleiterobject *it)
964{
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000965 Py_ssize_t len = 0;
Raymond Hettinger435bf582004-03-18 22:43:10 +0000966 if (it->it_seq)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000967 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
Christian Heimes217cfd12007-12-02 14:31:20 +0000968 return PyLong_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +0000969}
970
Armin Rigof5b3e362006-02-11 21:32:43 +0000971PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000972
973static PyMethodDef tupleiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +0000974 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000975 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000976};
977
Raymond Hettinger48923c52002-08-09 01:30:17 +0000978PyTypeObject PyTupleIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000979 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000980 "tuple_iterator", /* tp_name */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000981 sizeof(tupleiterobject), /* tp_basicsize */
982 0, /* tp_itemsize */
983 /* methods */
984 (destructor)tupleiter_dealloc, /* tp_dealloc */
985 0, /* tp_print */
986 0, /* tp_getattr */
987 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000988 0, /* tp_reserved */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000989 0, /* tp_repr */
990 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000991 0, /* tp_as_sequence */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000992 0, /* tp_as_mapping */
993 0, /* tp_hash */
994 0, /* tp_call */
995 0, /* tp_str */
996 PyObject_GenericGetAttr, /* tp_getattro */
997 0, /* tp_setattro */
998 0, /* tp_as_buffer */
999 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1000 0, /* tp_doc */
1001 (traverseproc)tupleiter_traverse, /* tp_traverse */
1002 0, /* tp_clear */
1003 0, /* tp_richcompare */
1004 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00001005 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger48923c52002-08-09 01:30:17 +00001006 (iternextfunc)tupleiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001007 tupleiter_methods, /* tp_methods */
1008 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +00001009};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001010
1011static PyObject *
1012tuple_iter(PyObject *seq)
1013{
1014 tupleiterobject *it;
1015
1016 if (!PyTuple_Check(seq)) {
1017 PyErr_BadInternalCall();
1018 return NULL;
1019 }
1020 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
1021 if (it == NULL)
1022 return NULL;
1023 it->it_index = 0;
1024 Py_INCREF(seq);
1025 it->it_seq = (PyTupleObject *)seq;
1026 _PyObject_GC_TRACK(it);
1027 return (PyObject *)it;
1028}