blob: ab792def9323a31a9d8388831dda6cf07ad422fe [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{
29 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000030 register PyTupleObject *op;
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 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044 if (0 < size && size < MAXSAVESIZE &&
45 (op = free_tuples[size]) != NULL)
46 {
47 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000048 num_free_tuples[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000049#ifdef COUNT_ALLOCS
50 fast_tuple_allocs++;
51#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000052 /* PyObject_InitVar is inlined */
Guido van Rossum68055ce1998-12-11 14:56:38 +000053#ifdef Py_TRACE_REFS
Guido van Rossum68055ce1998-12-11 14:56:38 +000054 op->ob_size = size;
Guido van Rossumb18618d2000-05-03 23:44:39 +000055 op->ob_type = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000056#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000057 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000058 }
59 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000060#endif
61 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000062 int nbytes = size * sizeof(PyObject *);
63 /* Check for overflow */
64 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Neil Schemenauere83c00e2001-08-29 23:54:21 +000065 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
Guido van Rossum5bc51f21999-07-12 23:06:58 +000066 <= 0)
67 {
68 return PyErr_NoMemory();
69 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +000070 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000071 if (op == NULL)
Neil Schemenauere83c00e2001-08-29 23:54:21 +000072 return NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000073 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 for (i = 0; i < size; i++)
75 op->ob_item[i] = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000076#if MAXSAVESIZE > 0
77 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000078 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +000079 ++num_free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000080 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000081 }
82#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +000083 _PyObject_GC_TRACK(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085}
86
87int
Fred Drakeba096332000-07-09 07:04:36 +000088PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 if (!PyTuple_Check(op)) {
91 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092 return -1;
93 }
94 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096}
97
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098PyObject *
Fred Drakeba096332000-07-09 07:04:36 +000099PyTuple_GetItem(register PyObject *op, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101 if (!PyTuple_Check(op)) {
102 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103 return NULL;
104 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
106 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107 return NULL;
108 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110}
111
112int
Fred Drakeba096332000-07-09 07:04:36 +0000113PyTuple_SetItem(register PyObject *op, register int i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 register PyObject *olditem;
116 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000117 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 Py_XDECREF(newitem);
119 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000120 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
123 Py_XDECREF(newitem);
124 PyErr_SetString(PyExc_IndexError,
125 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000126 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000129 olditem = *p;
130 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 return 0;
133}
134
135/* Methods */
136
137static void
Fred Drakeba096332000-07-09 07:04:36 +0000138tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139{
140 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000141 register int len = op->ob_size;
Guido van Rossumff413af2002-03-28 20:34:59 +0000142 PyObject_GC_UnTrack(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000143 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000144 if (len > 0) {
145 i = len;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000146 while (--i >= 0)
147 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000148#if MAXSAVESIZE > 0
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000149 if (len < MAXSAVESIZE &&
150 num_free_tuples[len] < MAXSAVEDTUPLES &&
151 op->ob_type == &PyTuple_Type)
152 {
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000153 op->ob_item[0] = (PyObject *) free_tuples[len];
154 num_free_tuples[len]++;
155 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000156 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000157 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000158#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000159 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000160 op->ob_type->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000161done:
162 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163}
164
Guido van Rossum49e85141991-06-07 22:59:30 +0000165static int
Fred Drakeba096332000-07-09 07:04:36 +0000166tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167{
168 int i;
169 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000170 for (i = 0; i < op->ob_size; i++) {
171 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000174 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175 }
176 if (op->ob_size == 1)
177 fprintf(fp, ",");
178 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000179 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180}
181
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000183tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184{
Tim Petersa7259592001-06-16 05:11:17 +0000185 int i, n;
186 PyObject *s, *temp;
187 PyObject *pieces, *result = NULL;
188
189 n = v->ob_size;
190 if (n == 0)
191 return PyString_FromString("()");
192
193 pieces = PyTuple_New(n);
194 if (pieces == NULL)
195 return NULL;
196
197 /* Do repr() on each element. */
198 for (i = 0; i < n; ++i) {
199 s = PyObject_Repr(v->ob_item[i]);
200 if (s == NULL)
201 goto Done;
202 PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 }
Tim Petersa7259592001-06-16 05:11:17 +0000204
205 /* Add "()" decorations to the first and last items. */
206 assert(n > 0);
207 s = PyString_FromString("(");
208 if (s == NULL)
209 goto Done;
210 temp = PyTuple_GET_ITEM(pieces, 0);
211 PyString_ConcatAndDel(&s, temp);
212 PyTuple_SET_ITEM(pieces, 0, s);
213 if (s == NULL)
214 goto Done;
215
216 s = PyString_FromString(n == 1 ? ",)" : ")");
217 if (s == NULL)
218 goto Done;
219 temp = PyTuple_GET_ITEM(pieces, n-1);
220 PyString_ConcatAndDel(&temp, s);
221 PyTuple_SET_ITEM(pieces, n-1, temp);
222 if (temp == NULL)
223 goto Done;
224
225 /* Paste them all together with ", " between. */
226 s = PyString_FromString(", ");
227 if (s == NULL)
228 goto Done;
229 result = _PyString_Join(s, pieces);
230 Py_DECREF(s);
231
232Done:
233 Py_DECREF(pieces);
234 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235}
236
Guido van Rossum9bfef441993-03-29 10:43:31 +0000237static long
Fred Drakeba096332000-07-09 07:04:36 +0000238tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000239{
240 register long x, y;
241 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000242 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000243 x = 0x345678L;
244 p = v->ob_item;
245 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000247 if (y == -1)
248 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000249 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000250 }
251 x ^= v->ob_size;
252 if (x == -1)
253 x = -2;
254 return x;
255}
256
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257static int
Fred Drakeba096332000-07-09 07:04:36 +0000258tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259{
260 return a->ob_size;
261}
262
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000263static int
Fred Drakeba096332000-07-09 07:04:36 +0000264tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000265{
266 int i, cmp;
267
268 for (i = 0; i < a->ob_size; ++i) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000269 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
270 Py_EQ);
271 if (cmp > 0)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000272 return 1;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000273 else if (cmp < 0)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000274 return -1;
275 }
276 return 0;
277}
278
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000280tupleitem(register PyTupleObject *a, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281{
282 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284 return NULL;
285 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 return a->ob_item[i];
288}
289
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000290static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000291tupleslice(register PyTupleObject *a, register int ilow, register int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000293 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 register int i;
295 if (ilow < 0)
296 ilow = 0;
297 if (ihigh > a->ob_size)
298 ihigh = a->ob_size;
299 if (ihigh < ilow)
300 ihigh = ilow;
Tim Peters7b07a412001-09-11 19:48:03 +0000301 if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 Py_INCREF(a);
303 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306 if (np == NULL)
307 return NULL;
308 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 PyObject *v = a->ob_item[i];
310 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 np->ob_item[i - ilow] = v;
312 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000313 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314}
315
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000317PyTuple_GetSlice(PyObject *op, int i, int j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000318{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 if (op == NULL || !PyTuple_Check(op)) {
320 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000321 return NULL;
322 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000324}
325
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000327tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328{
329 register int size;
330 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331 PyTupleObject *np;
332 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000333 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000334 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000335 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 return NULL;
337 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000342 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 }
344 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 PyObject *v = a->ob_item[i];
346 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 np->ob_item[i] = v;
348 }
349 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 PyObject *v = b->ob_item[i];
351 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352 np->ob_item[i + a->ob_size] = v;
353 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355#undef b
356}
357
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000359tuplerepeat(PyTupleObject *a, int n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000360{
361 int i, j;
362 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 PyTupleObject *np;
364 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000365 if (n < 0)
366 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000367 if (a->ob_size == 0 || n == 1) {
Tim Peters7b07a412001-09-11 19:48:03 +0000368 if (PyTuple_CheckExact(a)) {
369 /* Since tuples are immutable, we can return a shared
370 copy in this case */
371 Py_INCREF(a);
372 return (PyObject *)a;
373 }
374 if (a->ob_size == 0)
375 return PyTuple_New(0);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000376 }
377 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000378 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000379 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000380 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000381 if (np == NULL)
382 return NULL;
383 p = np->ob_item;
384 for (i = 0; i < n; i++) {
385 for (j = 0; j < a->ob_size; j++) {
386 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000388 p++;
389 }
390 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000392}
393
Jeremy Hylton8caad492000-06-23 14:18:11 +0000394static int
395tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
396{
397 int i, err;
398 PyObject *x;
399
400 for (i = o->ob_size; --i >= 0; ) {
401 x = o->ob_item[i];
402 if (x != NULL) {
403 err = visit(x, arg);
404 if (err)
405 return err;
406 }
407 }
408 return 0;
409}
410
Guido van Rossumf77bc622001-01-18 00:00:53 +0000411static PyObject *
412tuplerichcompare(PyObject *v, PyObject *w, int op)
413{
414 PyTupleObject *vt, *wt;
415 int i;
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000416 int vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000417
418 if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
419 Py_INCREF(Py_NotImplemented);
420 return Py_NotImplemented;
421 }
422
423 vt = (PyTupleObject *)v;
424 wt = (PyTupleObject *)w;
425
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000426 vlen = vt->ob_size;
427 wlen = wt->ob_size;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000428
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000429 /* Note: the corresponding code for lists has an "early out" test
430 * here when op is EQ or NE and the lengths differ. That pays there,
431 * but Tim was unable to find any real code where EQ/NE tuple
432 * compares don't have the same length, so testing for it here would
433 * have cost without benefit.
434 */
435
436 /* Search for the first index where items are different.
437 * Note that because tuples are immutable, it's safe to reuse
438 * vlen and wlen across the comparison calls.
439 */
440 for (i = 0; i < vlen && i < wlen; i++) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000441 int k = PyObject_RichCompareBool(vt->ob_item[i],
442 wt->ob_item[i], Py_EQ);
443 if (k < 0)
444 return NULL;
445 if (!k)
446 break;
447 }
448
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000449 if (i >= vlen || i >= wlen) {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000450 /* No more items to compare -- compare sizes */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000451 int cmp;
452 PyObject *res;
453 switch (op) {
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000454 case Py_LT: cmp = vlen < wlen; break;
455 case Py_LE: cmp = vlen <= wlen; break;
456 case Py_EQ: cmp = vlen == wlen; break;
457 case Py_NE: cmp = vlen != wlen; break;
458 case Py_GT: cmp = vlen > wlen; break;
459 case Py_GE: cmp = vlen >= wlen; break;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000460 default: return NULL; /* cannot happen */
461 }
462 if (cmp)
463 res = Py_True;
464 else
465 res = Py_False;
466 Py_INCREF(res);
467 return res;
468 }
469
470 /* We have an item that differs -- shortcuts for EQ/NE */
471 if (op == Py_EQ) {
472 Py_INCREF(Py_False);
473 return Py_False;
474 }
475 if (op == Py_NE) {
476 Py_INCREF(Py_True);
477 return Py_True;
478 }
479
480 /* Compare the final item again using the proper operator */
481 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
482}
483
Guido van Rossumae960af2001-08-30 03:11:59 +0000484staticforward PyObject *
485tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
486
Tim Peters6d6c1a32001-08-02 04:15:00 +0000487static PyObject *
488tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
489{
490 PyObject *arg = NULL;
491 static char *kwlist[] = {"sequence", 0};
492
Guido van Rossumae960af2001-08-30 03:11:59 +0000493 if (type != &PyTuple_Type)
494 return tuple_subtype_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
496 return NULL;
497
498 if (arg == NULL)
499 return PyTuple_New(0);
500 else
501 return PySequence_Tuple(arg);
502}
503
Guido van Rossumae960af2001-08-30 03:11:59 +0000504static PyObject *
505tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
506{
507 PyObject *tmp, *new, *item;
508 int i, n;
509
510 assert(PyType_IsSubtype(type, &PyTuple_Type));
511 tmp = tuple_new(&PyTuple_Type, args, kwds);
512 if (tmp == NULL)
513 return NULL;
514 assert(PyTuple_Check(tmp));
515 new = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
516 if (new == NULL)
517 return NULL;
518 for (i = 0; i < n; i++) {
519 item = PyTuple_GET_ITEM(tmp, i);
520 Py_INCREF(item);
521 PyTuple_SET_ITEM(new, i, item);
522 }
523 Py_DECREF(tmp);
524 return new;
525}
526
Tim Peters6d6c1a32001-08-02 04:15:00 +0000527static char tuple_doc[] =
Tim Peters1b8ca0d2001-09-02 06:42:25 +0000528"tuple() -> an empty tuple\n"
529"tuple(sequence) -> tuple initialized from sequence's items\n"
530"\n"
531"If the argument is a tuple, the return value is the same object.";
Tim Peters6d6c1a32001-08-02 04:15:00 +0000532
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533static PySequenceMethods tuple_as_sequence = {
Guido van Rossumf77bc622001-01-18 00:00:53 +0000534 (inquiry)tuplelength, /* sq_length */
535 (binaryfunc)tupleconcat, /* sq_concat */
536 (intargfunc)tuplerepeat, /* sq_repeat */
537 (intargfunc)tupleitem, /* sq_item */
538 (intintargfunc)tupleslice, /* sq_slice */
539 0, /* sq_ass_item */
540 0, /* sq_ass_slice */
541 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000542};
543
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544PyTypeObject PyTuple_Type = {
545 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000546 0,
547 "tuple",
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000548 sizeof(PyTupleObject) - sizeof(PyObject *),
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 sizeof(PyObject *),
Guido van Rossumf77bc622001-01-18 00:00:53 +0000550 (destructor)tupledealloc, /* tp_dealloc */
551 (printfunc)tupleprint, /* tp_print */
552 0, /* tp_getattr */
553 0, /* tp_setattr */
554 0, /* tp_compare */
555 (reprfunc)tuplerepr, /* tp_repr */
556 0, /* tp_as_number */
557 &tuple_as_sequence, /* tp_as_sequence */
558 0, /* tp_as_mapping */
559 (hashfunc)tuplehash, /* tp_hash */
560 0, /* tp_call */
561 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000562 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000563 0, /* tp_setattro */
564 0, /* tp_as_buffer */
Guido van Rossumae960af2001-08-30 03:11:59 +0000565 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
566 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000567 tuple_doc, /* tp_doc */
Guido van Rossumf77bc622001-01-18 00:00:53 +0000568 (traverseproc)tupletraverse, /* tp_traverse */
569 0, /* tp_clear */
570 tuplerichcompare, /* tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000571 0, /* tp_weaklistoffset */
572 0, /* tp_iter */
573 0, /* tp_iternext */
574 0, /* tp_methods */
575 0, /* tp_members */
576 0, /* tp_getset */
577 0, /* tp_base */
578 0, /* tp_dict */
579 0, /* tp_descr_get */
580 0, /* tp_descr_set */
581 0, /* tp_dictoffset */
582 0, /* tp_init */
583 0, /* tp_alloc */
584 tuple_new, /* tp_new */
Guido van Rossum9475a232001-10-05 20:51:39 +0000585 _PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000586};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000587
588/* The following function breaks the notion that tuples are immutable:
589 it changes the size of a tuple. We get away with this only if there
590 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000591 as creating a new tuple object and destroying the old one, only more
592 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000593 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000594
595int
Tim Peters4324aa32001-05-28 22:30:08 +0000596_PyTuple_Resize(PyObject **pv, int newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000597{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000598 register PyTupleObject *v;
599 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000600 int i;
Guido van Rossumf70590f2001-12-07 20:00:04 +0000601 int oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000602
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 v = (PyTupleObject *) *pv;
Guido van Rossum4b8c0f62001-08-30 18:31:30 +0000604 if (v == NULL || v->ob_type != &PyTuple_Type ||
Thomas Wouters6a922372001-05-28 13:11:02 +0000605 (v->ob_size != 0 && v->ob_refcnt != 1)) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000606 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000607 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000608 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000609 return -1;
610 }
Guido van Rossumf70590f2001-12-07 20:00:04 +0000611 oldsize = v->ob_size;
612 if (oldsize == newsize)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000613 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000614
Guido van Rossumf70590f2001-12-07 20:00:04 +0000615 if (oldsize == 0) {
Thomas Wouters6a922372001-05-28 13:11:02 +0000616 /* Empty tuples are often shared, so we should never
617 resize them in-place even if we do own the only
618 (current) reference */
619 Py_DECREF(v);
620 *pv = PyTuple_New(newsize);
Thomas Wouters0dcea592001-05-29 07:58:45 +0000621 return *pv == NULL ? -1 : 0;
Thomas Wouters6a922372001-05-28 13:11:02 +0000622 }
623
Guido van Rossum12d12c51993-10-26 17:58:25 +0000624 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000625#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000626 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000627#endif
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000628 _PyObject_GC_UNTRACK(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000629 _Py_ForgetReference((PyObject *) v);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000630 /* DECREF items deleted by shrinkage */
631 for (i = newsize; i < oldsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000633 v->ob_item[i] = NULL;
634 }
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000635 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000636 if (sv == NULL) {
637 *pv = NULL;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000638 PyObject_GC_Del(v);
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000639 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000640 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000641 _Py_NewReference((PyObject *) sv);
Guido van Rossumf70590f2001-12-07 20:00:04 +0000642 /* Zero out items added by growing */
643 for (i = oldsize; i < newsize; i++)
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000644 sv->ob_item[i] = NULL;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000645 *pv = (PyObject *) sv;
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000646 _PyObject_GC_TRACK(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000647 return 0;
648}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000649
650void
Fred Drakeba096332000-07-09 07:04:36 +0000651PyTuple_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000652{
653#if MAXSAVESIZE > 0
654 int i;
655
656 Py_XDECREF(free_tuples[0]);
657 free_tuples[0] = NULL;
658
659 for (i = 1; i < MAXSAVESIZE; i++) {
660 PyTupleObject *p, *q;
661 p = free_tuples[i];
662 free_tuples[i] = NULL;
663 while (p) {
664 q = p;
665 p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000666 PyObject_GC_Del(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000667 }
668 }
669#endif
670}