blob: 334f4b6439b945408b9fcffe7ef2e109a006a825 [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
Guido van Rossum68055ce1998-12-11 14:56:38 +000052 op->ob_size = size;
Guido van Rossumb18618d2000-05-03 23:44:39 +000053 op->ob_type = &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 Norwitz4f3be8a2008-07-31 17:08:14 +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 Norwitz4f3be8a2008-07-31 17:08:14 +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;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000075#if MAXSAVESIZE > 0
76 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000077 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +000078 ++num_free_tuples[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
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 return ((PyTupleObject *)op)->ob_size;
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 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
105 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 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
122 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;
164 register Py_ssize_t len = op->ob_size;
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]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000171#if MAXSAVESIZE > 0
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000172 if (len < MAXSAVESIZE &&
173 num_free_tuples[len] < MAXSAVEDTUPLES &&
174 op->ob_type == &PyTuple_Type)
175 {
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000176 op->ob_item[0] = (PyObject *) free_tuples[len];
177 num_free_tuples[len]++;
178 free_tuples[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 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000183 op->ob_type->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 Rossum49e85141991-06-07 22:59:30 +0000188static int
Fred Drakeba096332000-07-09 07:04:36 +0000189tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000191 Py_ssize_t i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000193 for (i = 0; i < op->ob_size; i++) {
194 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000197 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000198 }
199 if (op->ob_size == 1)
200 fprintf(fp, ",");
201 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000202 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203}
204
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000206tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000208 Py_ssize_t i, n;
Tim Petersa7259592001-06-16 05:11:17 +0000209 PyObject *s, *temp;
210 PyObject *pieces, *result = NULL;
211
Amaury Forgeot d'Arc0f1653e2008-04-11 00:33:07 +0000212 n = v->ob_size;
213 if (n == 0)
214 return PyString_FromString("()");
215
Guido van Rossumaa975432008-04-10 22:43:58 +0000216 /* While not mutable, it is still possible to end up with a cycle in a
217 tuple through an object that stores itself within a tuple (and thus
218 infinitely asks for the repr of itself). This should only be
219 possible within a type. */
220 i = Py_ReprEnter((PyObject *)v);
221 if (i != 0) {
222 return i > 0 ? PyString_FromString("(...)") : NULL;
223 }
224
Tim Petersa7259592001-06-16 05:11:17 +0000225 pieces = PyTuple_New(n);
226 if (pieces == NULL)
227 return NULL;
228
229 /* Do repr() on each element. */
230 for (i = 0; i < n; ++i) {
Guido van Rossumaa975432008-04-10 22:43:58 +0000231 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
232 goto Done;
Tim Petersa7259592001-06-16 05:11:17 +0000233 s = PyObject_Repr(v->ob_item[i]);
Guido van Rossumaa975432008-04-10 22:43:58 +0000234 Py_LeaveRecursiveCall();
Tim Petersa7259592001-06-16 05:11:17 +0000235 if (s == NULL)
236 goto Done;
237 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238 }
Tim Petersa7259592001-06-16 05:11:17 +0000239
240 /* Add "()" decorations to the first and last items. */
241 assert(n > 0);
242 s = PyString_FromString("(");
243 if (s == NULL)
244 goto Done;
245 temp = PyTuple_GET_ITEM(pieces, 0);
246 PyString_ConcatAndDel(&s, temp);
247 PyTuple_SET_ITEM(pieces, 0, s);
248 if (s == NULL)
249 goto Done;
250
251 s = PyString_FromString(n == 1 ? ",)" : ")");
252 if (s == NULL)
253 goto Done;
254 temp = PyTuple_GET_ITEM(pieces, n-1);
255 PyString_ConcatAndDel(&temp, s);
256 PyTuple_SET_ITEM(pieces, n-1, temp);
257 if (temp == NULL)
258 goto Done;
259
260 /* Paste them all together with ", " between. */
261 s = PyString_FromString(", ");
262 if (s == NULL)
263 goto Done;
264 result = _PyString_Join(s, pieces);
265 Py_DECREF(s);
266
267Done:
268 Py_DECREF(pieces);
Guido van Rossumaa975432008-04-10 22:43:58 +0000269 Py_ReprLeave((PyObject *)v);
Tim Petersa7259592001-06-16 05:11:17 +0000270 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271}
272
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000273/* The addend 82520, was selected from the range(0, 1000000) for
274 generating the greatest number of prime multipliers for tuples
275 upto length eight:
276
277 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
278 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
279*/
280
Guido van Rossum9bfef441993-03-29 10:43:31 +0000281static long
Fred Drakeba096332000-07-09 07:04:36 +0000282tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000283{
284 register long x, y;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000285 register Py_ssize_t len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286 register PyObject **p;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000287 long mult = 1000003L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000288 x = 0x345678L;
289 p = v->ob_item;
290 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000292 if (y == -1)
293 return -1;
Raymond Hettinger41bd0222004-06-01 06:36:24 +0000294 x = (x ^ y) * mult;
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000295 /* the cast might truncate len; that doesn't change hash stability */
296 mult += (long)(82520L + len + len);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000297 }
Raymond Hettinger57c2d932004-06-10 18:42:15 +0000298 x += 97531L;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000299 if (x == -1)
300 x = -2;
301 return x;
302}
303
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000305tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306{
307 return a->ob_size;
308}
309
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000310static int
Fred Drakeba096332000-07-09 07:04:36 +0000311tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000312{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000313 Py_ssize_t i;
314 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000315
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000316 for (i = 0, cmp = 0 ; cmp == 0 && i < a->ob_size; ++i)
Guido van Rossumf77bc622001-01-18 00:00:53 +0000317 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000318 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000319 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000320}
321
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000323tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324{
325 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327 return NULL;
328 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 return a->ob_item[i];
331}
332
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000334tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
335 register Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 register PyTupleObject *np;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000338 PyObject **src, **dest;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000339 register Py_ssize_t i;
340 Py_ssize_t len;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 if (ilow < 0)
342 ilow = 0;
343 if (ihigh > a->ob_size)
344 ihigh = a->ob_size;
345 if (ihigh < ilow)
346 ihigh = ilow;
Tim Peters7b07a412001-09-11 19:48:03 +0000347 if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 Py_INCREF(a);
349 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350 }
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000351 len = ihigh - ilow;
352 np = (PyTupleObject *)PyTuple_New(len);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 if (np == NULL)
354 return NULL;
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000355 src = a->ob_item + ilow;
356 dest = np->ob_item;
357 for (i = 0; i < len; i++) {
358 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 Py_INCREF(v);
Raymond Hettingerb7d05db2004-03-08 07:25:05 +0000360 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000363}
364
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000366PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000367{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 if (op == NULL || !PyTuple_Check(op)) {
369 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000370 return NULL;
371 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000373}
374
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000376tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000378 register Py_ssize_t size;
379 register Py_ssize_t i;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000380 PyObject **src, **dest;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 PyTupleObject *np;
382 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000383 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000384 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000385 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386 return NULL;
387 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389 size = a->ob_size + b->ob_size;
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000390 if (size < 0)
391 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000394 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000396 src = a->ob_item;
397 dest = np->ob_item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 for (i = 0; i < a->ob_size; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000399 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000400 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000401 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402 }
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000403 src = b->ob_item;
404 dest = np->ob_item + a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405 for (i = 0; i < b->ob_size; i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000406 PyObject *v = src[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 Py_INCREF(v);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000408 dest[i] = v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411#undef b
412}
413
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000415tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000416{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000417 Py_ssize_t i, j;
418 Py_ssize_t size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 PyTupleObject *np;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000420 PyObject **p, **items;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000421 if (n < 0)
422 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000423 if (a->ob_size == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000424 if (PyTuple_CheckExact(a)) {
425 /* Since tuples are immutable, we can return a shared
426 copy in this case */
427 Py_INCREF(a);
428 return (PyObject *)a;
429 }
430 if (a->ob_size == 0)
431 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000432 }
433 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000434 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000435 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000437 if (np == NULL)
438 return NULL;
439 p = np->ob_item;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000440 items = a->ob_item;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000441 for (i = 0; i < n; i++) {
442 for (j = 0; j < a->ob_size; j++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000443 *p = items[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000445 p++;
446 }
447 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000449}
450
Jeremy Hylton8caad492000-06-23 14:18:11 +0000451static int
452tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
453{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000454 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000455
Thomas Woutersc6e55062006-04-15 21:47:09 +0000456 for (i = o->ob_size; --i >= 0; )
457 Py_VISIT(o->ob_item[i]);
Jeremy Hylton8caad492000-06-23 14:18:11 +0000458 return 0;
459}
460
Guido van Rossumf77bc622001-01-18 00:00:53 +0000461static PyObject *
462tuplerichcompare(PyObject *v, PyObject *w, int op)
463{
464 PyTupleObject *vt, *wt;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000465 Py_ssize_t i;
466 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000467
468 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
469 Py_INCREF(Py_NotImplemented);
470 return Py_NotImplemented;
471 }
472
473 vt = (PyTupleObject *)v;
474 wt = (PyTupleObject *)w;
475
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000476 vlen = vt->ob_size;
477 wlen = wt->ob_size;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000478
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000479 /* Note: the corresponding code for lists has an "early out" test
480 * here when op is EQ or NE and the lengths differ. That pays there,
481 * but Tim was unable to find any real code where EQ/NE tuple
482 * compares don't have the same length, so testing for it here would
483 * have cost without benefit.
484 */
485
486 /* Search for the first index where items are different.
487 * Note that because tuples are immutable, it's safe to reuse
488 * vlen and wlen across the comparison calls.
489 */
490 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000491 int k = PyObject_RichCompareBool(vt->ob_item[i],
492 wt->ob_item[i], Py_EQ);
493 if (k < 0)
494 return NULL;
495 if (!k)
496 break;
497 }
498
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000499 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000500 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000501 int cmp;
502 PyObject *res;
503 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000504 case Py_LT: cmp = vlen < wlen; break;
505 case Py_LE: cmp = vlen <= wlen; break;
506 case Py_EQ: cmp = vlen == wlen; break;
507 case Py_NE: cmp = vlen != wlen; break;
508 case Py_GT: cmp = vlen > wlen; break;
509 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000510 default: return NULL; /* cannot happen */
511 }
512 if (cmp)
513 res = Py_True;
514 else
515 res = Py_False;
516 Py_INCREF(res);
517 return res;
518 }
519
520 /* We have an item that differs -- shortcuts for EQ/NE */
521 if (op == Py_EQ) {
522 Py_INCREF(Py_False);
523 return Py_False;
524 }
525 if (op == Py_NE) {
526 Py_INCREF(Py_True);
527 return Py_True;
528 }
529
530 /* Compare the final item again using the proper operator */
531 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
532}
533
Jeremy Hylton938ace62002-07-17 16:30:39 +0000534static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000535tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
536
Tim Peters6d6c1a32001-08-02 04:15:00 +0000537static PyObject *
538tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
539{
540 PyObject *arg = NULL;
Martin v. Löwis15e62742006-02-27 16:46:16 +0000541 static char *kwlist[] = {"sequence", 0};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000542
Guido van Rossumae960af2001-08-30 03:11:59 +0000543 if (type != &PyTuple_Type)
544 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000545 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
546 return NULL;
547
548 if (arg == NULL)
549 return PyTuple_New(0);
550 else
551 return PySequence_Tuple(arg);
552}
553
Guido van Rossumae960af2001-08-30 03:11:59 +0000554static PyObject *
555tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
556{
Anthony Baxtera6286212006-04-11 07:42:36 +0000557 PyObject *tmp, *newobj, *item;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000558 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000559
560 assert(PyType_IsSubtype(type, &PyTuple_Type));
561 tmp = tuple_new(&PyTuple_Type, args, kwds);
562 if (tmp == NULL)
563 return NULL;
564 assert(PyTuple_Check(tmp));
Anthony Baxtera6286212006-04-11 07:42:36 +0000565 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
566 if (newobj == NULL)
Guido van Rossumae960af2001-08-30 03:11:59 +0000567 return NULL;
568 for (i = 0; i < n; i++) {
569 item = PyTuple_GET_ITEM(tmp, i);
570 Py_INCREF(item);
Anthony Baxtera6286212006-04-11 07:42:36 +0000571 PyTuple_SET_ITEM(newobj, i, item);
Guido van Rossumae960af2001-08-30 03:11:59 +0000572 }
573 Py_DECREF(tmp);
Anthony Baxtera6286212006-04-11 07:42:36 +0000574 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000575}
576
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000577PyDoc_STRVAR(tuple_doc,
Tim Peters1b8ca0d2001-09-02 06:42:25 +0000578"tuple() -> an empty tuple\n"
579"tuple(sequence) -> tuple initialized from sequence's items\n"
580"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000581"If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583static PySequenceMethods tuple_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000584 (lenfunc)tuplelength, /* sq_length */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000585 (binaryfunc)tupleconcat, /* sq_concat */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000586 (ssizeargfunc)tuplerepeat, /* sq_repeat */
587 (ssizeargfunc)tupleitem, /* sq_item */
588 (ssizessizeargfunc)tupleslice, /* sq_slice */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000589 0, /* sq_ass_item */
590 0, /* sq_ass_slice */
591 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592};
593
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000594static PyObject*
595tuplesubscript(PyTupleObject* self, PyObject* item)
596{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +0000597 if (PyIndex_Check(item)) {
598 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000599 if (i == -1 && PyErr_Occurred())
600 return NULL;
601 if (i < 0)
602 i += PyTuple_GET_SIZE(self);
603 return tupleitem(self, i);
604 }
605 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000606 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000607 PyObject* result;
608 PyObject* it;
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000609 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000610
611 if (PySlice_GetIndicesEx((PySliceObject*)item,
612 PyTuple_GET_SIZE(self),
613 &start, &stop, &step, &slicelength) < 0) {
614 return NULL;
615 }
616
617 if (slicelength <= 0) {
618 return PyTuple_New(0);
619 }
620 else {
621 result = PyTuple_New(slicelength);
Georg Brandl5c170fd2006-03-17 19:03:25 +0000622 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000623
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000624 src = self->ob_item;
625 dest = ((PyTupleObject *)result)->ob_item;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000626 for (cur = start, i = 0; i < slicelength;
627 cur += step, i++) {
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000628 it = src[cur];
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000629 Py_INCREF(it);
Raymond Hettingera6366fe2004-03-09 13:05:22 +0000630 dest[i] = it;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000631 }
632
633 return result;
634 }
635 }
636 else {
637 PyErr_SetString(PyExc_TypeError,
638 "tuple indices must be integers");
639 return NULL;
640 }
641}
642
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000643static PyObject *
644tuple_getnewargs(PyTupleObject *v)
645{
646 return Py_BuildValue("(N)", tupleslice(v, 0, v->ob_size));
647
648}
649
650static PyMethodDef tuple_methods[] = {
651 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
652 {NULL, NULL} /* sentinel */
653};
654
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000655static PyMappingMethods tuple_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +0000656 (lenfunc)tuplelength,
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000657 (binaryfunc)tuplesubscript,
658 0
659};
660
Raymond Hettinger48923c52002-08-09 01:30:17 +0000661static PyObject *tuple_iter(PyObject *seq);
662
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000663PyTypeObject PyTuple_Type = {
664 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000665 0,
666 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000667 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000668 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000669 (destructor)tupledealloc, /* tp_dealloc */
670 (printfunc)tupleprint, /* tp_print */
671 0, /* tp_getattr */
672 0, /* tp_setattr */
673 0, /* tp_compare */
674 (reprfunc)tuplerepr, /* tp_repr */
675 0, /* tp_as_number */
676 &tuple_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000677 &tuple_as_mapping, /* tp_as_mapping */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000678 (hashfunc)tuplehash, /* tp_hash */
679 0, /* tp_call */
680 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000681 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000682 0, /* tp_setattro */
683 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000684 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
685 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000686 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000687 (traverseproc)tupletraverse, /* tp_traverse */
688 0, /* tp_clear */
689 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000690 0, /* tp_weaklistoffset */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000691 tuple_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000692 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000693 tuple_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000694 0, /* tp_members */
695 0, /* tp_getset */
696 0, /* tp_base */
697 0, /* tp_dict */
698 0, /* tp_descr_get */
699 0, /* tp_descr_set */
700 0, /* tp_dictoffset */
701 0, /* tp_init */
702 0, /* tp_alloc */
703 tuple_new, /* tp_new */
Neil Schemenauer626d7742002-04-12 03:05:52 +0000704 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000705};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000706
707/* The following function breaks the notion that tuples are immutable:
708 it changes the size of a tuple. We get away with this only if there
709 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000710 as creating a new tuple object and destroying the old one, only more
711 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000712 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000713
714int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000715_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000716{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000717 register PyTupleObject *v;
718 register PyTupleObject *sv;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000719 Py_ssize_t i;
720 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000721
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000722 v = (PyTupleObject *) *pv;
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000723 if (v == NULL || v->ob_type != &PyTuple_Type ||
Thomas Wouters6a922372001-05-28 13:11:02 +0000724 (v->ob_size != 0 && v->ob_refcnt != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000725 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000726 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000728 return -1;
729 }
Guido van Rossumf70590f2001-12-07 20:00:04 +0000730 oldsize = v->ob_size;
731 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000732 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000733
Guido van Rossumf70590f2001-12-07 20:00:04 +0000734 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000735 /* Empty tuples are often shared, so we should never
736 resize them in-place even if we do own the only
737 (current) reference */
738 Py_DECREF(v);
739 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000740 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000741 }
742
Guido van Rossum12d12c51993-10-26 17:58:25 +0000743 /* XXX UNREF/NEWREF interface should be more symmetrical */
Tim Peters34592512002-07-11 06:23:50 +0000744 _Py_DEC_REFTOTAL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000745 _PyObject_GC_UNTRACK(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000746 _Py_ForgetReference((PyObject *) v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000747 /* DECREF items deleted by shrinkage */
748 for (i = newsize; i < oldsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000749 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000750 v->ob_item[i] = NULL;
751 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000752 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000753 if (sv == NULL) {
754 *pv = NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000755 PyObject_GC_Del(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000756 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000757 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000758 _Py_NewReference((PyObject *) sv);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000759 /* Zero out items added by growing */
Neal Norwitz35fc7602002-06-13 21:11:11 +0000760 if (newsize > oldsize)
Jeremy Hylton8b47dff2002-06-20 23:13:17 +0000761 memset(&sv->ob_item[oldsize], 0,
762 sizeof(*sv->ob_item) * (newsize - oldsize));
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000763 *pv = (PyObject *) sv;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000764 _PyObject_GC_TRACK(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000765 return 0;
766}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000767
768void
Fred Drakeba096332000-07-09 07:04:36 +0000769PyTuple_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000770{
771#if MAXSAVESIZE > 0
772 int i;
773
774 Py_XDECREF(free_tuples[0]);
775 free_tuples[0] = NULL;
776
777 for (i = 1; i < MAXSAVESIZE; i++) {
778 PyTupleObject *p, *q;
779 p = free_tuples[i];
780 free_tuples[i] = NULL;
781 while (p) {
782 q = p;
783 p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000784 PyObject_GC_Del(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000785 }
786 }
787#endif
788}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000789
790/*********************** Tuple Iterator **************************/
791
792typedef struct {
793 PyObject_HEAD
794 long it_index;
795 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
796} tupleiterobject;
797
Raymond Hettinger48923c52002-08-09 01:30:17 +0000798static void
799tupleiter_dealloc(tupleiterobject *it)
800{
801 _PyObject_GC_UNTRACK(it);
802 Py_XDECREF(it->it_seq);
803 PyObject_GC_Del(it);
804}
805
806static int
807tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
808{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000809 Py_VISIT(it->it_seq);
810 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000811}
812
Raymond Hettinger48923c52002-08-09 01:30:17 +0000813static PyObject *
814tupleiter_next(tupleiterobject *it)
815{
816 PyTupleObject *seq;
817 PyObject *item;
818
819 assert(it != NULL);
820 seq = it->it_seq;
821 if (seq == NULL)
822 return NULL;
823 assert(PyTuple_Check(seq));
824
825 if (it->it_index < PyTuple_GET_SIZE(seq)) {
826 item = PyTuple_GET_ITEM(seq, it->it_index);
827 ++it->it_index;
828 Py_INCREF(item);
829 return item;
830 }
831
832 Py_DECREF(seq);
833 it->it_seq = NULL;
834 return NULL;
835}
836
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000837static PyObject *
Raymond Hettinger435bf582004-03-18 22:43:10 +0000838tupleiter_len(tupleiterobject *it)
839{
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000840 Py_ssize_t len = 0;
Raymond Hettinger435bf582004-03-18 22:43:10 +0000841 if (it->it_seq)
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000842 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
Martin v. Löwiseb079f12006-02-16 14:32:27 +0000843 return PyInt_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +0000844}
845
Armin Rigof5b3e362006-02-11 21:32:43 +0000846PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000847
848static PyMethodDef tupleiter_methods[] = {
Armin Rigof5b3e362006-02-11 21:32:43 +0000849 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000850 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +0000851};
852
Raymond Hettinger48923c52002-08-09 01:30:17 +0000853PyTypeObject PyTupleIter_Type = {
854 PyObject_HEAD_INIT(&PyType_Type)
855 0, /* ob_size */
856 "tupleiterator", /* tp_name */
857 sizeof(tupleiterobject), /* tp_basicsize */
858 0, /* tp_itemsize */
859 /* methods */
860 (destructor)tupleiter_dealloc, /* tp_dealloc */
861 0, /* tp_print */
862 0, /* tp_getattr */
863 0, /* tp_setattr */
864 0, /* tp_compare */
865 0, /* tp_repr */
866 0, /* tp_as_number */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000867 0, /* tp_as_sequence */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000868 0, /* tp_as_mapping */
869 0, /* tp_hash */
870 0, /* tp_call */
871 0, /* tp_str */
872 PyObject_GenericGetAttr, /* tp_getattro */
873 0, /* tp_setattro */
874 0, /* tp_as_buffer */
875 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
876 0, /* tp_doc */
877 (traverseproc)tupleiter_traverse, /* tp_traverse */
878 0, /* tp_clear */
879 0, /* tp_richcompare */
880 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +0000881 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000882 (iternextfunc)tupleiter_next, /* tp_iternext */
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000883 tupleiter_methods, /* tp_methods */
884 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +0000885};
Martin v. Löwis72d20672006-04-11 09:04:12 +0000886
887static PyObject *
888tuple_iter(PyObject *seq)
889{
890 tupleiterobject *it;
891
892 if (!PyTuple_Check(seq)) {
893 PyErr_BadInternalCall();
894 return NULL;
895 }
896 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
897 if (it == NULL)
898 return NULL;
899 it->it_index = 0;
900 Py_INCREF(seq);
901 it->it_seq = (PyTupleObject *)seq;
902 _PyObject_GC_TRACK(it);
903 return (PyObject *)it;
904}