blob: 644d8a92f69661abb179489fb03157f7642dca2d [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
Christian Heimes5b970ad2008-02-06 13:33:44 +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 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;
Antoine Pitrouf8387af2009-03-23 18:41:45 +000053#ifdef SHOW_TRACK_COUNT
54 count_tracked++;
55#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 return NULL;
59 }
Christian Heimes5b970ad2008-02-06 13:33:44 +000060#if PyTuple_MAXSAVESIZE > 0
61 if (size == 0 && free_list[0]) {
62 op = free_list[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000064#ifdef COUNT_ALLOCS
65 tuple_zero_allocs++;
66#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000067 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000068 }
Christian Heimes5b970ad2008-02-06 13:33:44 +000069 if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {
70 free_list[size] = (PyTupleObject *) op->ob_item[0];
71 numfree[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000072#ifdef COUNT_ALLOCS
73 fast_tuple_allocs++;
74#endif
Guido van Rossume3a8e7e2002-08-19 19:26:42 +000075 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000076#ifdef Py_TRACE_REFS
Christian Heimese93237d2007-12-19 02:37:44 +000077 Py_SIZE(op) = size;
78 Py_TYPE(op) = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000079#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000080 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000081 }
82 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000083#endif
84 {
Martin v. Löwis18e16552006-02-15 17:27:45 +000085 Py_ssize_t nbytes = size * sizeof(PyObject *);
Guido van Rossum5bc51f21999-07-12 23:06:58 +000086 /* Check for overflow */
87 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Neal Norwitze7d8be82008-07-31 17:17:14 +000088 (nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)))
Guido van Rossum5bc51f21999-07-12 23:06:58 +000089 {
90 return PyErr_NoMemory();
91 }
Neal Norwitze7d8be82008-07-31 17:17:14 +000092 nbytes += sizeof(PyTupleObject) - sizeof(PyObject *);
93
Neil Schemenauere83c00e2001-08-29 23:54:21 +000094 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000095 if (op == NULL)
Neil Schemenauere83c00e2001-08-29 23:54:21 +000096 return NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000097 }
Armin Rigo6fce78e2004-03-21 22:29:05 +000098 for (i=0; i < size; i++)
99 op->ob_item[i] = NULL;
Christian Heimes5b970ad2008-02-06 13:33:44 +0000100#if PyTuple_MAXSAVESIZE > 0
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000101 if (size == 0) {
Christian Heimes5b970ad2008-02-06 13:33:44 +0000102 free_list[0] = op;
103 ++numfree[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000105 }
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 Heimese93237d2007-12-19 02:37:44 +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 Heimese93237d2007-12-19 02:37:44 +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 Heimese93237d2007-12-19 02:37:44 +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 Pitrouf8387af2009-03-23 18:41:45 +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 Heimese93237d2007-12-19 02:37:44 +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 Heimes5b970ad2008-02-06 13:33:44 +0000222#if PyTuple_MAXSAVESIZE > 0
223 if (len < PyTuple_MAXSAVESIZE &&
224 numfree[len] < PyTuple_MAXFREELIST &&
Christian Heimese93237d2007-12-19 02:37:44 +0000225 Py_TYPE(op) == &PyTuple_Type)
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000226 {
Christian Heimes5b970ad2008-02-06 13:33:44 +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 Heimese93237d2007-12-19 02:37:44 +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 Rossum49e85141991-06-07 22:59:30 +0000239static int
Fred Drakeba096332000-07-09 07:04:36 +0000240tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000242 Py_ssize_t i;
Brett Cannon01531592007-09-17 03:28:34 +0000243 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244 fprintf(fp, "(");
Brett Cannon01531592007-09-17 03:28:34 +0000245 Py_END_ALLOW_THREADS
Christian Heimese93237d2007-12-19 02:37:44 +0000246 for (i = 0; i < Py_SIZE(op); i++) {
Brett Cannon01531592007-09-17 03:28:34 +0000247 if (i > 0) {
248 Py_BEGIN_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 fprintf(fp, ", ");
Brett Cannon01531592007-09-17 03:28:34 +0000250 Py_END_ALLOW_THREADS
251 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000252 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000253 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254 }
Christian Heimese93237d2007-12-19 02:37:44 +0000255 i = Py_SIZE(op);
Brett Cannon01531592007-09-17 03:28:34 +0000256 Py_BEGIN_ALLOW_THREADS
257 if (i == 1)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258 fprintf(fp, ",");
259 fprintf(fp, ")");
Brett Cannon01531592007-09-17 03:28:34 +0000260 Py_END_ALLOW_THREADS
Guido van Rossum49e85141991-06-07 22:59:30 +0000261 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262}
263
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000265tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000267 Py_ssize_t i, n;
Tim Petersa7259592001-06-16 05:11:17 +0000268 PyObject *s, *temp;
269 PyObject *pieces, *result = NULL;
270
Christian Heimese93237d2007-12-19 02:37:44 +0000271 n = Py_SIZE(v);
Brett Cannon31ba8482007-09-30 20:37:19 +0000272 if (n == 0)
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000273 return PyString_FromString("()");
Brett Cannon31ba8482007-09-30 20:37:19 +0000274
Brett Cannon0b14f242007-09-30 19:45:10 +0000275 /* While not mutable, it is still possible to end up with a cycle in a
276 tuple through an object that stores itself within a tuple (and thus
277 infinitely asks for the repr of itself). This should only be
278 possible within a type. */
279 i = Py_ReprEnter((PyObject *)v);
280 if (i != 0) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000281 return i > 0 ? PyString_FromString("(...)") : NULL;
Brett Cannon0b14f242007-09-30 19:45:10 +0000282 }
283
Tim Petersa7259592001-06-16 05:11:17 +0000284 pieces = PyTuple_New(n);
285 if (pieces == NULL)
286 return NULL;
287
288 /* Do repr() on each element. */
289 for (i = 0; i < n; ++i) {
Brett Cannon0b14f242007-09-30 19:45:10 +0000290 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
291 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000292 s = PyObject_Repr(v->ob_item[i]);
Brett Cannon0b14f242007-09-30 19:45:10 +0000293 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000294 if (s == NULL)
295 goto Done;
296 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 }
Tim Petersa7259592001-06-16 05:11:17 +0000298
299 /* Add "()" decorations to the first and last items. */
300 assert(n > 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000301 s = PyString_FromString("(");
Tim Petersa7259592001-06-16 05:11:17 +0000302 if (s == NULL)
303 goto Done;
304 temp = PyTuple_GET_ITEM(pieces, 0);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000305 PyString_ConcatAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000306 PyTuple_SET_ITEM(pieces, 0, s);
307 if (s == NULL)
308 goto Done;
309
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000310 s = PyString_FromString(n == 1 ? ",)" : ")");
Tim Petersa7259592001-06-16 05:11:17 +0000311 if (s == NULL)
312 goto Done;
313 temp = PyTuple_GET_ITEM(pieces, n-1);
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000314 PyString_ConcatAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000315 PyTuple_SET_ITEM(pieces, n-1, temp);
316 if (temp == NULL)
317 goto Done;
318
319 /* Paste them all together with ", " between. */
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000320 s = PyString_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000321 if (s == NULL)
322 goto Done;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000323 result = _PyString_Join(s, pieces);
Tim Petersa7259592001-06-16 05:11:17 +0000324 Py_DECREF(s);
325
326Done:
327 Py_DECREF(pieces);
Brett Cannon0b14f242007-09-30 19:45:10 +0000328 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000329 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330}
331
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000332/* The addend 82520, was selected from the range(0, 1000000) for
333 generating the greatest number of prime multipliers for tuples
334 upto length eight:
335
336 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
337 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
338*/
339
Guido van Rossum9bfef441993-03-29 10:43:31 +0000340static long
Fred Drakeba096332000-07-09 07:04:36 +0000341tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000342{
343 register long x, y;
Christian Heimese93237d2007-12-19 02:37:44 +0000344 register Py_ssize_t len = Py_SIZE(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 register PyObject **p;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000346 long mult = 1000003L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000347 x = 0x345678L;
348 p = v->ob_item;
349 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000351 if (y == -1)
352 return -1;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000353 x = (x ^ y) * mult;
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000354 /* the cast might truncate len; that doesn't change hash stability */
355 mult += (long)(82520L + len + len);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000356 }
Raymond Hettinger57c2d932004-06-10 18:42:15 +0000357 x += 97531L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000358 if (x == -1)
359 x = -2;
360 return x;
361}
362
Martin v. Löwis18e16552006-02-15 17:27:45 +0000363static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000364tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365{
Christian Heimese93237d2007-12-19 02:37:44 +0000366 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367}
368
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000369static int
Fred Drakeba096332000-07-09 07:04:36 +0000370tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000371{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000372 Py_ssize_t i;
373 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000374
Christian Heimese93237d2007-12-19 02:37:44 +0000375 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
Guido van Rossumf77bc622001-01-18 00:00:53 +0000376 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000377 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000378 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000379}
380
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000382tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383{
Christian Heimese93237d2007-12-19 02:37:44 +0000384 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386 return NULL;
387 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389 return a->ob_item[i];
390}
391
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000393tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
394 register Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 register PyTupleObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000397 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000398 register Py_ssize_t i;
399 Py_ssize_t len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400 if (ilow < 0)
401 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000402 if (ihigh > Py_SIZE(a))
403 ihigh = Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000404 if (ihigh < ilow)
405 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000406 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 Py_INCREF(a);
408 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409 }
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000410 len = ihigh - ilow;
411 np = (PyTupleObject *)PyTuple_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412 if (np == NULL)
413 return NULL;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000414 src = a->ob_item + ilow;
415 dest = np->ob_item;
416 for (i = 0; i < len; i++) {
417 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000419 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422}
423
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000425PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000426{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427 if (op == NULL || !PyTuple_Check(op)) {
428 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000429 return NULL;
430 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000432}
433
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000435tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000437 register Py_ssize_t size;
438 register Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000439 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 PyTupleObject *np;
441 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000442 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000443 "can only concatenate tuple (not \"%.200s\") to tuple",
Christian Heimese93237d2007-12-19 02:37:44 +0000444 Py_TYPE(bb)->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445 return NULL;
446 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447#define b ((PyTupleObject *)bb)
Christian Heimese93237d2007-12-19 02:37:44 +0000448 size = Py_SIZE(a) + Py_SIZE(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000449 if (size < 0)
450 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000453 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000455 src = a->ob_item;
456 dest = np->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000457 for (i = 0; i < Py_SIZE(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000458 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000460 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000462 src = b->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000463 dest = np->ob_item + Py_SIZE(a);
464 for (i = 0; i < Py_SIZE(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000465 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000467 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470#undef b
471}
472
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000474tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000475{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000476 Py_ssize_t i, j;
477 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 PyTupleObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000479 PyObject **p, **items;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000480 if (n < 0)
481 n = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000482 if (Py_SIZE(a) == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000483 if (PyTuple_CheckExact(a)) {
484 /* Since tuples are immutable, we can return a shared
485 copy in this case */
486 Py_INCREF(a);
487 return (PyObject *)a;
488 }
Christian Heimese93237d2007-12-19 02:37:44 +0000489 if (Py_SIZE(a) == 0)
Tim Peters7b07a412001-09-11 19:48:03 +0000490 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000491 }
Christian Heimese93237d2007-12-19 02:37:44 +0000492 size = Py_SIZE(a) * n;
493 if (size/Py_SIZE(a) != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000494 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000496 if (np == NULL)
497 return NULL;
498 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000499 items = a->ob_item;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000500 for (i = 0; i < n; i++) {
Christian Heimese93237d2007-12-19 02:37:44 +0000501 for (j = 0; j < Py_SIZE(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000502 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000504 p++;
505 }
506 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000508}
509
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000510static PyObject *
511tupleindex(PyTupleObject *self, PyObject *args)
512{
513 Py_ssize_t i, start=0, stop=Py_SIZE(self);
514 PyObject *v;
515
516 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
517 _PyEval_SliceIndex, &start,
518 _PyEval_SliceIndex, &stop))
519 return NULL;
520 if (start < 0) {
521 start += Py_SIZE(self);
522 if (start < 0)
523 start = 0;
524 }
525 if (stop < 0) {
526 stop += Py_SIZE(self);
527 if (stop < 0)
528 stop = 0;
529 }
530 for (i = start; i < stop && i < Py_SIZE(self); i++) {
531 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
532 if (cmp > 0)
Raymond Hettinger55285ef2008-02-07 02:12:52 +0000533 return PyInt_FromSsize_t(i);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000534 else if (cmp < 0)
535 return NULL;
536 }
Benjamin Peterson1706c642009-03-15 14:38:55 +0000537 PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in tuple");
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000538 return NULL;
539}
540
541static PyObject *
542tuplecount(PyTupleObject *self, PyObject *v)
543{
544 Py_ssize_t count = 0;
545 Py_ssize_t i;
546
547 for (i = 0; i < Py_SIZE(self); i++) {
548 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
549 if (cmp > 0)
550 count++;
551 else if (cmp < 0)
552 return NULL;
553 }
Raymond Hettinger55285ef2008-02-07 02:12:52 +0000554 return PyInt_FromSsize_t(count);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000555}
556
Jeremy Hylton8caad492000-06-23 14:18:11 +0000557static int
558tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
559{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000560 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000561
Christian Heimese93237d2007-12-19 02:37:44 +0000562 for (i = Py_SIZE(o); --i >= 0; )
Thomas Woutersc6e55062006-04-15 21:47:09 +0000563 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000564 return 0;
565}
566
Guido van Rossumf77bc622001-01-18 00:00:53 +0000567static PyObject *
568tuplerichcompare(PyObject *v, PyObject *w, int op)
569{
570 PyTupleObject *vt, *wt;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000571 Py_ssize_t i;
572 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000573
574 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
575 Py_INCREF(Py_NotImplemented);
576 return Py_NotImplemented;
577 }
578
579 vt = (PyTupleObject *)v;
580 wt = (PyTupleObject *)w;
581
Christian Heimese93237d2007-12-19 02:37:44 +0000582 vlen = Py_SIZE(vt);
583 wlen = Py_SIZE(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000584
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000585 /* Note: the corresponding code for lists has an "early out" test
586 * here when op is EQ or NE and the lengths differ. That pays there,
587 * but Tim was unable to find any real code where EQ/NE tuple
588 * compares don't have the same length, so testing for it here would
589 * have cost without benefit.
590 */
591
592 /* Search for the first index where items are different.
593 * Note that because tuples are immutable, it's safe to reuse
594 * vlen and wlen across the comparison calls.
595 */
596 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000597 int k = PyObject_RichCompareBool(vt->ob_item[i],
598 wt->ob_item[i], Py_EQ);
599 if (k < 0)
600 return NULL;
601 if (!k)
602 break;
603 }
604
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000605 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000606 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000607 int cmp;
608 PyObject *res;
609 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000610 case Py_LT: cmp = vlen < wlen; break;
611 case Py_LE: cmp = vlen <= wlen; break;
612 case Py_EQ: cmp = vlen == wlen; break;
613 case Py_NE: cmp = vlen != wlen; break;
614 case Py_GT: cmp = vlen > wlen; break;
615 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000616 default: return NULL; /* cannot happen */
617 }
618 if (cmp)
619 res = Py_True;
620 else
621 res = Py_False;
622 Py_INCREF(res);
623 return res;
624 }
625
626 /* We have an item that differs -- shortcuts for EQ/NE */
627 if (op == Py_EQ) {
628 Py_INCREF(Py_False);
629 return Py_False;
630 }
631 if (op == Py_NE) {
632 Py_INCREF(Py_True);
633 return Py_True;
634 }
635
636 /* Compare the final item again using the proper operator */
637 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
638}
639
Jeremy Hylton938ace62002-07-17 16:30:39 +0000640static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000641tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
642
Tim Peters6d6c1a32001-08-02 04:15:00 +0000643static PyObject *
644tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
645{
646 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000647 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000648
Guido van Rossumae960af2001-08-30 03:11:59 +0000649 if (type != &PyTuple_Type)
650 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000651 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
652 return NULL;
653
654 if (arg == NULL)
655 return PyTuple_New(0);
656 else
657 return PySequence_Tuple(arg);
658}
659
Guido van Rossumae960af2001-08-30 03:11:59 +0000660static PyObject *
661tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
662{
Anthony Baxtera6286212006-04-11 07:42:36 +0000663 PyObject *tmp, *newobj, *item;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000664 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000665
666 assert(PyType_IsSubtype(type, &PyTuple_Type));
667 tmp = tuple_new(&PyTuple_Type, args, kwds);
668 if (tmp == NULL)
669 return NULL;
670 assert(PyTuple_Check(tmp));
Anthony Baxtera6286212006-04-11 07:42:36 +0000671 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
672 if (newobj == NULL)
Guido van Rossumae960af2001-08-30 03:11:59 +0000673 return NULL;
674 for (i = 0; i < n; i++) {
675 item = PyTuple_GET_ITEM(tmp, i);
676 Py_INCREF(item);
Anthony Baxtera6286212006-04-11 07:42:36 +0000677 PyTuple_SET_ITEM(newobj, i, item);
Guido van Rossumae960af2001-08-30 03:11:59 +0000678 }
679 Py_DECREF(tmp);
Anthony Baxtera6286212006-04-11 07:42:36 +0000680 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000681}
682
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000683PyDoc_STRVAR(tuple_doc,
Tim Peters1b8ca0d2001-09-02 06:42:25 +0000684"tuple() -> an empty tuple\n"
685"tuple(sequence) -> tuple initialized from sequence's items\n"
686"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000687"If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000688
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000689static PySequenceMethods tuple_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000690 (lenfunc)tuplelength, /* sq_length */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000691 (binaryfunc)tupleconcat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000692 (ssizeargfunc)tuplerepeat, /* sq_repeat */
693 (ssizeargfunc)tupleitem, /* sq_item */
694 (ssizessizeargfunc)tupleslice, /* sq_slice */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000695 0, /* sq_ass_item */
696 0, /* sq_ass_slice */
697 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698};
699
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000700static PyObject*
701tuplesubscript(PyTupleObject* self, PyObject* item)
702{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000703 if (PyIndex_Check(item)) {
704 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000705 if (i == -1 && PyErr_Occurred())
706 return NULL;
707 if (i < 0)
708 i += PyTuple_GET_SIZE(self);
709 return tupleitem(self, i);
710 }
711 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000712 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000713 PyObject* result;
714 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000715 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000716
717 if (PySlice_GetIndicesEx((PySliceObject*)item,
718 PyTuple_GET_SIZE(self),
719 &start, &stop, &step, &slicelength) < 0) {
720 return NULL;
721 }
722
723 if (slicelength <= 0) {
724 return PyTuple_New(0);
725 }
Thomas Wouters3ccec682007-08-28 15:28:19 +0000726 else if (start == 0 && step == 1 &&
727 slicelength == PyTuple_GET_SIZE(self) &&
728 PyTuple_CheckExact(self)) {
729 Py_INCREF(self);
730 return (PyObject *)self;
731 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000732 else {
733 result = PyTuple_New(slicelength);
Georg Brandl5c170fd2006-03-17 19:03:25 +0000734 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000735
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000736 src = self->ob_item;
737 dest = ((PyTupleObject *)result)->ob_item;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000738 for (cur = start, i = 0; i < slicelength;
739 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000740 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000741 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000742 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000743 }
744
745 return result;
746 }
747 }
748 else {
Georg Brandl283a1352006-11-19 08:48:30 +0000749 PyErr_Format(PyExc_TypeError,
750 "tuple indices must be integers, not %.200s",
Christian Heimese93237d2007-12-19 02:37:44 +0000751 Py_TYPE(item)->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000752 return NULL;
753 }
754}
755
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000756static PyObject *
757tuple_getnewargs(PyTupleObject *v)
758{
Christian Heimese93237d2007-12-19 02:37:44 +0000759 return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000760
761}
762
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000763static PyObject *
764tuple_sizeof(PyTupleObject *self)
765{
766 Py_ssize_t res;
767
768 res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
769 return PyInt_FromSsize_t(res);
770}
771
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000772PyDoc_STRVAR(index_doc,
Andrew M. Kuchlingb15d6fb2008-10-04 01:03:42 +0000773"T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
774"Raises ValueError if the value is not present."
775);
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000776PyDoc_STRVAR(count_doc,
777"T.count(value) -> integer -- return number of occurrences of value");
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000778PyDoc_STRVAR(sizeof_doc,
779"T.__sizeof__() -- size of T in memory, in bytes");
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000780
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000781static PyMethodDef tuple_methods[] = {
782 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
Robert Schuppenies73e9ffc2008-06-13 13:29:37 +0000783 {"__sizeof__", (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
Raymond Hettinger5b07ebc2008-02-07 00:54:20 +0000784 {"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc},
785 {"count", (PyCFunction)tuplecount, METH_O, count_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000786 {NULL, NULL} /* sentinel */
787};
788
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000789static PyMappingMethods tuple_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000790 (lenfunc)tuplelength,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000791 (binaryfunc)tuplesubscript,
792 0
793};
794
Raymond Hettinger48923c52002-08-09 01:30:17 +0000795static PyObject *tuple_iter(PyObject *seq);
796
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797PyTypeObject PyTuple_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000798 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000799 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000800 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000801 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000802 (destructor)tupledealloc, /* tp_dealloc */
803 (printfunc)tupleprint, /* tp_print */
804 0, /* tp_getattr */
805 0, /* tp_setattr */
806 0, /* tp_compare */
807 (reprfunc)tuplerepr, /* tp_repr */
808 0, /* tp_as_number */
809 &tuple_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000810 &tuple_as_mapping, /* tp_as_mapping */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000811 (hashfunc)tuplehash, /* tp_hash */
812 0, /* tp_call */
813 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000815 0, /* tp_setattro */
816 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000817 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +0000818 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000819 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000820 (traverseproc)tupletraverse, /* tp_traverse */
821 0, /* tp_clear */
822 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000823 0, /* tp_weaklistoffset */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000824 tuple_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000826 tuple_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827 0, /* tp_members */
828 0, /* tp_getset */
829 0, /* tp_base */
830 0, /* tp_dict */
831 0, /* tp_descr_get */
832 0, /* tp_descr_set */
833 0, /* tp_dictoffset */
834 0, /* tp_init */
835 0, /* tp_alloc */
836 tuple_new, /* tp_new */
Neil Schemenauer626d7742002-04-12 03:05:52 +0000837 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000838};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000839
840/* The following function breaks the notion that tuples are immutable:
841 it changes the size of a tuple. We get away with this only if there
842 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000843 as creating a new tuple object and destroying the old one, only more
844 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000845 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000846
847int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000848_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000849{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000850 register PyTupleObject *v;
851 register PyTupleObject *sv;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000852 Py_ssize_t i;
853 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000854
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000855 v = (PyTupleObject *) *pv;
Christian Heimese93237d2007-12-19 02:37:44 +0000856 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
857 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000858 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000859 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000860 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000861 return -1;
862 }
Christian Heimese93237d2007-12-19 02:37:44 +0000863 oldsize = Py_SIZE(v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000864 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000865 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000866
Guido van Rossumf70590f2001-12-07 20:00:04 +0000867 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000868 /* Empty tuples are often shared, so we should never
869 resize them in-place even if we do own the only
870 (current) reference */
871 Py_DECREF(v);
872 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000873 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000874 }
875
Guido van Rossum12d12c51993-10-26 17:58:25 +0000876 /* XXX UNREF/NEWREF interface should be more symmetrical */
Tim Peters34592512002-07-11 06:23:50 +0000877 _Py_DEC_REFTOTAL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000878 _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}