blob: 143a62c5e00a936a9d7649df56562cc4ce9b7051 [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
8#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{
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 Heimes5b970ad2008-02-06 13:33:44 +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 Heimes5b970ad2008-02-06 13:33:44 +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 Heimese93237d2007-12-19 02:37:44 +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 Norwitze7d8be82008-07-31 17:17:14 +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 Norwitze7d8be82008-07-31 17:17:14 +000089
Neil Schemenauere83c00e2001-08-29 23:54:21 +000090 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000091 if (op == NULL)
Neil Schemenauere83c00e2001-08-29 23:54:21 +000092 return NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000093 }
Armin Rigo6fce78e2004-03-21 22:29:05 +000094 for (i=0; i < size; i++)
95 op->ob_item[i] = NULL;
Christian Heimes5b970ad2008-02-06 13:33:44 +000096#if PyTuple_MAXSAVESIZE > 0
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000097 if (size == 0) {
Christian Heimes5b970ad2008-02-06 13:33:44 +000098 free_list[0] = op;
99 ++numfree[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000101 }
102#endif
Antoine Pitrou1fba6242009-03-23 19:17:00 +0000103#ifdef SHOW_TRACK_COUNT
104 count_tracked++;
105#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000106 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107 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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 if (!PyTuple_Check(op)) {
114 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115 return -1;
116 }
117 else
Christian Heimese93237d2007-12-19 02:37:44 +0000118 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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 if (!PyTuple_Check(op)) {
125 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 return NULL;
127 }
Christian Heimese93237d2007-12-19 02:37:44 +0000128 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130 return NULL;
131 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 register PyObject *olditem;
139 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000140 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 Py_XDECREF(newitem);
142 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000143 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144 }
Christian Heimese93237d2007-12-19 02:37:44 +0000145 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 Py_XDECREF(newitem);
147 PyErr_SetString(PyExc_IndexError,
148 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000149 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000152 olditem = *p;
153 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155 return 0;
156}
157
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000158void
159_PyTuple_MaybeUntrack(PyObject *op)
160{
161 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 }
177#ifdef SHOW_TRACK_COUNT
178 count_tracked--;
179 count_untracked++;
180#endif
181 _PyObject_GC_UNTRACK(op);
182}
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{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000187 Py_ssize_t i;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000188 PyObject *o;
189 PyObject *result;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000190 PyObject **items;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000191 va_list vargs;
192
193 va_start(vargs, n);
194 result = PyTuple_New(n);
195 if (result == NULL)
196 return NULL;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000197 items = ((PyTupleObject *)result)->ob_item;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000198 for (i = 0; i < n; i++) {
199 o = va_arg(vargs, PyObject *);
200 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000201 items[i] = o;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000202 }
203 va_end(vargs);
204 return result;
205}
206
207
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208/* Methods */
209
210static void
Fred Drakeba096332000-07-09 07:04:36 +0000211tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000213 register Py_ssize_t i;
Christian Heimese93237d2007-12-19 02:37:44 +0000214 register Py_ssize_t len = Py_SIZE(op);
Guido van Rossumff413af2002-03-28 20:34:59 +0000215 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000216 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000217 if (len > 0) {
218 i = len;
Armin Rigo6fce78e2004-03-21 22:29:05 +0000219 while (--i >= 0)
220 Py_XDECREF(op->ob_item[i]);
Christian Heimes5b970ad2008-02-06 13:33:44 +0000221#if PyTuple_MAXSAVESIZE > 0
222 if (len < PyTuple_MAXSAVESIZE &&
223 numfree[len] < PyTuple_MAXFREELIST &&
Christian Heimese93237d2007-12-19 02:37:44 +0000224 Py_TYPE(op) == &PyTuple_Type)
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000225 {
Christian Heimes5b970ad2008-02-06 13:33:44 +0000226 op->ob_item[0] = (PyObject *) free_list[len];
227 numfree[len]++;
228 free_list[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000229 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000230 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000231#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000232 }
Christian Heimese93237d2007-12-19 02:37:44 +0000233 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000234done:
235 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236}
237
Guido van Rossum49e85141991-06-07 22:59:30 +0000238static int
Fred Drakeba096332000-07-09 07:04:36 +0000239tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000241 Py_ssize_t i;
Brett Cannon01531592007-09-17 03:28:34 +0000242 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 fprintf(fp, "(");
Brett Cannon01531592007-09-17 03:28:34 +0000244 Py_END_ALLOW_THREADS
Christian Heimese93237d2007-12-19 02:37:44 +0000245 for (i = 0; i < Py_SIZE(op); i++) {
Brett Cannon01531592007-09-17 03:28:34 +0000246 if (i > 0) {
247 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248 fprintf(fp, ", ");
Brett Cannon01531592007-09-17 03:28:34 +0000249 Py_END_ALLOW_THREADS
250 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000252 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253 }
Christian Heimese93237d2007-12-19 02:37:44 +0000254 i = Py_SIZE(op);
Brett Cannon01531592007-09-17 03:28:34 +0000255 Py_BEGIN_ALLOW_THREADS
256 if (i == 1)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257 fprintf(fp, ",");
258 fprintf(fp, ")");
Brett Cannon01531592007-09-17 03:28:34 +0000259 Py_END_ALLOW_THREADS
Guido van Rossum49e85141991-06-07 22:59:30 +0000260 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261}
262
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000263static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000264tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000266 Py_ssize_t i, n;
Tim Petersa7259592001-06-16 05:11:17 +0000267 PyObject *s, *temp;
268 PyObject *pieces, *result = NULL;
269
Christian Heimese93237d2007-12-19 02:37:44 +0000270 n = Py_SIZE(v);
Brett Cannon31ba8482007-09-30 20:37:19 +0000271 if (n == 0)
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000272 return PyString_FromString("()");
Brett Cannon31ba8482007-09-30 20:37:19 +0000273
Brett Cannon0b14f242007-09-30 19:45:10 +0000274 /* While not mutable, it is still possible to end up with a cycle in a
275 tuple through an object that stores itself within a tuple (and thus
276 infinitely asks for the repr of itself). This should only be
277 possible within a type. */
278 i = Py_ReprEnter((PyObject *)v);
279 if (i != 0) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000280 return i > 0 ? PyString_FromString("(...)") : NULL;
Brett Cannon0b14f242007-09-30 19:45:10 +0000281 }
282
Tim Petersa7259592001-06-16 05:11:17 +0000283 pieces = PyTuple_New(n);
284 if (pieces == NULL)
285 return NULL;
286
287 /* Do repr() on each element. */
288 for (i = 0; i < n; ++i) {
Brett Cannon0b14f242007-09-30 19:45:10 +0000289 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
290 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000291 s = PyObject_Repr(v->ob_item[i]);
Brett Cannon0b14f242007-09-30 19:45:10 +0000292 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000293 if (s == NULL)
294 goto Done;
295 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 }
Tim Petersa7259592001-06-16 05:11:17 +0000297
298 /* Add "()" decorations to the first and last items. */
299 assert(n > 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000300 s = PyString_FromString("(");
Tim Petersa7259592001-06-16 05:11:17 +0000301 if (s == NULL)
302 goto Done;
303 temp = PyTuple_GET_ITEM(pieces, 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000304 PyString_ConcatAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000305 PyTuple_SET_ITEM(pieces, 0, s);
306 if (s == NULL)
307 goto Done;
308
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000309 s = PyString_FromString(n == 1 ? ",)" : ")");
Tim Petersa7259592001-06-16 05:11:17 +0000310 if (s == NULL)
311 goto Done;
312 temp = PyTuple_GET_ITEM(pieces, n-1);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000313 PyString_ConcatAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000314 PyTuple_SET_ITEM(pieces, n-1, temp);
315 if (temp == NULL)
316 goto Done;
317
318 /* Paste them all together with ", " between. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000319 s = PyString_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000320 if (s == NULL)
321 goto Done;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000322 result = _PyString_Join(s, pieces);
Tim Petersa7259592001-06-16 05:11:17 +0000323 Py_DECREF(s);
324
325Done:
326 Py_DECREF(pieces);
Brett Cannon0b14f242007-09-30 19:45:10 +0000327 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000328 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329}
330
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000331/* The addend 82520, was selected from the range(0, 1000000) for
332 generating the greatest number of prime multipliers for tuples
333 upto length eight:
334
335 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
336 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
337*/
338
Guido van Rossum9bfef441993-03-29 10:43:31 +0000339static long
Fred Drakeba096332000-07-09 07:04:36 +0000340tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000341{
342 register long x, y;
Christian Heimese93237d2007-12-19 02:37:44 +0000343 register Py_ssize_t len = Py_SIZE(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 register PyObject **p;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000345 long mult = 1000003L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000346 x = 0x345678L;
347 p = v->ob_item;
348 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000350 if (y == -1)
351 return -1;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000352 x = (x ^ y) * mult;
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000353 /* the cast might truncate len; that doesn't change hash stability */
354 mult += (long)(82520L + len + len);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000355 }
Raymond Hettinger57c2d932004-06-10 18:42:15 +0000356 x += 97531L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000357 if (x == -1)
358 x = -2;
359 return x;
360}
361
Martin v. Löwis18e16552006-02-15 17:27:45 +0000362static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000363tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364{
Christian Heimese93237d2007-12-19 02:37:44 +0000365 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366}
367
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000368static int
Fred Drakeba096332000-07-09 07:04:36 +0000369tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000370{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000371 Py_ssize_t i;
372 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000373
Christian Heimese93237d2007-12-19 02:37:44 +0000374 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
Guido van Rossumf77bc622001-01-18 00:00:53 +0000375 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000376 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000377 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000378}
379
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000381tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000382{
Christian Heimese93237d2007-12-19 02:37:44 +0000383 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 return NULL;
386 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388 return a->ob_item[i];
389}
390
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000392tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
393 register Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395 register PyTupleObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000396 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000397 register Py_ssize_t i;
398 Py_ssize_t len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399 if (ilow < 0)
400 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000401 if (ihigh > Py_SIZE(a))
402 ihigh = Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403 if (ihigh < ilow)
404 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000405 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 Py_INCREF(a);
407 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408 }
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000409 len = ihigh - ilow;
410 np = (PyTupleObject *)PyTuple_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411 if (np == NULL)
412 return NULL;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000413 src = a->ob_item + ilow;
414 dest = np->ob_item;
415 for (i = 0; i < len; i++) {
416 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000418 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421}
422
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000424PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000425{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 if (op == NULL || !PyTuple_Check(op)) {
427 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000428 return NULL;
429 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000431}
432
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000434tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000436 register Py_ssize_t size;
437 register Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000438 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 PyTupleObject *np;
440 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000441 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000442 "can only concatenate tuple (not \"%.200s\") to tuple",
Christian Heimese93237d2007-12-19 02:37:44 +0000443 Py_TYPE(bb)->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444 return NULL;
445 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446#define b ((PyTupleObject *)bb)
Christian Heimese93237d2007-12-19 02:37:44 +0000447 size = Py_SIZE(a) + Py_SIZE(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000448 if (size < 0)
449 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000452 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000454 src = a->ob_item;
455 dest = np->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000456 for (i = 0; i < Py_SIZE(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000457 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000459 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000461 src = b->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000462 dest = np->ob_item + Py_SIZE(a);
463 for (i = 0; i < Py_SIZE(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000464 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000466 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469#undef b
470}
471
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000473tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000474{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000475 Py_ssize_t i, j;
476 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 PyTupleObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000478 PyObject **p, **items;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000479 if (n < 0)
480 n = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000481 if (Py_SIZE(a) == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000482 if (PyTuple_CheckExact(a)) {
483 /* Since tuples are immutable, we can return a shared
484 copy in this case */
485 Py_INCREF(a);
486 return (PyObject *)a;
487 }
Christian Heimese93237d2007-12-19 02:37:44 +0000488 if (Py_SIZE(a) == 0)
Tim Peters7b07a412001-09-11 19:48:03 +0000489 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000490 }
Christian Heimese93237d2007-12-19 02:37:44 +0000491 size = Py_SIZE(a) * n;
492 if (size/Py_SIZE(a) != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000493 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000495 if (np == NULL)
496 return NULL;
497 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000498 items = a->ob_item;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000499 for (i = 0; i < n; i++) {
Christian Heimese93237d2007-12-19 02:37:44 +0000500 for (j = 0; j < Py_SIZE(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000501 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000503 p++;
504 }
505 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000506 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000507}
508
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000509static PyObject *
510tupleindex(PyTupleObject *self, PyObject *args)
511{
512 Py_ssize_t i, start=0, stop=Py_SIZE(self);
513 PyObject *v;
514
515 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
516 _PyEval_SliceIndex, &start,
517 _PyEval_SliceIndex, &stop))
518 return NULL;
519 if (start < 0) {
520 start += Py_SIZE(self);
521 if (start < 0)
522 start = 0;
523 }
524 if (stop < 0) {
525 stop += Py_SIZE(self);
526 if (stop < 0)
527 stop = 0;
528 }
529 for (i = start; i < stop && i < Py_SIZE(self); i++) {
530 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
531 if (cmp > 0)
Raymond Hettinger55285ef2008-02-07 02:12:52 +0000532 return PyInt_FromSsize_t(i);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000533 else if (cmp < 0)
534 return NULL;
535 }
Benjamin Peterson1706c642009-03-15 14:38:55 +0000536 PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in tuple");
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000537 return NULL;
538}
539
540static PyObject *
541tuplecount(PyTupleObject *self, PyObject *v)
542{
543 Py_ssize_t count = 0;
544 Py_ssize_t i;
545
546 for (i = 0; i < Py_SIZE(self); i++) {
547 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
548 if (cmp > 0)
549 count++;
550 else if (cmp < 0)
551 return NULL;
552 }
Raymond Hettinger55285ef2008-02-07 02:12:52 +0000553 return PyInt_FromSsize_t(count);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000554}
555
Jeremy Hylton8caad492000-06-23 14:18:11 +0000556static int
557tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
558{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000559 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000560
Christian Heimese93237d2007-12-19 02:37:44 +0000561 for (i = Py_SIZE(o); --i >= 0; )
Thomas Woutersc6e55062006-04-15 21:47:09 +0000562 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000563 return 0;
564}
565
Guido van Rossumf77bc622001-01-18 00:00:53 +0000566static PyObject *
567tuplerichcompare(PyObject *v, PyObject *w, int op)
568{
569 PyTupleObject *vt, *wt;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000570 Py_ssize_t i;
571 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000572
573 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
574 Py_INCREF(Py_NotImplemented);
575 return Py_NotImplemented;
576 }
577
578 vt = (PyTupleObject *)v;
579 wt = (PyTupleObject *)w;
580
Christian Heimese93237d2007-12-19 02:37:44 +0000581 vlen = Py_SIZE(vt);
582 wlen = Py_SIZE(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000583
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000584 /* Note: the corresponding code for lists has an "early out" test
585 * here when op is EQ or NE and the lengths differ. That pays there,
586 * but Tim was unable to find any real code where EQ/NE tuple
587 * compares don't have the same length, so testing for it here would
588 * have cost without benefit.
589 */
590
591 /* Search for the first index where items are different.
592 * Note that because tuples are immutable, it's safe to reuse
593 * vlen and wlen across the comparison calls.
594 */
595 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000596 int k = PyObject_RichCompareBool(vt->ob_item[i],
597 wt->ob_item[i], Py_EQ);
598 if (k < 0)
599 return NULL;
600 if (!k)
601 break;
602 }
603
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000604 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000605 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000606 int cmp;
607 PyObject *res;
608 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000609 case Py_LT: cmp = vlen < wlen; break;
610 case Py_LE: cmp = vlen <= wlen; break;
611 case Py_EQ: cmp = vlen == wlen; break;
612 case Py_NE: cmp = vlen != wlen; break;
613 case Py_GT: cmp = vlen > wlen; break;
614 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000615 default: return NULL; /* cannot happen */
616 }
617 if (cmp)
618 res = Py_True;
619 else
620 res = Py_False;
621 Py_INCREF(res);
622 return res;
623 }
624
625 /* We have an item that differs -- shortcuts for EQ/NE */
626 if (op == Py_EQ) {
627 Py_INCREF(Py_False);
628 return Py_False;
629 }
630 if (op == Py_NE) {
631 Py_INCREF(Py_True);
632 return Py_True;
633 }
634
635 /* Compare the final item again using the proper operator */
636 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
637}
638
Jeremy Hylton938ace62002-07-17 16:30:39 +0000639static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000640tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
641
Tim Peters6d6c1a32001-08-02 04:15:00 +0000642static PyObject *
643tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
644{
645 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000646 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000647
Guido van Rossumae960af2001-08-30 03:11:59 +0000648 if (type != &PyTuple_Type)
649 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000650 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
651 return NULL;
652
653 if (arg == NULL)
654 return PyTuple_New(0);
655 else
656 return PySequence_Tuple(arg);
657}
658
Guido van Rossumae960af2001-08-30 03:11:59 +0000659static PyObject *
660tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
661{
Anthony Baxtera6286212006-04-11 07:42:36 +0000662 PyObject *tmp, *newobj, *item;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000663 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000664
665 assert(PyType_IsSubtype(type, &PyTuple_Type));
666 tmp = tuple_new(&PyTuple_Type, args, kwds);
667 if (tmp == NULL)
668 return NULL;
669 assert(PyTuple_Check(tmp));
Anthony Baxtera6286212006-04-11 07:42:36 +0000670 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
671 if (newobj == NULL)
Guido van Rossumae960af2001-08-30 03:11:59 +0000672 return NULL;
673 for (i = 0; i < n; i++) {
674 item = PyTuple_GET_ITEM(tmp, i);
675 Py_INCREF(item);
Anthony Baxtera6286212006-04-11 07:42:36 +0000676 PyTuple_SET_ITEM(newobj, i, item);
Guido van Rossumae960af2001-08-30 03:11:59 +0000677 }
678 Py_DECREF(tmp);
Anthony Baxtera6286212006-04-11 07:42:36 +0000679 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000680}
681
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000682PyDoc_STRVAR(tuple_doc,
Ezio Melottifb501122010-02-28 23:59:00 +0000683"tuple() -> empty tuple\n\
684tuple(iterable) -> tuple initialized from iterable's items\n\
685\n\
686If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000687
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688static PySequenceMethods tuple_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000689 (lenfunc)tuplelength, /* sq_length */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000690 (binaryfunc)tupleconcat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000691 (ssizeargfunc)tuplerepeat, /* sq_repeat */
692 (ssizeargfunc)tupleitem, /* sq_item */
693 (ssizessizeargfunc)tupleslice, /* sq_slice */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000694 0, /* sq_ass_item */
695 0, /* sq_ass_slice */
696 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000697};
698
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000699static PyObject*
700tuplesubscript(PyTupleObject* self, PyObject* item)
701{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000702 if (PyIndex_Check(item)) {
703 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000704 if (i == -1 && PyErr_Occurred())
705 return NULL;
706 if (i < 0)
707 i += PyTuple_GET_SIZE(self);
708 return tupleitem(self, i);
709 }
710 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000711 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000712 PyObject* result;
713 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000714 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000715
716 if (PySlice_GetIndicesEx((PySliceObject*)item,
717 PyTuple_GET_SIZE(self),
718 &start, &stop, &step, &slicelength) < 0) {
719 return NULL;
720 }
721
722 if (slicelength <= 0) {
723 return PyTuple_New(0);
724 }
Thomas Wouters3ccec682007-08-28 15:28:19 +0000725 else if (start == 0 && step == 1 &&
726 slicelength == PyTuple_GET_SIZE(self) &&
727 PyTuple_CheckExact(self)) {
728 Py_INCREF(self);
729 return (PyObject *)self;
730 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000731 else {
732 result = PyTuple_New(slicelength);
Georg Brandl5c170fd2006-03-17 19:03:25 +0000733 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000734
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000735 src = self->ob_item;
736 dest = ((PyTupleObject *)result)->ob_item;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000737 for (cur = start, i = 0; i < slicelength;
738 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000739 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000740 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000741 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000742 }
743
744 return result;
745 }
746 }
747 else {
Georg Brandl283a1352006-11-19 08:48:30 +0000748 PyErr_Format(PyExc_TypeError,
749 "tuple indices must be integers, not %.200s",
Christian Heimese93237d2007-12-19 02:37:44 +0000750 Py_TYPE(item)->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000751 return NULL;
752 }
753}
754
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000755static PyObject *
756tuple_getnewargs(PyTupleObject *v)
757{
Christian Heimese93237d2007-12-19 02:37:44 +0000758 return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000759
760}
761
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000762static PyObject *
763tuple_sizeof(PyTupleObject *self)
764{
765 Py_ssize_t res;
766
767 res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
768 return PyInt_FromSsize_t(res);
769}
770
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000771PyDoc_STRVAR(index_doc,
Andrew M. Kuchlingb15d6fb2008-10-04 01:03:42 +0000772"T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
773"Raises ValueError if the value is not present."
774);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000775PyDoc_STRVAR(count_doc,
776"T.count(value) -> integer -- return number of occurrences of value");
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000777PyDoc_STRVAR(sizeof_doc,
778"T.__sizeof__() -- size of T in memory, in bytes");
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000779
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000780static PyMethodDef tuple_methods[] = {
781 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000782 {"__sizeof__", (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000783 {"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc},
784 {"count", (PyCFunction)tuplecount, METH_O, count_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000785 {NULL, NULL} /* sentinel */
786};
787
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000788static PyMappingMethods tuple_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000789 (lenfunc)tuplelength,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000790 (binaryfunc)tuplesubscript,
791 0
792};
793
Raymond Hettinger48923c52002-08-09 01:30:17 +0000794static PyObject *tuple_iter(PyObject *seq);
795
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000796PyTypeObject PyTuple_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000797 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000798 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000799 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000800 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000801 (destructor)tupledealloc, /* tp_dealloc */
802 (printfunc)tupleprint, /* tp_print */
803 0, /* tp_getattr */
804 0, /* tp_setattr */
805 0, /* tp_compare */
806 (reprfunc)tuplerepr, /* tp_repr */
807 0, /* tp_as_number */
808 &tuple_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000809 &tuple_as_mapping, /* tp_as_mapping */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000810 (hashfunc)tuplehash, /* tp_hash */
811 0, /* tp_call */
812 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000813 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000814 0, /* tp_setattro */
815 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000816 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +0000817 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000818 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000819 (traverseproc)tupletraverse, /* tp_traverse */
820 0, /* tp_clear */
821 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000822 0, /* tp_weaklistoffset */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000823 tuple_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000824 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000825 tuple_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000826 0, /* tp_members */
827 0, /* tp_getset */
828 0, /* tp_base */
829 0, /* tp_dict */
830 0, /* tp_descr_get */
831 0, /* tp_descr_set */
832 0, /* tp_dictoffset */
833 0, /* tp_init */
834 0, /* tp_alloc */
835 tuple_new, /* tp_new */
Neil Schemenauer626d7742002-04-12 03:05:52 +0000836 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000837};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000838
839/* The following function breaks the notion that tuples are immutable:
840 it changes the size of a tuple. We get away with this only if there
841 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000842 as creating a new tuple object and destroying the old one, only more
843 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000844 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000845
846int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000847_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000848{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 register PyTupleObject *v;
850 register PyTupleObject *sv;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000851 Py_ssize_t i;
852 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000853
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000854 v = (PyTupleObject *) *pv;
Christian Heimese93237d2007-12-19 02:37:44 +0000855 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
856 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000857 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000858 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000859 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000860 return -1;
861 }
Christian Heimese93237d2007-12-19 02:37:44 +0000862 oldsize = Py_SIZE(v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000863 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000864 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000865
Guido van Rossumf70590f2001-12-07 20:00:04 +0000866 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000867 /* Empty tuples are often shared, so we should never
868 resize them in-place even if we do own the only
869 (current) reference */
870 Py_DECREF(v);
871 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000872 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000873 }
874
Guido van Rossum12d12c51993-10-26 17:58:25 +0000875 /* XXX UNREF/NEWREF interface should be more symmetrical */
Tim Peters34592512002-07-11 06:23:50 +0000876 _Py_DEC_REFTOTAL;
Antoine Pitrouc169c782009-12-12 19:13:08 +0000877 if (_PyObject_GC_IS_TRACKED(v))
878 _PyObject_GC_UNTRACK(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000879 _Py_ForgetReference((PyObject *) v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000880 /* DECREF items deleted by shrinkage */
881 for (i = newsize; i < oldsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000882 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000883 v->ob_item[i] = NULL;
884 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000885 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000886 if (sv == NULL) {
887 *pv = NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000888 PyObject_GC_Del(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000889 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000890 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000891 _Py_NewReference((PyObject *) sv);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000892 /* Zero out items added by growing */
Neal Norwitz35fc7602002-06-13 21:11:11 +0000893 if (newsize > oldsize)
Jeremy Hylton8b47dff2002-06-20 23:13:17 +0000894 memset(&sv->ob_item[oldsize], 0,
895 sizeof(*sv->ob_item) * (newsize - oldsize));
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000896 *pv = (PyObject *) sv;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000897 _PyObject_GC_TRACK(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000898 return 0;
899}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000900
Christian Heimes3b718a72008-02-14 12:47:33 +0000901int
902PyTuple_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000903{
Christian Heimes3b718a72008-02-14 12:47:33 +0000904 int freelist_size = 0;
Christian Heimes5b970ad2008-02-06 13:33:44 +0000905#if PyTuple_MAXSAVESIZE > 0
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000906 int i;
Christian Heimes5b970ad2008-02-06 13:33:44 +0000907 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000908 PyTupleObject *p, *q;
Christian Heimes5b970ad2008-02-06 13:33:44 +0000909 p = free_list[i];
Christian Heimes3b718a72008-02-14 12:47:33 +0000910 freelist_size += numfree[i];
Christian Heimes5b970ad2008-02-06 13:33:44 +0000911 free_list[i] = NULL;
Christian Heimes3b718a72008-02-14 12:47:33 +0000912 numfree[i] = 0;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000913 while (p) {
914 q = p;
915 p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000916 PyObject_GC_Del(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000917 }
918 }
919#endif
Christian Heimes3b718a72008-02-14 12:47:33 +0000920 return freelist_size;
921}
922
923void
924PyTuple_Fini(void)
925{
926#if PyTuple_MAXSAVESIZE > 0
927 /* empty tuples are used all over the place and applications may
928 * rely on the fact that an empty tuple is a singleton. */
929 Py_XDECREF(free_list[0]);
930 free_list[0] = NULL;
931
932 (void)PyTuple_ClearFreeList();
933#endif
Antoine Pitrouf8387af2009-03-23 18:41:45 +0000934#ifdef SHOW_TRACK_COUNT
935 show_track();
936#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000937}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000938
939/*********************** Tuple Iterator **************************/
940
941typedef struct {
942 PyObject_HEAD
943 long it_index;
944 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
945} tupleiterobject;
946
Raymond Hettinger48923c52002-08-09 01:30:17 +0000947static void
948tupleiter_dealloc(tupleiterobject *it)
949{
950 _PyObject_GC_UNTRACK(it);
951 Py_XDECREF(it->it_seq);
952 PyObject_GC_Del(it);
953}
954
955static int
956tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
957{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000958 Py_VISIT(it->it_seq);
959 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000960}
961
Raymond Hettinger48923c52002-08-09 01:30:17 +0000962static PyObject *
963tupleiter_next(tupleiterobject *it)
964{
965 PyTupleObject *seq;
966 PyObject *item;
967
968 assert(it != NULL);
969 seq = it->it_seq;
970 if (seq == NULL)
971 return NULL;
972 assert(PyTuple_Check(seq));
973
974 if (it->it_index < PyTuple_GET_SIZE(seq)) {
975 item = PyTuple_GET_ITEM(seq, it->it_index);
976 ++it->it_index;
977 Py_INCREF(item);
978 return item;
979 }
980
981 Py_DECREF(seq);
982 it->it_seq = NULL;
983 return NULL;
984}
985
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000986static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +0000987tupleiter_len(tupleiterobject *it)
988{
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000989 Py_ssize_t len = 0;
Raymond Hettinger435bf582004-03-18 22:43:10 +0000990 if (it->it_seq)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000991 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000992 return PyInt_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +0000993}
994
Armin Rigof5b3e362006-02-11 21:32:43 +0000995PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000996
997static PyMethodDef tupleiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +0000998 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000999 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00001000};
1001
Raymond Hettinger48923c52002-08-09 01:30:17 +00001002PyTypeObject PyTupleIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001003 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger48923c52002-08-09 01:30:17 +00001004 "tupleiterator", /* tp_name */
1005 sizeof(tupleiterobject), /* tp_basicsize */
1006 0, /* tp_itemsize */
1007 /* methods */
1008 (destructor)tupleiter_dealloc, /* tp_dealloc */
1009 0, /* tp_print */
1010 0, /* tp_getattr */
1011 0, /* tp_setattr */
1012 0, /* tp_compare */
1013 0, /* tp_repr */
1014 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001015 0, /* tp_as_sequence */
Raymond Hettinger48923c52002-08-09 01:30:17 +00001016 0, /* tp_as_mapping */
1017 0, /* tp_hash */
1018 0, /* tp_call */
1019 0, /* tp_str */
1020 PyObject_GenericGetAttr, /* tp_getattro */
1021 0, /* tp_setattro */
1022 0, /* tp_as_buffer */
1023 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1024 0, /* tp_doc */
1025 (traverseproc)tupleiter_traverse, /* tp_traverse */
1026 0, /* tp_clear */
1027 0, /* tp_richcompare */
1028 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00001029 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger48923c52002-08-09 01:30:17 +00001030 (iternextfunc)tupleiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001031 tupleiter_methods, /* tp_methods */
1032 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +00001033};
Martin v. Löwis72d20672006-04-11 09:04:12 +00001034
1035static PyObject *
1036tuple_iter(PyObject *seq)
1037{
1038 tupleiterobject *it;
1039
1040 if (!PyTuple_Check(seq)) {
1041 PyErr_BadInternalCall();
1042 return NULL;
1043 }
1044 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
1045 if (it == NULL)
1046 return NULL;
1047 it->it_index = 0;
1048 Py_INCREF(seq);
1049 it->it_seq = (PyTupleObject *)seq;
1050 _PyObject_GC_TRACK(it);
1051 return (PyObject *)it;
1052}