blob: 963d90e1a9e0adaefa93e9a31a086b40720aa888 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Tuple object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Guido van Rossum5ce78f82000-04-21 21:15:05 +00006/* Speed optimization to avoid frequent malloc/free of small tuples */
Christian Heimes2202f872008-02-06 14:31:34 +00007#ifndef PyTuple_MAXSAVESIZE
8#define PyTuple_MAXSAVESIZE 20 /* Largest tuple to save on free list */
Guido van Rossum5ce78f82000-04-21 21:15:05 +00009#endif
Christian Heimes2202f872008-02-06 14:31:34 +000010#ifndef PyTuple_MAXFREELIST
11#define PyTuple_MAXFREELIST 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000012#endif
13
Christian Heimes2202f872008-02-06 14:31:34 +000014#if PyTuple_MAXSAVESIZE > 0
15/* Entries 1 up to PyTuple_MAXSAVESIZE are free lists, entry 0 is the empty
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000016 tuple () of which at most one instance will be allocated.
17*/
Christian Heimes2202f872008-02-06 14:31:34 +000018static PyTupleObject *free_list[PyTuple_MAXSAVESIZE];
19static int numfree[PyTuple_MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000020#endif
21#ifdef COUNT_ALLOCS
22int fast_tuple_allocs;
23int tuple_zero_allocs;
24#endif
25
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000027PyTuple_New(register Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029 register PyTupleObject *op;
Martin v. Löwis18e16552006-02-15 17:27:45 +000030 Py_ssize_t i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033 return NULL;
34 }
Christian Heimes2202f872008-02-06 14:31:34 +000035#if PyTuple_MAXSAVESIZE > 0
36 if (size == 0 && free_list[0]) {
37 op = free_list[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000039#ifdef COUNT_ALLOCS
40 tuple_zero_allocs++;
41#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000043 }
Christian Heimes2202f872008-02-06 14:31:34 +000044 if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {
45 free_list[size] = (PyTupleObject *) op->ob_item[0];
46 numfree[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000047#ifdef COUNT_ALLOCS
48 fast_tuple_allocs++;
49#endif
Guido van Rossume3a8e7e2002-08-19 19:26:42 +000050 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000051#ifdef Py_TRACE_REFS
Christian Heimes90aa7642007-12-19 02:45:37 +000052 Py_SIZE(op) = size;
53 Py_TYPE(op) = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000054#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000055 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000056 }
57 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000058#endif
59 {
Martin v. Löwis18e16552006-02-15 17:27:45 +000060 Py_ssize_t nbytes = size * sizeof(PyObject *);
Guido van Rossum5bc51f21999-07-12 23:06:58 +000061 /* Check for overflow */
62 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Neal Norwitz3ce5d922008-08-24 07:08:55 +000063 (nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)))
Guido van Rossum5bc51f21999-07-12 23:06:58 +000064 {
65 return PyErr_NoMemory();
66 }
Neal Norwitz3ce5d922008-08-24 07:08:55 +000067 nbytes += sizeof(PyTupleObject) - sizeof(PyObject *);
68
Neil Schemenauere83c00e2001-08-29 23:54:21 +000069 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000070 if (op == NULL)
Neil Schemenauere83c00e2001-08-29 23:54:21 +000071 return NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000072 }
Armin Rigo6fce78e2004-03-21 22:29:05 +000073 for (i=0; i < size; i++)
74 op->ob_item[i] = NULL;
Christian Heimes2202f872008-02-06 14:31:34 +000075#if PyTuple_MAXSAVESIZE > 0
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000076 if (size == 0) {
Christian Heimes2202f872008-02-06 14:31:34 +000077 free_list[0] = op;
78 ++numfree[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000080 }
81#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +000082 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000083 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084}
85
Martin v. Löwis18e16552006-02-15 17:27:45 +000086Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +000087PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 if (!PyTuple_Check(op)) {
90 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091 return -1;
92 }
93 else
Christian Heimes90aa7642007-12-19 02:45:37 +000094 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095}
96
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000098PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 if (!PyTuple_Check(op)) {
101 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102 return NULL;
103 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000104 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 return NULL;
107 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109}
110
111int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000112PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 register PyObject *olditem;
115 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000116 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117 Py_XDECREF(newitem);
118 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000119 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000121 if (i < 0 || i >= Py_SIZE(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 Py_XDECREF(newitem);
123 PyErr_SetString(PyExc_IndexError,
124 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000125 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000128 olditem = *p;
129 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131 return 0;
132}
133
Raymond Hettingercb2da432003-10-12 18:24:34 +0000134PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000135PyTuple_Pack(Py_ssize_t n, ...)
Raymond Hettingercb2da432003-10-12 18:24:34 +0000136{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000137 Py_ssize_t i;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000138 PyObject *o;
139 PyObject *result;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000140 PyObject **items;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000141 va_list vargs;
142
143 va_start(vargs, n);
144 result = PyTuple_New(n);
145 if (result == NULL)
146 return NULL;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000147 items = ((PyTupleObject *)result)->ob_item;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000148 for (i = 0; i < n; i++) {
149 o = va_arg(vargs, PyObject *);
150 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000151 items[i] = o;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000152 }
153 va_end(vargs);
154 return result;
155}
156
157
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158/* Methods */
159
160static void
Fred Drakeba096332000-07-09 07:04:36 +0000161tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000163 register Py_ssize_t i;
Christian Heimes90aa7642007-12-19 02:45:37 +0000164 register Py_ssize_t len = Py_SIZE(op);
Guido van Rossumff413af2002-03-28 20:34:59 +0000165 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000166 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000167 if (len > 0) {
168 i = len;
Armin Rigo6fce78e2004-03-21 22:29:05 +0000169 while (--i >= 0)
170 Py_XDECREF(op->ob_item[i]);
Christian Heimes2202f872008-02-06 14:31:34 +0000171#if PyTuple_MAXSAVESIZE > 0
172 if (len < PyTuple_MAXSAVESIZE &&
173 numfree[len] < PyTuple_MAXFREELIST &&
Christian Heimes90aa7642007-12-19 02:45:37 +0000174 Py_TYPE(op) == &PyTuple_Type)
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000175 {
Christian Heimes2202f872008-02-06 14:31:34 +0000176 op->ob_item[0] = (PyObject *) free_list[len];
177 numfree[len]++;
178 free_list[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000179 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000180 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000181#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000182 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000183 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000184done:
185 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186}
187
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000189tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000191 Py_ssize_t i, n;
Tim Petersa7259592001-06-16 05:11:17 +0000192 PyObject *s, *temp;
193 PyObject *pieces, *result = NULL;
194
Christian Heimes90aa7642007-12-19 02:45:37 +0000195 n = Py_SIZE(v);
Tim Petersa7259592001-06-16 05:11:17 +0000196 if (n == 0)
Walter Dörwald1ab83302007-05-18 17:15:44 +0000197 return PyUnicode_FromString("()");
Tim Petersa7259592001-06-16 05:11:17 +0000198
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000199 /* While not mutable, it is still possible to end up with a cycle in a
200 tuple through an object that stores itself within a tuple (and thus
201 infinitely asks for the repr of itself). This should only be
202 possible within a type. */
203 i = Py_ReprEnter((PyObject *)v);
204 if (i != 0) {
Alexandre Vassalotti3fe82162008-05-03 01:37:08 +0000205 return i > 0 ? PyUnicode_FromString("(...)") : NULL;
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000206 }
207
Tim Petersa7259592001-06-16 05:11:17 +0000208 pieces = PyTuple_New(n);
209 if (pieces == NULL)
210 return NULL;
211
212 /* Do repr() on each element. */
213 for (i = 0; i < n; ++i) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000214 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
215 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000216 s = PyObject_Repr(v->ob_item[i]);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000217 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000218 if (s == NULL)
219 goto Done;
220 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221 }
Tim Petersa7259592001-06-16 05:11:17 +0000222
223 /* Add "()" decorations to the first and last items. */
224 assert(n > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000225 s = PyUnicode_FromString("(");
Tim Petersa7259592001-06-16 05:11:17 +0000226 if (s == NULL)
227 goto Done;
228 temp = PyTuple_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000229 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000230 PyTuple_SET_ITEM(pieces, 0, s);
231 if (s == NULL)
232 goto Done;
233
Walter Dörwald1ab83302007-05-18 17:15:44 +0000234 s = PyUnicode_FromString(n == 1 ? ",)" : ")");
Tim Petersa7259592001-06-16 05:11:17 +0000235 if (s == NULL)
236 goto Done;
237 temp = PyTuple_GET_ITEM(pieces, n-1);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000238 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000239 PyTuple_SET_ITEM(pieces, n-1, temp);
240 if (temp == NULL)
241 goto Done;
242
243 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +0000244 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000245 if (s == NULL)
246 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000247 result = PyUnicode_Join(s, pieces);
Tim Petersa7259592001-06-16 05:11:17 +0000248 Py_DECREF(s);
249
250Done:
251 Py_DECREF(pieces);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000252 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000253 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254}
255
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000256/* The addend 82520, was selected from the range(0, 1000000) for
257 generating the greatest number of prime multipliers for tuples
258 upto length eight:
259
260 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
261 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
262*/
263
Guido van Rossum9bfef441993-03-29 10:43:31 +0000264static long
Fred Drakeba096332000-07-09 07:04:36 +0000265tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000266{
267 register long x, y;
Christian Heimes90aa7642007-12-19 02:45:37 +0000268 register Py_ssize_t len = Py_SIZE(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 register PyObject **p;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000270 long mult = 1000003L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000271 x = 0x345678L;
272 p = v->ob_item;
273 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000274 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000275 if (y == -1)
276 return -1;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000277 x = (x ^ y) * mult;
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000278 /* the cast might truncate len; that doesn't change hash stability */
279 mult += (long)(82520L + len + len);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000280 }
Raymond Hettinger57c2d932004-06-10 18:42:15 +0000281 x += 97531L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000282 if (x == -1)
283 x = -2;
284 return x;
285}
286
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000288tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289{
Christian Heimes90aa7642007-12-19 02:45:37 +0000290 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291}
292
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000293static int
Fred Drakeba096332000-07-09 07:04:36 +0000294tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000295{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000296 Py_ssize_t i;
297 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000298
Christian Heimes90aa7642007-12-19 02:45:37 +0000299 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
Guido van Rossumf77bc622001-01-18 00:00:53 +0000300 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000301 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000302 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000303}
304
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000306tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307{
Christian Heimes90aa7642007-12-19 02:45:37 +0000308 if (i < 0 || i >= Py_SIZE(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 return NULL;
311 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 return a->ob_item[i];
314}
315
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000317tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
318 register Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 register PyTupleObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000321 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000322 register Py_ssize_t i;
323 Py_ssize_t len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324 if (ilow < 0)
325 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000326 if (ihigh > Py_SIZE(a))
327 ihigh = Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 if (ihigh < ilow)
329 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000330 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331 Py_INCREF(a);
332 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333 }
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000334 len = ihigh - ilow;
335 np = (PyTupleObject *)PyTuple_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 if (np == NULL)
337 return NULL;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000338 src = a->ob_item + ilow;
339 dest = np->ob_item;
340 for (i = 0; i < len; i++) {
341 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000343 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346}
347
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000349PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000350{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 if (op == NULL || !PyTuple_Check(op)) {
352 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000353 return NULL;
354 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000356}
357
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000359tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000361 register Py_ssize_t size;
362 register Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000363 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 PyTupleObject *np;
365 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000366 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000367 "can only concatenate tuple (not \"%.200s\") to tuple",
Christian Heimes90aa7642007-12-19 02:45:37 +0000368 Py_TYPE(bb)->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369 return NULL;
370 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371#define b ((PyTupleObject *)bb)
Christian Heimes90aa7642007-12-19 02:45:37 +0000372 size = Py_SIZE(a) + Py_SIZE(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000373 if (size < 0)
374 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000377 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000379 src = a->ob_item;
380 dest = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000381 for (i = 0; i < Py_SIZE(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000382 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000384 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000386 src = b->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000387 dest = np->ob_item + Py_SIZE(a);
388 for (i = 0; i < Py_SIZE(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000389 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000391 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394#undef b
395}
396
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000398tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000399{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000400 Py_ssize_t i, j;
401 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 PyTupleObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000403 PyObject **p, **items;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000404 if (n < 0)
405 n = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000406 if (Py_SIZE(a) == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000407 if (PyTuple_CheckExact(a)) {
408 /* Since tuples are immutable, we can return a shared
409 copy in this case */
410 Py_INCREF(a);
411 return (PyObject *)a;
412 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000413 if (Py_SIZE(a) == 0)
Tim Peters7b07a412001-09-11 19:48:03 +0000414 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000415 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000416 size = Py_SIZE(a) * n;
417 if (size/Py_SIZE(a) != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000418 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000420 if (np == NULL)
421 return NULL;
422 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000423 items = a->ob_item;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000424 for (i = 0; i < n; i++) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000425 for (j = 0; j < Py_SIZE(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000426 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000428 p++;
429 }
430 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000432}
433
Raymond Hettinger65baa342008-02-07 00:41:02 +0000434static PyObject *
435tupleindex(PyTupleObject *self, PyObject *args)
436{
437 Py_ssize_t i, start=0, stop=Py_SIZE(self);
438 PyObject *v;
439
440 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
441 _PyEval_SliceIndex, &start,
442 _PyEval_SliceIndex, &stop))
443 return NULL;
444 if (start < 0) {
445 start += Py_SIZE(self);
446 if (start < 0)
447 start = 0;
448 }
449 if (stop < 0) {
450 stop += Py_SIZE(self);
451 if (stop < 0)
452 stop = 0;
453 }
454 for (i = start; i < stop && i < Py_SIZE(self); i++) {
455 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
456 if (cmp > 0)
457 return PyLong_FromSsize_t(i);
458 else if (cmp < 0)
459 return NULL;
460 }
461 PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in list");
462 return NULL;
463}
464
465static PyObject *
466tuplecount(PyTupleObject *self, PyObject *v)
467{
468 Py_ssize_t count = 0;
469 Py_ssize_t i;
470
471 for (i = 0; i < Py_SIZE(self); i++) {
472 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
473 if (cmp > 0)
474 count++;
475 else if (cmp < 0)
476 return NULL;
477 }
478 return PyLong_FromSsize_t(count);
479}
480
Jeremy Hylton8caad492000-06-23 14:18:11 +0000481static int
482tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
483{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000484 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000485
Christian Heimes90aa7642007-12-19 02:45:37 +0000486 for (i = Py_SIZE(o); --i >= 0; )
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000487 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000488 return 0;
489}
490
Guido van Rossumf77bc622001-01-18 00:00:53 +0000491static PyObject *
492tuplerichcompare(PyObject *v, PyObject *w, int op)
493{
494 PyTupleObject *vt, *wt;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000495 Py_ssize_t i;
496 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000497
498 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
499 Py_INCREF(Py_NotImplemented);
500 return Py_NotImplemented;
501 }
502
503 vt = (PyTupleObject *)v;
504 wt = (PyTupleObject *)w;
505
Christian Heimes90aa7642007-12-19 02:45:37 +0000506 vlen = Py_SIZE(vt);
507 wlen = Py_SIZE(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000508
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000509 /* Note: the corresponding code for lists has an "early out" test
510 * here when op is EQ or NE and the lengths differ. That pays there,
511 * but Tim was unable to find any real code where EQ/NE tuple
512 * compares don't have the same length, so testing for it here would
513 * have cost without benefit.
514 */
515
516 /* Search for the first index where items are different.
517 * Note that because tuples are immutable, it's safe to reuse
518 * vlen and wlen across the comparison calls.
519 */
520 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000521 int k = PyObject_RichCompareBool(vt->ob_item[i],
522 wt->ob_item[i], Py_EQ);
523 if (k < 0)
524 return NULL;
525 if (!k)
526 break;
527 }
528
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000529 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000530 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000531 int cmp;
532 PyObject *res;
533 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000534 case Py_LT: cmp = vlen < wlen; break;
535 case Py_LE: cmp = vlen <= wlen; break;
536 case Py_EQ: cmp = vlen == wlen; break;
537 case Py_NE: cmp = vlen != wlen; break;
538 case Py_GT: cmp = vlen > wlen; break;
539 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000540 default: return NULL; /* cannot happen */
541 }
542 if (cmp)
543 res = Py_True;
544 else
545 res = Py_False;
546 Py_INCREF(res);
547 return res;
548 }
549
550 /* We have an item that differs -- shortcuts for EQ/NE */
551 if (op == Py_EQ) {
552 Py_INCREF(Py_False);
553 return Py_False;
554 }
555 if (op == Py_NE) {
556 Py_INCREF(Py_True);
557 return Py_True;
558 }
559
560 /* Compare the final item again using the proper operator */
561 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
562}
563
Jeremy Hylton938ace62002-07-17 16:30:39 +0000564static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000565tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
566
Tim Peters6d6c1a32001-08-02 04:15:00 +0000567static PyObject *
568tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
569{
570 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000571 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000572
Guido van Rossumae960af2001-08-30 03:11:59 +0000573 if (type != &PyTuple_Type)
574 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000575 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
576 return NULL;
577
578 if (arg == NULL)
579 return PyTuple_New(0);
580 else
581 return PySequence_Tuple(arg);
582}
583
Guido van Rossumae960af2001-08-30 03:11:59 +0000584static PyObject *
585tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
586{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000587 PyObject *tmp, *newobj, *item;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000588 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000589
590 assert(PyType_IsSubtype(type, &PyTuple_Type));
591 tmp = tuple_new(&PyTuple_Type, args, kwds);
592 if (tmp == NULL)
593 return NULL;
594 assert(PyTuple_Check(tmp));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000595 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
596 if (newobj == NULL)
Guido van Rossumae960af2001-08-30 03:11:59 +0000597 return NULL;
598 for (i = 0; i < n; i++) {
599 item = PyTuple_GET_ITEM(tmp, i);
600 Py_INCREF(item);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000601 PyTuple_SET_ITEM(newobj, i, item);
Guido van Rossumae960af2001-08-30 03:11:59 +0000602 }
603 Py_DECREF(tmp);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000604 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000605}
606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000607PyDoc_STRVAR(tuple_doc,
Tim Peters1b8ca0d2001-09-02 06:42:25 +0000608"tuple() -> an empty tuple\n"
609"tuple(sequence) -> tuple initialized from sequence's items\n"
610"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000611"If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000612
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613static PySequenceMethods tuple_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000614 (lenfunc)tuplelength, /* sq_length */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000615 (binaryfunc)tupleconcat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000616 (ssizeargfunc)tuplerepeat, /* sq_repeat */
617 (ssizeargfunc)tupleitem, /* sq_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000618 0, /* sq_slice */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000619 0, /* sq_ass_item */
620 0, /* sq_ass_slice */
621 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000622};
623
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000624static PyObject*
625tuplesubscript(PyTupleObject* self, PyObject* item)
626{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000627 if (PyIndex_Check(item)) {
628 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000629 if (i == -1 && PyErr_Occurred())
630 return NULL;
631 if (i < 0)
632 i += PyTuple_GET_SIZE(self);
633 return tupleitem(self, i);
634 }
635 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000636 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000637 PyObject* result;
638 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000639 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000640
641 if (PySlice_GetIndicesEx((PySliceObject*)item,
642 PyTuple_GET_SIZE(self),
643 &start, &stop, &step, &slicelength) < 0) {
644 return NULL;
645 }
646
647 if (slicelength <= 0) {
648 return PyTuple_New(0);
649 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000650 else if (start == 0 && step == 1 &&
651 slicelength == PyTuple_GET_SIZE(self) &&
652 PyTuple_CheckExact(self)) {
653 Py_INCREF(self);
654 return (PyObject *)self;
655 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000656 else {
657 result = PyTuple_New(slicelength);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000658 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000659
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000660 src = self->ob_item;
661 dest = ((PyTupleObject *)result)->ob_item;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000662 for (cur = start, i = 0; i < slicelength;
663 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000664 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000665 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000666 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000667 }
668
669 return result;
670 }
671 }
672 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000673 PyErr_Format(PyExc_TypeError,
674 "tuple indices must be integers, not %.200s",
Christian Heimes90aa7642007-12-19 02:45:37 +0000675 Py_TYPE(item)->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000676 return NULL;
677 }
678}
679
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000680static PyObject *
681tuple_getnewargs(PyTupleObject *v)
682{
Christian Heimes90aa7642007-12-19 02:45:37 +0000683 return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000684
685}
686
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000687static PyObject *
688tuple_sizeof(PyTupleObject *self)
689{
690 Py_ssize_t res;
691
692 res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
693 return PyLong_FromSsize_t(res);
694}
695
Raymond Hettinger65baa342008-02-07 00:41:02 +0000696PyDoc_STRVAR(index_doc,
697"T.index(value, [start, [stop]]) -> integer -- return first index of value");
698PyDoc_STRVAR(count_doc,
699"T.count(value) -> integer -- return number of occurrences of value");
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000700PyDoc_STRVAR(sizeof_doc,
701"T.__sizeof__() -- size of T in memory, in bytes");
Raymond Hettinger65baa342008-02-07 00:41:02 +0000702
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000703static PyMethodDef tuple_methods[] = {
704 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000705 {"__sizeof__", (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
Raymond Hettinger65baa342008-02-07 00:41:02 +0000706 {"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc},
707 {"count", (PyCFunction)tuplecount, METH_O, count_doc},
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000708 {NULL, NULL} /* sentinel */
709};
710
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000711static PyMappingMethods tuple_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000712 (lenfunc)tuplelength,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000713 (binaryfunc)tuplesubscript,
714 0
715};
716
Raymond Hettinger48923c52002-08-09 01:30:17 +0000717static PyObject *tuple_iter(PyObject *seq);
718
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000719PyTypeObject PyTuple_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000720 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000721 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000722 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000723 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000724 (destructor)tupledealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +0000725 0, /* tp_print */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000726 0, /* tp_getattr */
727 0, /* tp_setattr */
728 0, /* tp_compare */
729 (reprfunc)tuplerepr, /* tp_repr */
730 0, /* tp_as_number */
731 &tuple_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000732 &tuple_as_mapping, /* tp_as_mapping */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000733 (hashfunc)tuplehash, /* tp_hash */
734 0, /* tp_call */
735 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000736 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000737 0, /* tp_setattro */
738 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000739 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +0000740 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000741 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000742 (traverseproc)tupletraverse, /* tp_traverse */
743 0, /* tp_clear */
744 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000745 0, /* tp_weaklistoffset */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000746 tuple_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000747 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000748 tuple_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000749 0, /* tp_members */
750 0, /* tp_getset */
751 0, /* tp_base */
752 0, /* tp_dict */
753 0, /* tp_descr_get */
754 0, /* tp_descr_set */
755 0, /* tp_dictoffset */
756 0, /* tp_init */
757 0, /* tp_alloc */
758 tuple_new, /* tp_new */
Neil Schemenauer626d7742002-04-12 03:05:52 +0000759 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000760};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000761
762/* The following function breaks the notion that tuples are immutable:
763 it changes the size of a tuple. We get away with this only if there
764 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000765 as creating a new tuple object and destroying the old one, only more
766 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000767 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000768
769int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000770_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000771{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000772 register PyTupleObject *v;
773 register PyTupleObject *sv;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000774 Py_ssize_t i;
775 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000776
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000777 v = (PyTupleObject *) *pv;
Christian Heimes90aa7642007-12-19 02:45:37 +0000778 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
779 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000780 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000781 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000782 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000783 return -1;
784 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000785 oldsize = Py_SIZE(v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000786 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000787 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000788
Guido van Rossumf70590f2001-12-07 20:00:04 +0000789 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000790 /* Empty tuples are often shared, so we should never
791 resize them in-place even if we do own the only
792 (current) reference */
793 Py_DECREF(v);
794 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000795 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000796 }
797
Guido van Rossum12d12c51993-10-26 17:58:25 +0000798 /* XXX UNREF/NEWREF interface should be more symmetrical */
Tim Peters34592512002-07-11 06:23:50 +0000799 _Py_DEC_REFTOTAL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000800 _PyObject_GC_UNTRACK(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000801 _Py_ForgetReference((PyObject *) v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000802 /* DECREF items deleted by shrinkage */
803 for (i = newsize; i < oldsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000804 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000805 v->ob_item[i] = NULL;
806 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000807 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000808 if (sv == NULL) {
809 *pv = NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000810 PyObject_GC_Del(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000811 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000812 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000813 _Py_NewReference((PyObject *) sv);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000814 /* Zero out items added by growing */
Neal Norwitz35fc7602002-06-13 21:11:11 +0000815 if (newsize > oldsize)
Jeremy Hylton8b47dff2002-06-20 23:13:17 +0000816 memset(&sv->ob_item[oldsize], 0,
817 sizeof(*sv->ob_item) * (newsize - oldsize));
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000818 *pv = (PyObject *) sv;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000819 _PyObject_GC_TRACK(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000820 return 0;
821}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000822
Christian Heimesa156e092008-02-16 07:38:31 +0000823int
824PyTuple_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000825{
Christian Heimesa156e092008-02-16 07:38:31 +0000826 int freelist_size = 0;
Christian Heimes2202f872008-02-06 14:31:34 +0000827#if PyTuple_MAXSAVESIZE > 0
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000828 int i;
Christian Heimes2202f872008-02-06 14:31:34 +0000829 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000830 PyTupleObject *p, *q;
Christian Heimes2202f872008-02-06 14:31:34 +0000831 p = free_list[i];
Christian Heimesa156e092008-02-16 07:38:31 +0000832 freelist_size += numfree[i];
Christian Heimes2202f872008-02-06 14:31:34 +0000833 free_list[i] = NULL;
Christian Heimesa156e092008-02-16 07:38:31 +0000834 numfree[i] = 0;
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000835 while (p) {
836 q = p;
837 p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000838 PyObject_GC_Del(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000839 }
840 }
841#endif
Christian Heimesa156e092008-02-16 07:38:31 +0000842 return freelist_size;
843}
844
845void
846PyTuple_Fini(void)
847{
848#if PyTuple_MAXSAVESIZE > 0
849 /* empty tuples are used all over the place and applications may
850 * rely on the fact that an empty tuple is a singleton. */
851 Py_XDECREF(free_list[0]);
852 free_list[0] = NULL;
853
854 (void)PyTuple_ClearFreeList();
855#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000856}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000857
858/*********************** Tuple Iterator **************************/
859
860typedef struct {
861 PyObject_HEAD
862 long it_index;
863 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
864} tupleiterobject;
865
Raymond Hettinger48923c52002-08-09 01:30:17 +0000866static void
867tupleiter_dealloc(tupleiterobject *it)
868{
869 _PyObject_GC_UNTRACK(it);
870 Py_XDECREF(it->it_seq);
871 PyObject_GC_Del(it);
872}
873
874static int
875tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
876{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000877 Py_VISIT(it->it_seq);
878 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000879}
880
Raymond Hettinger48923c52002-08-09 01:30:17 +0000881static PyObject *
882tupleiter_next(tupleiterobject *it)
883{
884 PyTupleObject *seq;
885 PyObject *item;
886
887 assert(it != NULL);
888 seq = it->it_seq;
889 if (seq == NULL)
890 return NULL;
891 assert(PyTuple_Check(seq));
892
893 if (it->it_index < PyTuple_GET_SIZE(seq)) {
894 item = PyTuple_GET_ITEM(seq, it->it_index);
895 ++it->it_index;
896 Py_INCREF(item);
897 return item;
898 }
899
900 Py_DECREF(seq);
901 it->it_seq = NULL;
902 return NULL;
903}
904
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000905static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +0000906tupleiter_len(tupleiterobject *it)
907{
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000908 Py_ssize_t len = 0;
Raymond Hettinger435bf582004-03-18 22:43:10 +0000909 if (it->it_seq)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000910 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
Christian Heimes217cfd12007-12-02 14:31:20 +0000911 return PyLong_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +0000912}
913
Armin Rigof5b3e362006-02-11 21:32:43 +0000914PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000915
916static PyMethodDef tupleiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +0000917 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000918 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000919};
920
Raymond Hettinger48923c52002-08-09 01:30:17 +0000921PyTypeObject PyTupleIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000922 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Christian Heimesa22e8bd2007-11-29 22:35:39 +0000923 "tuple_iterator", /* tp_name */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000924 sizeof(tupleiterobject), /* tp_basicsize */
925 0, /* tp_itemsize */
926 /* methods */
927 (destructor)tupleiter_dealloc, /* tp_dealloc */
928 0, /* tp_print */
929 0, /* tp_getattr */
930 0, /* tp_setattr */
931 0, /* tp_compare */
932 0, /* tp_repr */
933 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000934 0, /* tp_as_sequence */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000935 0, /* tp_as_mapping */
936 0, /* tp_hash */
937 0, /* tp_call */
938 0, /* tp_str */
939 PyObject_GenericGetAttr, /* tp_getattro */
940 0, /* tp_setattro */
941 0, /* tp_as_buffer */
942 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
943 0, /* tp_doc */
944 (traverseproc)tupleiter_traverse, /* tp_traverse */
945 0, /* tp_clear */
946 0, /* tp_richcompare */
947 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +0000948 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000949 (iternextfunc)tupleiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000950 tupleiter_methods, /* tp_methods */
951 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +0000952};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000953
954static PyObject *
955tuple_iter(PyObject *seq)
956{
957 tupleiterobject *it;
958
959 if (!PyTuple_Check(seq)) {
960 PyErr_BadInternalCall();
961 return NULL;
962 }
963 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
964 if (it == NULL)
965 return NULL;
966 it->it_index = 0;
967 Py_INCREF(seq);
968 it->it_seq = (PyTupleObject *)seq;
969 _PyObject_GC_TRACK(it);
970 return (PyObject *)it;
971}