blob: c22785ddee313a743be7473bdb618aec5ca50196 [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 */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +00007#ifndef MAXSAVESIZE
Guido van Rossum5ce78f82000-04-21 21:15:05 +00008#define MAXSAVESIZE 20 /* Largest tuple to save on free list */
9#endif
10#ifndef MAXSAVEDTUPLES
11#define MAXSAVEDTUPLES 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000012#endif
13
14#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +000015/* Entries 1 up to 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*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000018static PyTupleObject *free_tuples[MAXSAVESIZE];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000019static int num_free_tuples[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 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000035#if MAXSAVESIZE > 0
Sjoerd Mullender615194a1993-11-01 13:46:50 +000036 if (size == 0 && free_tuples[0]) {
37 op = free_tuples[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 }
Raymond Hettinger325d1692004-03-15 00:16:34 +000044 if (size < MAXSAVESIZE && (op = free_tuples[size]) != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000046 num_free_tuples[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
Martin v. Löwis9f2e3462007-07-21 17:22:18 +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 ||
Neil Schemenauere83c00e2001-08-29 23:54:21 +000063 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
Guido van Rossum5bc51f21999-07-12 23:06:58 +000064 <= 0)
65 {
66 return PyErr_NoMemory();
67 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000068 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000069 if (op == NULL)
Neil Schemenauere83c00e2001-08-29 23:54:21 +000070 return NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000071 }
Armin Rigo6fce78e2004-03-21 22:29:05 +000072 for (i=0; i < size; i++)
73 op->ob_item[i] = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000074#if MAXSAVESIZE > 0
75 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000076 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +000077 ++num_free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000078 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000079 }
80#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +000081 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083}
84
Martin v. Löwis18e16552006-02-15 17:27:45 +000085Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +000086PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 if (!PyTuple_Check(op)) {
89 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090 return -1;
91 }
92 else
Martin v. Löwis9f2e3462007-07-21 17:22:18 +000093 return Py_Size(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000094}
95
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +000097PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 if (!PyTuple_Check(op)) {
100 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101 return NULL;
102 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000103 if (i < 0 || i >= Py_Size(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105 return NULL;
106 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108}
109
110int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 register PyObject *olditem;
114 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000115 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 Py_XDECREF(newitem);
117 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000118 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000120 if (i < 0 || i >= Py_Size(op)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 Py_XDECREF(newitem);
122 PyErr_SetString(PyExc_IndexError,
123 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000124 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000127 olditem = *p;
128 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130 return 0;
131}
132
Raymond Hettingercb2da432003-10-12 18:24:34 +0000133PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000134PyTuple_Pack(Py_ssize_t n, ...)
Raymond Hettingercb2da432003-10-12 18:24:34 +0000135{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000136 Py_ssize_t i;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000137 PyObject *o;
138 PyObject *result;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000139 PyObject **items;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000140 va_list vargs;
141
142 va_start(vargs, n);
143 result = PyTuple_New(n);
144 if (result == NULL)
145 return NULL;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000146 items = ((PyTupleObject *)result)->ob_item;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000147 for (i = 0; i < n; i++) {
148 o = va_arg(vargs, PyObject *);
149 Py_INCREF(o);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000150 items[i] = o;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000151 }
152 va_end(vargs);
153 return result;
154}
155
156
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157/* Methods */
158
159static void
Fred Drakeba096332000-07-09 07:04:36 +0000160tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000162 register Py_ssize_t i;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000163 register Py_ssize_t len = Py_Size(op);
Guido van Rossumff413af2002-03-28 20:34:59 +0000164 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000165 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000166 if (len > 0) {
167 i = len;
Armin Rigo6fce78e2004-03-21 22:29:05 +0000168 while (--i >= 0)
169 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000170#if MAXSAVESIZE > 0
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000171 if (len < MAXSAVESIZE &&
172 num_free_tuples[len] < MAXSAVEDTUPLES &&
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000173 Py_Type(op) == &PyTuple_Type)
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000174 {
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000175 op->ob_item[0] = (PyObject *) free_tuples[len];
176 num_free_tuples[len]++;
177 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000178 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000179 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000180#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000181 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000182 Py_Type(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000183done:
184 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185}
186
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000188tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000190 Py_ssize_t i, n;
Tim Petersa7259592001-06-16 05:11:17 +0000191 PyObject *s, *temp;
192 PyObject *pieces, *result = NULL;
193
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000194 n = Py_Size(v);
Tim Petersa7259592001-06-16 05:11:17 +0000195 if (n == 0)
Walter Dörwald1ab83302007-05-18 17:15:44 +0000196 return PyUnicode_FromString("()");
Tim Petersa7259592001-06-16 05:11:17 +0000197
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000198 /* While not mutable, it is still possible to end up with a cycle in a
199 tuple through an object that stores itself within a tuple (and thus
200 infinitely asks for the repr of itself). This should only be
201 possible within a type. */
202 i = Py_ReprEnter((PyObject *)v);
203 if (i != 0) {
204 return i > 0 ? PyString_FromString("(...)") : NULL;
205 }
206
Tim Petersa7259592001-06-16 05:11:17 +0000207 pieces = PyTuple_New(n);
208 if (pieces == NULL)
209 return NULL;
210
211 /* Do repr() on each element. */
212 for (i = 0; i < n; ++i) {
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000213 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
214 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000215 s = PyObject_Repr(v->ob_item[i]);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000216 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000217 if (s == NULL)
218 goto Done;
219 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 }
Tim Petersa7259592001-06-16 05:11:17 +0000221
222 /* Add "()" decorations to the first and last items. */
223 assert(n > 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000224 s = PyUnicode_FromString("(");
Tim Petersa7259592001-06-16 05:11:17 +0000225 if (s == NULL)
226 goto Done;
227 temp = PyTuple_GET_ITEM(pieces, 0);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000228 PyUnicode_AppendAndDel(&s, temp);
Tim Petersa7259592001-06-16 05:11:17 +0000229 PyTuple_SET_ITEM(pieces, 0, s);
230 if (s == NULL)
231 goto Done;
232
Walter Dörwald1ab83302007-05-18 17:15:44 +0000233 s = PyUnicode_FromString(n == 1 ? ",)" : ")");
Tim Petersa7259592001-06-16 05:11:17 +0000234 if (s == NULL)
235 goto Done;
236 temp = PyTuple_GET_ITEM(pieces, n-1);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000237 PyUnicode_AppendAndDel(&temp, s);
Tim Petersa7259592001-06-16 05:11:17 +0000238 PyTuple_SET_ITEM(pieces, n-1, temp);
239 if (temp == NULL)
240 goto Done;
241
242 /* Paste them all together with ", " between. */
Walter Dörwald1ab83302007-05-18 17:15:44 +0000243 s = PyUnicode_FromString(", ");
Tim Petersa7259592001-06-16 05:11:17 +0000244 if (s == NULL)
245 goto Done;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000246 result = PyUnicode_Join(s, pieces);
Tim Petersa7259592001-06-16 05:11:17 +0000247 Py_DECREF(s);
248
249Done:
250 Py_DECREF(pieces);
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000251 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000252 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253}
254
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000255/* The addend 82520, was selected from the range(0, 1000000) for
256 generating the greatest number of prime multipliers for tuples
257 upto length eight:
258
259 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
260 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
261*/
262
Guido van Rossum9bfef441993-03-29 10:43:31 +0000263static long
Fred Drakeba096332000-07-09 07:04:36 +0000264tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000265{
266 register long x, y;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000267 register Py_ssize_t len = Py_Size(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000268 register PyObject **p;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000269 long mult = 1000003L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000270 x = 0x345678L;
271 p = v->ob_item;
272 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000274 if (y == -1)
275 return -1;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000276 x = (x ^ y) * mult;
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000277 /* the cast might truncate len; that doesn't change hash stability */
278 mult += (long)(82520L + len + len);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000279 }
Raymond Hettinger57c2d932004-06-10 18:42:15 +0000280 x += 97531L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000281 if (x == -1)
282 x = -2;
283 return x;
284}
285
Martin v. Löwis18e16552006-02-15 17:27:45 +0000286static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000287tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000289 return Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290}
291
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000292static int
Fred Drakeba096332000-07-09 07:04:36 +0000293tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000294{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000295 Py_ssize_t i;
296 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000297
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000298 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_Size(a); ++i)
Guido van Rossumf77bc622001-01-18 00:00:53 +0000299 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000300 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000301 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000302}
303
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000305tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000307 if (i < 0 || i >= Py_Size(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 return NULL;
310 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312 return a->ob_item[i];
313}
314
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000316tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
317 register Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 register PyTupleObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000320 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000321 register Py_ssize_t i;
322 Py_ssize_t len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323 if (ilow < 0)
324 ilow = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000325 if (ihigh > Py_Size(a))
326 ihigh = Py_Size(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327 if (ihigh < ilow)
328 ihigh = ilow;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000329 if (ilow == 0 && ihigh == Py_Size(a) && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 Py_INCREF(a);
331 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 }
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000333 len = ihigh - ilow;
334 np = (PyTupleObject *)PyTuple_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335 if (np == NULL)
336 return NULL;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000337 src = a->ob_item + ilow;
338 dest = np->ob_item;
339 for (i = 0; i < len; i++) {
340 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000342 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345}
346
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000348PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000349{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 if (op == NULL || !PyTuple_Check(op)) {
351 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000352 return NULL;
353 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000355}
356
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000358tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000360 register Py_ssize_t size;
361 register Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000362 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 PyTupleObject *np;
364 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000365 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000366 "can only concatenate tuple (not \"%.200s\") to tuple",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000367 Py_Type(bb)->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368 return NULL;
369 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370#define b ((PyTupleObject *)bb)
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000371 size = Py_Size(a) + Py_Size(b);
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000372 if (size < 0)
373 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000376 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000378 src = a->ob_item;
379 dest = np->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000380 for (i = 0; i < Py_Size(a); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000381 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000383 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000385 src = b->ob_item;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000386 dest = np->ob_item + Py_Size(a);
387 for (i = 0; i < Py_Size(b); i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000388 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000390 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393#undef b
394}
395
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000397tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000398{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000399 Py_ssize_t i, j;
400 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 PyTupleObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000402 PyObject **p, **items;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000403 if (n < 0)
404 n = 0;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000405 if (Py_Size(a) == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000406 if (PyTuple_CheckExact(a)) {
407 /* Since tuples are immutable, we can return a shared
408 copy in this case */
409 Py_INCREF(a);
410 return (PyObject *)a;
411 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000412 if (Py_Size(a) == 0)
Tim Peters7b07a412001-09-11 19:48:03 +0000413 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000414 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000415 size = Py_Size(a) * n;
416 if (size/Py_Size(a) != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000417 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000419 if (np == NULL)
420 return NULL;
421 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000422 items = a->ob_item;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000423 for (i = 0; i < n; i++) {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000424 for (j = 0; j < Py_Size(a); j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000425 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000427 p++;
428 }
429 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000431}
432
Jeremy Hylton8caad492000-06-23 14:18:11 +0000433static int
434tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
435{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000436 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000437
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000438 for (i = Py_Size(o); --i >= 0; )
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000439 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000440 return 0;
441}
442
Guido van Rossumf77bc622001-01-18 00:00:53 +0000443static PyObject *
444tuplerichcompare(PyObject *v, PyObject *w, int op)
445{
446 PyTupleObject *vt, *wt;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000447 Py_ssize_t i;
448 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000449
450 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
451 Py_INCREF(Py_NotImplemented);
452 return Py_NotImplemented;
453 }
454
455 vt = (PyTupleObject *)v;
456 wt = (PyTupleObject *)w;
457
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000458 vlen = Py_Size(vt);
459 wlen = Py_Size(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000460
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000461 /* Note: the corresponding code for lists has an "early out" test
462 * here when op is EQ or NE and the lengths differ. That pays there,
463 * but Tim was unable to find any real code where EQ/NE tuple
464 * compares don't have the same length, so testing for it here would
465 * have cost without benefit.
466 */
467
468 /* Search for the first index where items are different.
469 * Note that because tuples are immutable, it's safe to reuse
470 * vlen and wlen across the comparison calls.
471 */
472 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000473 int k = PyObject_RichCompareBool(vt->ob_item[i],
474 wt->ob_item[i], Py_EQ);
475 if (k < 0)
476 return NULL;
477 if (!k)
478 break;
479 }
480
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000481 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000482 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000483 int cmp;
484 PyObject *res;
485 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000486 case Py_LT: cmp = vlen < wlen; break;
487 case Py_LE: cmp = vlen <= wlen; break;
488 case Py_EQ: cmp = vlen == wlen; break;
489 case Py_NE: cmp = vlen != wlen; break;
490 case Py_GT: cmp = vlen > wlen; break;
491 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000492 default: return NULL; /* cannot happen */
493 }
494 if (cmp)
495 res = Py_True;
496 else
497 res = Py_False;
498 Py_INCREF(res);
499 return res;
500 }
501
502 /* We have an item that differs -- shortcuts for EQ/NE */
503 if (op == Py_EQ) {
504 Py_INCREF(Py_False);
505 return Py_False;
506 }
507 if (op == Py_NE) {
508 Py_INCREF(Py_True);
509 return Py_True;
510 }
511
512 /* Compare the final item again using the proper operator */
513 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
514}
515
Jeremy Hylton938ace62002-07-17 16:30:39 +0000516static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000517tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
518
Tim Peters6d6c1a32001-08-02 04:15:00 +0000519static PyObject *
520tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
521{
522 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000523 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000524
Guido van Rossumae960af2001-08-30 03:11:59 +0000525 if (type != &PyTuple_Type)
526 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000527 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
528 return NULL;
529
530 if (arg == NULL)
531 return PyTuple_New(0);
532 else
533 return PySequence_Tuple(arg);
534}
535
Guido van Rossumae960af2001-08-30 03:11:59 +0000536static PyObject *
537tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
538{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000539 PyObject *tmp, *newobj, *item;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000540 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000541
542 assert(PyType_IsSubtype(type, &PyTuple_Type));
543 tmp = tuple_new(&PyTuple_Type, args, kwds);
544 if (tmp == NULL)
545 return NULL;
546 assert(PyTuple_Check(tmp));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
548 if (newobj == NULL)
Guido van Rossumae960af2001-08-30 03:11:59 +0000549 return NULL;
550 for (i = 0; i < n; i++) {
551 item = PyTuple_GET_ITEM(tmp, i);
552 Py_INCREF(item);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000553 PyTuple_SET_ITEM(newobj, i, item);
Guido van Rossumae960af2001-08-30 03:11:59 +0000554 }
555 Py_DECREF(tmp);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000556 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000557}
558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000559PyDoc_STRVAR(tuple_doc,
Tim Peters1b8ca0d2001-09-02 06:42:25 +0000560"tuple() -> an empty tuple\n"
561"tuple(sequence) -> tuple initialized from sequence's items\n"
562"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000563"If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000564
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565static PySequenceMethods tuple_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000566 (lenfunc)tuplelength, /* sq_length */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000567 (binaryfunc)tupleconcat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000568 (ssizeargfunc)tuplerepeat, /* sq_repeat */
569 (ssizeargfunc)tupleitem, /* sq_item */
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000570 0, /* sq_slice */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000571 0, /* sq_ass_item */
572 0, /* sq_ass_slice */
573 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574};
575
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000576static PyObject*
577tuplesubscript(PyTupleObject* self, PyObject* item)
578{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000579 if (PyIndex_Check(item)) {
580 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000581 if (i == -1 && PyErr_Occurred())
582 return NULL;
583 if (i < 0)
584 i += PyTuple_GET_SIZE(self);
585 return tupleitem(self, i);
586 }
587 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000588 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000589 PyObject* result;
590 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000591 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000592
593 if (PySlice_GetIndicesEx((PySliceObject*)item,
594 PyTuple_GET_SIZE(self),
595 &start, &stop, &step, &slicelength) < 0) {
596 return NULL;
597 }
598
599 if (slicelength <= 0) {
600 return PyTuple_New(0);
601 }
Thomas Woutersed03b412007-08-28 21:37:11 +0000602 else if (start == 0 && step == 1 &&
603 slicelength == PyTuple_GET_SIZE(self) &&
604 PyTuple_CheckExact(self)) {
605 Py_INCREF(self);
606 return (PyObject *)self;
607 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000608 else {
609 result = PyTuple_New(slicelength);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000610 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000611
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000612 src = self->ob_item;
613 dest = ((PyTupleObject *)result)->ob_item;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000614 for (cur = start, i = 0; i < slicelength;
615 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000616 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000617 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000618 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000619 }
620
621 return result;
622 }
623 }
624 else {
Thomas Wouters89f507f2006-12-13 04:49:30 +0000625 PyErr_Format(PyExc_TypeError,
626 "tuple indices must be integers, not %.200s",
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000627 Py_Type(item)->tp_name);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000628 return NULL;
629 }
630}
631
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000632static PyObject *
633tuple_getnewargs(PyTupleObject *v)
634{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000635 return Py_BuildValue("(N)", tupleslice(v, 0, Py_Size(v)));
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000636
637}
638
639static PyMethodDef tuple_methods[] = {
640 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
641 {NULL, NULL} /* sentinel */
642};
643
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000644static PyMappingMethods tuple_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000645 (lenfunc)tuplelength,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000646 (binaryfunc)tuplesubscript,
647 0
648};
649
Raymond Hettinger48923c52002-08-09 01:30:17 +0000650static PyObject *tuple_iter(PyObject *seq);
651
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000652PyTypeObject PyTuple_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000653 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000654 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000655 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000656 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000657 (destructor)tupledealloc, /* tp_dealloc */
Guido van Rossum04dbf3b2007-08-07 19:51:00 +0000658 0, /* tp_print */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000659 0, /* tp_getattr */
660 0, /* tp_setattr */
661 0, /* tp_compare */
662 (reprfunc)tuplerepr, /* tp_repr */
663 0, /* tp_as_number */
664 &tuple_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000665 &tuple_as_mapping, /* tp_as_mapping */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000666 (hashfunc)tuplehash, /* tp_hash */
667 0, /* tp_call */
668 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000669 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000670 0, /* tp_setattro */
671 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000672 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Thomas Wouters27d517b2007-02-25 20:39:11 +0000673 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000674 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000675 (traverseproc)tupletraverse, /* tp_traverse */
676 0, /* tp_clear */
677 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000678 0, /* tp_weaklistoffset */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000679 tuple_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000680 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000681 tuple_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000682 0, /* tp_members */
683 0, /* tp_getset */
684 0, /* tp_base */
685 0, /* tp_dict */
686 0, /* tp_descr_get */
687 0, /* tp_descr_set */
688 0, /* tp_dictoffset */
689 0, /* tp_init */
690 0, /* tp_alloc */
691 tuple_new, /* tp_new */
Neil Schemenauer626d7742002-04-12 03:05:52 +0000692 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000693};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000694
695/* The following function breaks the notion that tuples are immutable:
696 it changes the size of a tuple. We get away with this only if there
697 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000698 as creating a new tuple object and destroying the old one, only more
699 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000700 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000701
702int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000703_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000704{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000705 register PyTupleObject *v;
706 register PyTupleObject *sv;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000707 Py_ssize_t i;
708 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000709
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000710 v = (PyTupleObject *) *pv;
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000711 if (v == NULL || Py_Type(v) != &PyTuple_Type ||
712 (Py_Size(v) != 0 && Py_Refcnt(v) != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000713 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000714 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000715 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000716 return -1;
717 }
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000718 oldsize = Py_Size(v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000719 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000720 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000721
Guido van Rossumf70590f2001-12-07 20:00:04 +0000722 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000723 /* Empty tuples are often shared, so we should never
724 resize them in-place even if we do own the only
725 (current) reference */
726 Py_DECREF(v);
727 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000728 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000729 }
730
Guido van Rossum12d12c51993-10-26 17:58:25 +0000731 /* XXX UNREF/NEWREF interface should be more symmetrical */
Tim Peters34592512002-07-11 06:23:50 +0000732 _Py_DEC_REFTOTAL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000733 _PyObject_GC_UNTRACK(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000734 _Py_ForgetReference((PyObject *) v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000735 /* DECREF items deleted by shrinkage */
736 for (i = newsize; i < oldsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000737 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000738 v->ob_item[i] = NULL;
739 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000740 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000741 if (sv == NULL) {
742 *pv = NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000743 PyObject_GC_Del(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000744 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000745 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000746 _Py_NewReference((PyObject *) sv);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000747 /* Zero out items added by growing */
Neal Norwitz35fc7602002-06-13 21:11:11 +0000748 if (newsize > oldsize)
Jeremy Hylton8b47dff2002-06-20 23:13:17 +0000749 memset(&sv->ob_item[oldsize], 0,
750 sizeof(*sv->ob_item) * (newsize - oldsize));
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000751 *pv = (PyObject *) sv;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000752 _PyObject_GC_TRACK(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000753 return 0;
754}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000755
756void
Fred Drakeba096332000-07-09 07:04:36 +0000757PyTuple_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000758{
759#if MAXSAVESIZE > 0
760 int i;
761
762 Py_XDECREF(free_tuples[0]);
763 free_tuples[0] = NULL;
764
765 for (i = 1; i < MAXSAVESIZE; i++) {
766 PyTupleObject *p, *q;
767 p = free_tuples[i];
768 free_tuples[i] = NULL;
769 while (p) {
770 q = p;
771 p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000772 PyObject_GC_Del(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000773 }
774 }
775#endif
776}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000777
778/*********************** Tuple Iterator **************************/
779
780typedef struct {
781 PyObject_HEAD
782 long it_index;
783 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
784} tupleiterobject;
785
Raymond Hettinger48923c52002-08-09 01:30:17 +0000786static void
787tupleiter_dealloc(tupleiterobject *it)
788{
789 _PyObject_GC_UNTRACK(it);
790 Py_XDECREF(it->it_seq);
791 PyObject_GC_Del(it);
792}
793
794static int
795tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
796{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000797 Py_VISIT(it->it_seq);
798 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000799}
800
Raymond Hettinger48923c52002-08-09 01:30:17 +0000801static PyObject *
802tupleiter_next(tupleiterobject *it)
803{
804 PyTupleObject *seq;
805 PyObject *item;
806
807 assert(it != NULL);
808 seq = it->it_seq;
809 if (seq == NULL)
810 return NULL;
811 assert(PyTuple_Check(seq));
812
813 if (it->it_index < PyTuple_GET_SIZE(seq)) {
814 item = PyTuple_GET_ITEM(seq, it->it_index);
815 ++it->it_index;
816 Py_INCREF(item);
817 return item;
818 }
819
820 Py_DECREF(seq);
821 it->it_seq = NULL;
822 return NULL;
823}
824
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000825static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +0000826tupleiter_len(tupleiterobject *it)
827{
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000828 Py_ssize_t len = 0;
Raymond Hettinger435bf582004-03-18 22:43:10 +0000829 if (it->it_seq)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000830 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000831 return PyInt_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +0000832}
833
Armin Rigof5b3e362006-02-11 21:32:43 +0000834PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000835
836static PyMethodDef tupleiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +0000837 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000838 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000839};
840
Raymond Hettinger48923c52002-08-09 01:30:17 +0000841PyTypeObject PyTupleIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000842 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Raymond Hettinger48923c52002-08-09 01:30:17 +0000843 "tupleiterator", /* tp_name */
844 sizeof(tupleiterobject), /* tp_basicsize */
845 0, /* tp_itemsize */
846 /* methods */
847 (destructor)tupleiter_dealloc, /* tp_dealloc */
848 0, /* tp_print */
849 0, /* tp_getattr */
850 0, /* tp_setattr */
851 0, /* tp_compare */
852 0, /* tp_repr */
853 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000854 0, /* tp_as_sequence */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000855 0, /* tp_as_mapping */
856 0, /* tp_hash */
857 0, /* tp_call */
858 0, /* tp_str */
859 PyObject_GenericGetAttr, /* tp_getattro */
860 0, /* tp_setattro */
861 0, /* tp_as_buffer */
862 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
863 0, /* tp_doc */
864 (traverseproc)tupleiter_traverse, /* tp_traverse */
865 0, /* tp_clear */
866 0, /* tp_richcompare */
867 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +0000868 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000869 (iternextfunc)tupleiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000870 tupleiter_methods, /* tp_methods */
871 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +0000872};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000873
874static PyObject *
875tuple_iter(PyObject *seq)
876{
877 tupleiterobject *it;
878
879 if (!PyTuple_Check(seq)) {
880 PyErr_BadInternalCall();
881 return NULL;
882 }
883 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
884 if (it == NULL)
885 return NULL;
886 it->it_index = 0;
887 Py_INCREF(seq);
888 it->it_seq = (PyTupleObject *)seq;
889 _PyObject_GC_TRACK(it);
890 return (PyObject *)it;
891}