blob: d6d0aaaf7f2ff7a505fa800906d4ffffb5af5e39 [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 *
Fred Drakeba096332000-07-09 07:04:36 +000027PyTuple_New(register int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032 return NULL;
33 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000034#if MAXSAVESIZE > 0
Sjoerd Mullender615194a1993-11-01 13:46:50 +000035 if (size == 0 && free_tuples[0]) {
36 op = free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000038#ifdef COUNT_ALLOCS
39 tuple_zero_allocs++;
40#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000042 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043 if (0 < size && size < MAXSAVESIZE &&
44 (op = free_tuples[size]) != NULL)
45 {
46 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000047 num_free_tuples[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000048#ifdef COUNT_ALLOCS
49 fast_tuple_allocs++;
50#endif
Guido van Rossume3a8e7e2002-08-19 19:26:42 +000051 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +000052#ifdef Py_TRACE_REFS
Guido van Rossum68055ce1998-12-11 14:56:38 +000053 op->ob_size = size;
Guido van Rossumb18618d2000-05-03 23:44:39 +000054 op->ob_type = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000055#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000056 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000057 }
58 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000059#endif
60 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000061 int nbytes = size * sizeof(PyObject *);
62 /* Check for overflow */
63 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Neil Schemenauere83c00e2001-08-29 23:54:21 +000064 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
Guido van Rossum5bc51f21999-07-12 23:06:58 +000065 <= 0)
66 {
67 return PyErr_NoMemory();
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 }
Neal Norwitz35fc7602002-06-13 21:11:11 +000073 memset(op->ob_item, 0, sizeof(*op->ob_item) * size);
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
85int
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
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000094}
95
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096PyObject *
Fred Drakeba096332000-07-09 07:04:36 +000097PyTuple_GetItem(register PyObject *op, register int 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 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000103 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
104 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
Fred Drakeba096332000-07-09 07:04:36 +0000111PyTuple_SetItem(register PyObject *op, register int 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 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
121 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
133/* Methods */
134
135static void
Fred Drakeba096332000-07-09 07:04:36 +0000136tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137{
138 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000139 register int len = op->ob_size;
Guido van Rossumff413af2002-03-28 20:34:59 +0000140 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000141 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000142 if (len > 0) {
143 i = len;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000144 while (--i >= 0)
145 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000146#if MAXSAVESIZE > 0
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000147 if (len < MAXSAVESIZE &&
148 num_free_tuples[len] < MAXSAVEDTUPLES &&
149 op->ob_type == &PyTuple_Type)
150 {
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000151 op->ob_item[0] = (PyObject *) free_tuples[len];
152 num_free_tuples[len]++;
153 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000154 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000155 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000156#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000157 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000158 op->ob_type->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000159done:
160 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161}
162
Guido van Rossum49e85141991-06-07 22:59:30 +0000163static int
Fred Drakeba096332000-07-09 07:04:36 +0000164tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165{
166 int i;
167 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000168 for (i = 0; i < op->ob_size; i++) {
169 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000172 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173 }
174 if (op->ob_size == 1)
175 fprintf(fp, ",");
176 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000177 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178}
179
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000181tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182{
Tim Petersa7259592001-06-16 05:11:17 +0000183 int i, n;
184 PyObject *s, *temp;
185 PyObject *pieces, *result = NULL;
186
187 n = v->ob_size;
188 if (n == 0)
189 return PyString_FromString("()");
190
191 pieces = PyTuple_New(n);
192 if (pieces == NULL)
193 return NULL;
194
195 /* Do repr() on each element. */
196 for (i = 0; i < n; ++i) {
197 s = PyObject_Repr(v->ob_item[i]);
198 if (s == NULL)
199 goto Done;
200 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201 }
Tim Petersa7259592001-06-16 05:11:17 +0000202
203 /* Add "()" decorations to the first and last items. */
204 assert(n > 0);
205 s = PyString_FromString("(");
206 if (s == NULL)
207 goto Done;
208 temp = PyTuple_GET_ITEM(pieces, 0);
209 PyString_ConcatAndDel(&s, temp);
210 PyTuple_SET_ITEM(pieces, 0, s);
211 if (s == NULL)
212 goto Done;
213
214 s = PyString_FromString(n == 1 ? ",)" : ")");
215 if (s == NULL)
216 goto Done;
217 temp = PyTuple_GET_ITEM(pieces, n-1);
218 PyString_ConcatAndDel(&temp, s);
219 PyTuple_SET_ITEM(pieces, n-1, temp);
220 if (temp == NULL)
221 goto Done;
222
223 /* Paste them all together with ", " between. */
224 s = PyString_FromString(", ");
225 if (s == NULL)
226 goto Done;
227 result = _PyString_Join(s, pieces);
228 Py_DECREF(s);
229
230Done:
231 Py_DECREF(pieces);
232 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233}
234
Guido van Rossum9bfef441993-03-29 10:43:31 +0000235static long
Fred Drakeba096332000-07-09 07:04:36 +0000236tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000237{
238 register long x, y;
239 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000241 x = 0x345678L;
242 p = v->ob_item;
243 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000245 if (y == -1)
246 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000247 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000248 }
249 x ^= v->ob_size;
250 if (x == -1)
251 x = -2;
252 return x;
253}
254
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255static int
Fred Drakeba096332000-07-09 07:04:36 +0000256tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257{
258 return a->ob_size;
259}
260
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000261static int
Fred Drakeba096332000-07-09 07:04:36 +0000262tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000263{
264 int i, cmp;
265
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000266 for (i = 0, cmp = 0 ; cmp == 0 && i < a->ob_size; ++i)
Guido van Rossumf77bc622001-01-18 00:00:53 +0000267 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
Raymond Hettingerbd9adab2002-09-05 20:18:08 +0000268 Py_EQ);
Neal Norwitzbb9c5f52002-09-05 21:32:55 +0000269 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000270}
271
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000273tupleitem(register PyTupleObject *a, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274{
275 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 return NULL;
278 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280 return a->ob_item[i];
281}
282
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000284tupleslice(register PyTupleObject *a, register int ilow, register int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 register int i;
288 if (ilow < 0)
289 ilow = 0;
290 if (ihigh > a->ob_size)
291 ihigh = a->ob_size;
292 if (ihigh < ilow)
293 ihigh = ilow;
Tim Peters7b07a412001-09-11 19:48:03 +0000294 if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000295 Py_INCREF(a);
296 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000298 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 if (np == NULL)
300 return NULL;
301 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 PyObject *v = a->ob_item[i];
303 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 np->ob_item[i - ilow] = v;
305 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000306 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307}
308
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000310PyTuple_GetSlice(PyObject *op, int i, int j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000311{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 if (op == NULL || !PyTuple_Check(op)) {
313 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000314 return NULL;
315 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000317}
318
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000320tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321{
322 register int size;
323 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000324 PyTupleObject *np;
325 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000326 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000327 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000328 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329 return NULL;
330 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 size = a->ob_size + b->ob_size;
Guido van Rossuma5c0e6d2002-10-11 21:05:56 +0000333 if (size < 0)
334 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000337 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338 }
339 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 PyObject *v = a->ob_item[i];
341 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342 np->ob_item[i] = v;
343 }
344 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 PyObject *v = b->ob_item[i];
346 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 np->ob_item[i + a->ob_size] = v;
348 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350#undef b
351}
352
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000354tuplerepeat(PyTupleObject *a, int n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000355{
356 int i, j;
357 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 PyTupleObject *np;
359 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000360 if (n < 0)
361 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000362 if (a->ob_size == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000363 if (PyTuple_CheckExact(a)) {
364 /* Since tuples are immutable, we can return a shared
365 copy in this case */
366 Py_INCREF(a);
367 return (PyObject *)a;
368 }
369 if (a->ob_size == 0)
370 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000371 }
372 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000373 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000374 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000376 if (np == NULL)
377 return NULL;
378 p = np->ob_item;
379 for (i = 0; i < n; i++) {
380 for (j = 0; j < a->ob_size; j++) {
381 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000383 p++;
384 }
385 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000387}
388
Jeremy Hylton8caad492000-06-23 14:18:11 +0000389static int
390tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
391{
392 int i, err;
393 PyObject *x;
394
395 for (i = o->ob_size; --i >= 0; ) {
396 x = o->ob_item[i];
397 if (x != NULL) {
398 err = visit(x, arg);
399 if (err)
400 return err;
401 }
402 }
403 return 0;
404}
405
Guido van Rossumf77bc622001-01-18 00:00:53 +0000406static PyObject *
407tuplerichcompare(PyObject *v, PyObject *w, int op)
408{
409 PyTupleObject *vt, *wt;
410 int i;
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000411 int vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000412
413 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
414 Py_INCREF(Py_NotImplemented);
415 return Py_NotImplemented;
416 }
417
418 vt = (PyTupleObject *)v;
419 wt = (PyTupleObject *)w;
420
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000421 vlen = vt->ob_size;
422 wlen = wt->ob_size;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000423
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000424 /* Note: the corresponding code for lists has an "early out" test
425 * here when op is EQ or NE and the lengths differ. That pays there,
426 * but Tim was unable to find any real code where EQ/NE tuple
427 * compares don't have the same length, so testing for it here would
428 * have cost without benefit.
429 */
430
431 /* Search for the first index where items are different.
432 * Note that because tuples are immutable, it's safe to reuse
433 * vlen and wlen across the comparison calls.
434 */
435 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000436 int k = PyObject_RichCompareBool(vt->ob_item[i],
437 wt->ob_item[i], Py_EQ);
438 if (k < 0)
439 return NULL;
440 if (!k)
441 break;
442 }
443
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000444 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000445 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000446 int cmp;
447 PyObject *res;
448 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000449 case Py_LT: cmp = vlen < wlen; break;
450 case Py_LE: cmp = vlen <= wlen; break;
451 case Py_EQ: cmp = vlen == wlen; break;
452 case Py_NE: cmp = vlen != wlen; break;
453 case Py_GT: cmp = vlen > wlen; break;
454 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000455 default: return NULL; /* cannot happen */
456 }
457 if (cmp)
458 res = Py_True;
459 else
460 res = Py_False;
461 Py_INCREF(res);
462 return res;
463 }
464
465 /* We have an item that differs -- shortcuts for EQ/NE */
466 if (op == Py_EQ) {
467 Py_INCREF(Py_False);
468 return Py_False;
469 }
470 if (op == Py_NE) {
471 Py_INCREF(Py_True);
472 return Py_True;
473 }
474
475 /* Compare the final item again using the proper operator */
476 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
477}
478
Jeremy Hylton938ace62002-07-17 16:30:39 +0000479static PyObject *
Guido van Rossumae960af2001-08-30 03:11:59 +0000480tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
481
Tim Peters6d6c1a32001-08-02 04:15:00 +0000482static PyObject *
483tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
484{
485 PyObject *arg = NULL;
486 static char *kwlist[] = {"sequence", 0};
487
Guido van Rossumae960af2001-08-30 03:11:59 +0000488 if (type != &PyTuple_Type)
489 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000490 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
491 return NULL;
492
493 if (arg == NULL)
494 return PyTuple_New(0);
495 else
496 return PySequence_Tuple(arg);
497}
498
Guido van Rossumae960af2001-08-30 03:11:59 +0000499static PyObject *
500tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
501{
502 PyObject *tmp, *new, *item;
503 int i, n;
504
505 assert(PyType_IsSubtype(type, &PyTuple_Type));
506 tmp = tuple_new(&PyTuple_Type, args, kwds);
507 if (tmp == NULL)
508 return NULL;
509 assert(PyTuple_Check(tmp));
510 new = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
511 if (new == NULL)
512 return NULL;
513 for (i = 0; i < n; i++) {
514 item = PyTuple_GET_ITEM(tmp, i);
515 Py_INCREF(item);
516 PyTuple_SET_ITEM(new, i, item);
517 }
518 Py_DECREF(tmp);
519 return new;
520}
521
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000522PyDoc_STRVAR(tuple_doc,
Tim Peters1b8ca0d2001-09-02 06:42:25 +0000523"tuple() -> an empty tuple\n"
524"tuple(sequence) -> tuple initialized from sequence's items\n"
525"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000526"If the argument is a tuple, the return value is the same object.");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000527
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528static PySequenceMethods tuple_as_sequence = {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000529 (inquiry)tuplelength, /* sq_length */
530 (binaryfunc)tupleconcat, /* sq_concat */
531 (intargfunc)tuplerepeat, /* sq_repeat */
532 (intargfunc)tupleitem, /* sq_item */
533 (intintargfunc)tupleslice, /* sq_slice */
534 0, /* sq_ass_item */
535 0, /* sq_ass_slice */
536 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537};
538
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000539static PyObject*
540tuplesubscript(PyTupleObject* self, PyObject* item)
541{
542 if (PyInt_Check(item)) {
543 long i = PyInt_AS_LONG(item);
544 if (i < 0)
545 i += PyTuple_GET_SIZE(self);
546 return tupleitem(self, i);
547 }
548 else if (PyLong_Check(item)) {
549 long i = PyLong_AsLong(item);
550 if (i == -1 && PyErr_Occurred())
551 return NULL;
552 if (i < 0)
553 i += PyTuple_GET_SIZE(self);
554 return tupleitem(self, i);
555 }
556 else if (PySlice_Check(item)) {
557 int start, stop, step, slicelength, cur, i;
558 PyObject* result;
559 PyObject* it;
560
561 if (PySlice_GetIndicesEx((PySliceObject*)item,
562 PyTuple_GET_SIZE(self),
563 &start, &stop, &step, &slicelength) < 0) {
564 return NULL;
565 }
566
567 if (slicelength <= 0) {
568 return PyTuple_New(0);
569 }
570 else {
571 result = PyTuple_New(slicelength);
572
573 for (cur = start, i = 0; i < slicelength;
574 cur += step, i++) {
575 it = PyTuple_GET_ITEM(self, cur);
576 Py_INCREF(it);
577 PyTuple_SET_ITEM(result, i, it);
578 }
579
580 return result;
581 }
582 }
583 else {
584 PyErr_SetString(PyExc_TypeError,
585 "tuple indices must be integers");
586 return NULL;
587 }
588}
589
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000590static PyObject *
591tuple_getnewargs(PyTupleObject *v)
592{
593 return Py_BuildValue("(N)", tupleslice(v, 0, v->ob_size));
594
595}
596
597static PyMethodDef tuple_methods[] = {
598 {"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
599 {NULL, NULL} /* sentinel */
600};
601
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000602static PyMappingMethods tuple_as_mapping = {
603 (inquiry)tuplelength,
604 (binaryfunc)tuplesubscript,
605 0
606};
607
Raymond Hettinger48923c52002-08-09 01:30:17 +0000608static PyObject *tuple_iter(PyObject *seq);
609
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000610PyTypeObject PyTuple_Type = {
611 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000612 0,
613 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000614 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000616 (destructor)tupledealloc, /* tp_dealloc */
617 (printfunc)tupleprint, /* tp_print */
618 0, /* tp_getattr */
619 0, /* tp_setattr */
620 0, /* tp_compare */
621 (reprfunc)tuplerepr, /* tp_repr */
622 0, /* tp_as_number */
623 &tuple_as_sequence, /* tp_as_sequence */
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000624 &tuple_as_mapping, /* tp_as_mapping */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000625 (hashfunc)tuplehash, /* tp_hash */
626 0, /* tp_call */
627 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000629 0, /* tp_setattro */
630 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000631 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
632 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000633 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000634 (traverseproc)tupletraverse, /* tp_traverse */
635 0, /* tp_clear */
636 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000637 0, /* tp_weaklistoffset */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000638 tuple_iter, /* tp_iter */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000639 0, /* tp_iternext */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000640 tuple_methods, /* tp_methods */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000641 0, /* tp_members */
642 0, /* tp_getset */
643 0, /* tp_base */
644 0, /* tp_dict */
645 0, /* tp_descr_get */
646 0, /* tp_descr_set */
647 0, /* tp_dictoffset */
648 0, /* tp_init */
649 0, /* tp_alloc */
650 tuple_new, /* tp_new */
Neil Schemenauer626d7742002-04-12 03:05:52 +0000651 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000652};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000653
654/* The following function breaks the notion that tuples are immutable:
655 it changes the size of a tuple. We get away with this only if there
656 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000657 as creating a new tuple object and destroying the old one, only more
658 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000659 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000660
661int
Tim Peters4324aa32001-05-28 22:30:08 +0000662_PyTuple_Resize(PyObject **pv, int newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000663{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000664 register PyTupleObject *v;
665 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000666 int i;
Guido van Rossumf70590f2001-12-07 20:00:04 +0000667 int oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000668
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000669 v = (PyTupleObject *) *pv;
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000670 if (v == NULL || v->ob_type != &PyTuple_Type ||
Thomas Wouters6a922372001-05-28 13:11:02 +0000671 (v->ob_size != 0 && v->ob_refcnt != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000672 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000673 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000674 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000675 return -1;
676 }
Guido van Rossumf70590f2001-12-07 20:00:04 +0000677 oldsize = v->ob_size;
678 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000679 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000680
Guido van Rossumf70590f2001-12-07 20:00:04 +0000681 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000682 /* Empty tuples are often shared, so we should never
683 resize them in-place even if we do own the only
684 (current) reference */
685 Py_DECREF(v);
686 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000687 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000688 }
689
Guido van Rossum12d12c51993-10-26 17:58:25 +0000690 /* XXX UNREF/NEWREF interface should be more symmetrical */
Tim Peters34592512002-07-11 06:23:50 +0000691 _Py_DEC_REFTOTAL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000692 _PyObject_GC_UNTRACK(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000693 _Py_ForgetReference((PyObject *) v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000694 /* DECREF items deleted by shrinkage */
695 for (i = newsize; i < oldsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000696 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000697 v->ob_item[i] = NULL;
698 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000699 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000700 if (sv == NULL) {
701 *pv = NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000702 PyObject_GC_Del(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000703 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000704 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000705 _Py_NewReference((PyObject *) sv);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000706 /* Zero out items added by growing */
Neal Norwitz35fc7602002-06-13 21:11:11 +0000707 if (newsize > oldsize)
Jeremy Hylton8b47dff2002-06-20 23:13:17 +0000708 memset(&sv->ob_item[oldsize], 0,
709 sizeof(*sv->ob_item) * (newsize - oldsize));
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000710 *pv = (PyObject *) sv;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000711 _PyObject_GC_TRACK(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000712 return 0;
713}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000714
715void
Fred Drakeba096332000-07-09 07:04:36 +0000716PyTuple_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000717{
718#if MAXSAVESIZE > 0
719 int i;
720
721 Py_XDECREF(free_tuples[0]);
722 free_tuples[0] = NULL;
723
724 for (i = 1; i < MAXSAVESIZE; i++) {
725 PyTupleObject *p, *q;
726 p = free_tuples[i];
727 free_tuples[i] = NULL;
728 while (p) {
729 q = p;
730 p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000731 PyObject_GC_Del(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000732 }
733 }
734#endif
735}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000736
737/*********************** Tuple Iterator **************************/
738
739typedef struct {
740 PyObject_HEAD
741 long it_index;
742 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
743} tupleiterobject;
744
745PyTypeObject PyTupleIter_Type;
746
747static PyObject *
748tuple_iter(PyObject *seq)
749{
750 tupleiterobject *it;
751
752 if (!PyTuple_Check(seq)) {
753 PyErr_BadInternalCall();
754 return NULL;
755 }
756 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
757 if (it == NULL)
758 return NULL;
759 it->it_index = 0;
760 Py_INCREF(seq);
761 it->it_seq = (PyTupleObject *)seq;
762 _PyObject_GC_TRACK(it);
763 return (PyObject *)it;
764}
765
766static void
767tupleiter_dealloc(tupleiterobject *it)
768{
769 _PyObject_GC_UNTRACK(it);
770 Py_XDECREF(it->it_seq);
771 PyObject_GC_Del(it);
772}
773
774static int
775tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
776{
777 if (it->it_seq == NULL)
778 return 0;
779 return visit((PyObject *)it->it_seq, arg);
780}
781
782
783static PyObject *
784tupleiter_getiter(PyObject *it)
785{
786 Py_INCREF(it);
787 return it;
788}
789
790static PyObject *
791tupleiter_next(tupleiterobject *it)
792{
793 PyTupleObject *seq;
794 PyObject *item;
795
796 assert(it != NULL);
797 seq = it->it_seq;
798 if (seq == NULL)
799 return NULL;
800 assert(PyTuple_Check(seq));
801
802 if (it->it_index < PyTuple_GET_SIZE(seq)) {
803 item = PyTuple_GET_ITEM(seq, it->it_index);
804 ++it->it_index;
805 Py_INCREF(item);
806 return item;
807 }
808
809 Py_DECREF(seq);
810 it->it_seq = NULL;
811 return NULL;
812}
813
814PyTypeObject PyTupleIter_Type = {
815 PyObject_HEAD_INIT(&PyType_Type)
816 0, /* ob_size */
817 "tupleiterator", /* tp_name */
818 sizeof(tupleiterobject), /* tp_basicsize */
819 0, /* tp_itemsize */
820 /* methods */
821 (destructor)tupleiter_dealloc, /* tp_dealloc */
822 0, /* tp_print */
823 0, /* tp_getattr */
824 0, /* tp_setattr */
825 0, /* tp_compare */
826 0, /* tp_repr */
827 0, /* tp_as_number */
828 0, /* tp_as_sequence */
829 0, /* tp_as_mapping */
830 0, /* tp_hash */
831 0, /* tp_call */
832 0, /* tp_str */
833 PyObject_GenericGetAttr, /* tp_getattro */
834 0, /* tp_setattro */
835 0, /* tp_as_buffer */
836 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
837 0, /* tp_doc */
838 (traverseproc)tupleiter_traverse, /* tp_traverse */
839 0, /* tp_clear */
840 0, /* tp_richcompare */
841 0, /* tp_weaklistoffset */
842 (getiterfunc)tupleiter_getiter, /* tp_iter */
843 (iternextfunc)tupleiter_next, /* tp_iternext */
844};