blob: f39f6c0885872887345b403ba479c64e0b9ceb87 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Tuple object implementation */
12
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
Guido van Rossum5ce78f82000-04-21 21:15:05 +000015/* Speed optimization to avoid frequent malloc/free of small tuples */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000016#ifndef MAXSAVESIZE
Guido van Rossum5ce78f82000-04-21 21:15:05 +000017#define MAXSAVESIZE 20 /* Largest tuple to save on free list */
18#endif
19#ifndef MAXSAVEDTUPLES
20#define MAXSAVEDTUPLES 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000021#endif
22
23#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +000024/* Entries 1 up to MAXSAVESIZE are free lists, entry 0 is the empty
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000025 tuple () of which at most one instance will be allocated.
26*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000027static PyTupleObject *free_tuples[MAXSAVESIZE];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000028static int num_free_tuples[MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000029#endif
30#ifdef COUNT_ALLOCS
31int fast_tuple_allocs;
32int tuple_zero_allocs;
33#endif
34
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035PyObject *
36PyTuple_New(size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037 register int size;
38{
39 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043 return NULL;
44 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000045#if MAXSAVESIZE > 0
Sjoerd Mullender615194a1993-11-01 13:46:50 +000046 if (size == 0 && free_tuples[0]) {
47 op = free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000049#ifdef COUNT_ALLOCS
50 tuple_zero_allocs++;
51#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000053 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054 if (0 < size && size < MAXSAVESIZE &&
55 (op = free_tuples[size]) != NULL)
56 {
57 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000058 num_free_tuples[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000059#ifdef COUNT_ALLOCS
60 fast_tuple_allocs++;
61#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000062 /* PyObject_InitVar is inlined */
Guido van Rossum68055ce1998-12-11 14:56:38 +000063#ifdef Py_TRACE_REFS
Guido van Rossum68055ce1998-12-11 14:56:38 +000064 op->ob_size = size;
Guido van Rossumb18618d2000-05-03 23:44:39 +000065 op->ob_type = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000066#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000067 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000068 }
69 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000070#endif
71 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000072 int nbytes = size * sizeof(PyObject *);
73 /* Check for overflow */
74 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Jeremy Hyltond08b4c42000-06-23 19:37:02 +000075 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000076 + PyGC_HEAD_SIZE)
Guido van Rossum5bc51f21999-07-12 23:06:58 +000077 <= 0)
78 {
79 return PyErr_NoMemory();
80 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000081 /* PyObject_NewVar is inlined */
82 op = (PyTupleObject *) PyObject_MALLOC(nbytes);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000083 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 return PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000085 op = (PyTupleObject *) PyObject_FROM_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +000086 PyObject_INIT_VAR(op, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000087 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 for (i = 0; i < size; i++)
89 op->ob_item[i] = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000090#if MAXSAVESIZE > 0
91 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000092 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +000093 ++num_free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000095 }
96#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000097 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099}
100
101int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102PyTuple_Size(op)
103 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 if (!PyTuple_Check(op)) {
106 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107 return -1;
108 }
109 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111}
112
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113PyObject *
114PyTuple_GetItem(op, i)
115 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 register int i;
117{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 if (!PyTuple_Check(op)) {
119 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 return NULL;
121 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
123 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 return NULL;
125 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127}
128
129int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130PyTuple_SetItem(op, i, newitem)
131 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 register PyObject *olditem;
136 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000137 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 Py_XDECREF(newitem);
139 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000140 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
143 Py_XDECREF(newitem);
144 PyErr_SetString(PyExc_IndexError,
145 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000146 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000149 olditem = *p;
150 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152 return 0;
153}
154
155/* Methods */
156
157static void
158tupledealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160{
161 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000162 register int len = op->ob_size;
Guido van Rossumd724b232000-03-13 16:01:29 +0000163 Py_TRASHCAN_SAFE_BEGIN(op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000164 PyObject_GC_Fini(op);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000165 if (len > 0) {
166 i = len;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000167 while (--i >= 0)
168 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000169#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000170 if (len < MAXSAVESIZE && num_free_tuples[len] < MAXSAVEDTUPLES) {
171 op->ob_item[0] = (PyObject *) free_tuples[len];
172 num_free_tuples[len]++;
173 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000174 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000175 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000176#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000177 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000178 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000179done:
180 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181}
182
Guido van Rossum49e85141991-06-07 22:59:30 +0000183static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186 FILE *fp;
187 int flags;
188{
189 int i;
190 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000191 for (i = 0; i < op->ob_size; i++) {
192 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000195 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196 }
197 if (op->ob_size == 1)
198 fprintf(fp, ",");
199 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000200 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201}
202
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 s = PyString_FromString("(");
210 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 for (i = 0; i < v->ob_size && s != NULL; i++) {
212 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 PyString_Concat(&s, comma);
214 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000217 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000218 PyString_ConcatAndDel(&s, PyString_FromString(","));
219 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 return s;
221}
222
223static int
224tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226{
227 register int len =
228 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
229 register int i;
230 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 if (cmp != 0)
233 return cmp;
234 }
235 return v->ob_size - w->ob_size;
236}
237
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238static long
239tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000240 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000241{
242 register long x, y;
243 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000245 x = 0x345678L;
246 p = v->ob_item;
247 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000249 if (y == -1)
250 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000251 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000252 }
253 x ^= v->ob_size;
254 if (x == -1)
255 x = -2;
256 return x;
257}
258
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259static int
260tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262{
263 return a->ob_size;
264}
265
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000266static int
267tuplecontains(a, el)
268 PyTupleObject *a;
269 PyObject *el;
270{
271 int i, cmp;
272
273 for (i = 0; i < a->ob_size; ++i) {
274 cmp = PyObject_Compare(el, PyTuple_GET_ITEM(a, i));
275 if (cmp == 0)
276 return 1;
277 if (PyErr_Occurred())
278 return -1;
279 }
280 return 0;
281}
282
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 register int i;
287{
288 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290 return NULL;
291 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293 return a->ob_item[i];
294}
295
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000298 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 register int ilow, ihigh;
300{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000302 register int i;
303 if (ilow < 0)
304 ilow = 0;
305 if (ihigh > a->ob_size)
306 ihigh = a->ob_size;
307 if (ihigh < ilow)
308 ihigh = ilow;
309 if (ilow == 0 && ihigh == a->ob_size) {
310 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 Py_INCREF(a);
312 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 if (np == NULL)
316 return NULL;
317 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318 PyObject *v = a->ob_item[i];
319 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320 np->ob_item[i - ilow] = v;
321 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323}
324
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325PyObject *
326PyTuple_GetSlice(op, i, j)
327 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000328 int i, j;
329{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 if (op == NULL || !PyTuple_Check(op)) {
331 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000332 return NULL;
333 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000335}
336
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 register PyTupleObject *a;
340 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341{
342 register int size;
343 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 PyTupleObject *np;
345 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000346 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000347 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000348 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349 return NULL;
350 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000355 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356 }
357 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 PyObject *v = a->ob_item[i];
359 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360 np->ob_item[i] = v;
361 }
362 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 PyObject *v = b->ob_item[i];
364 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365 np->ob_item[i + a->ob_size] = v;
366 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368#undef b
369}
370
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000372tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000374 int n;
375{
376 int i, j;
377 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 PyTupleObject *np;
379 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000380 if (n < 0)
381 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000382 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000383 /* Since tuples are immutable, we can return a shared
384 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385 Py_INCREF(a);
386 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000387 }
388 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000389 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000390 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000392 if (np == NULL)
393 return NULL;
394 p = np->ob_item;
395 for (i = 0; i < n; i++) {
396 for (j = 0; j < a->ob_size; j++) {
397 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000399 p++;
400 }
401 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000403}
404
Jeremy Hylton8caad492000-06-23 14:18:11 +0000405static int
406tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
407{
408 int i, err;
409 PyObject *x;
410
411 for (i = o->ob_size; --i >= 0; ) {
412 x = o->ob_item[i];
413 if (x != NULL) {
414 err = visit(x, arg);
415 if (err)
416 return err;
417 }
418 }
419 return 0;
420}
421
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000423 (inquiry)tuplelength, /*sq_length*/
424 (binaryfunc)tupleconcat, /*sq_concat*/
425 (intargfunc)tuplerepeat, /*sq_repeat*/
426 (intargfunc)tupleitem, /*sq_item*/
427 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428 0, /*sq_ass_item*/
429 0, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000430 (objobjproc)tuplecontains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431};
432
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433PyTypeObject PyTuple_Type = {
434 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435 0,
436 "tuple",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000437 sizeof(PyTupleObject) - sizeof(PyObject *) + PyGC_HEAD_SIZE,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000439 (destructor)tupledealloc, /*tp_dealloc*/
440 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441 0, /*tp_getattr*/
442 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000443 (cmpfunc)tuplecompare, /*tp_compare*/
444 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445 0, /*tp_as_number*/
446 &tuple_as_sequence, /*tp_as_sequence*/
447 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000448 (hashfunc)tuplehash, /*tp_hash*/
Fred Drake56780252000-06-15 14:50:20 +0000449 0, /*tp_call*/
450 0, /*tp_str*/
451 0, /*tp_getattro*/
452 0, /*tp_setattro*/
453 0, /*tp_as_buffer*/
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000454 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000455 0, /*tp_doc*/
456 (traverseproc)tupletraverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000457};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000458
459/* The following function breaks the notion that tuples are immutable:
460 it changes the size of a tuple. We get away with this only if there
461 is only one module referencing the object. You can also think of it
462 as creating a new tuple object and destroying the old one, only
463 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000464 already be known to some other part of the code...
465 If last_is_sticky is set, the tuple will grow or shrink at the
466 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000467
468int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469_PyTuple_Resize(pv, newsize, last_is_sticky)
470 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000471 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000472 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000473{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 register PyTupleObject *v;
475 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000476 int i;
477 int sizediff;
478
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 v = (PyTupleObject *) *pv;
480 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000481 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 Py_DECREF(v);
483 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000484 return -1;
485 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000486 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000487 if (sizediff == 0)
488 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000489 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000490#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000491 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000492#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000493 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000494 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 /* shrinking:
496 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000497 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000499 v->ob_item[i] = v->ob_item[i - sizediff];
500 v->ob_item[i - sizediff] = NULL;
501 }
502 }
503 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000505 v->ob_item[i] = NULL;
506 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000507#if MAXSAVESIZE > 0
508 if (newsize == 0 && free_tuples[0]) {
509 num_free_tuples[0]--;
510 sv = free_tuples[0];
511 sv->ob_size = 0;
512 Py_INCREF(sv);
513#ifdef COUNT_ALLOCS
514 tuple_zero_allocs++;
515#endif
516 tupledealloc(v);
517 *pv = (PyObject*) sv;
518 return 0;
519 }
520 if (0 < newsize && newsize < MAXSAVESIZE &&
521 (sv = free_tuples[newsize]) != NULL)
522 {
523 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
524 num_free_tuples[newsize]--;
525#ifdef COUNT_ALLOCS
526 fast_tuple_allocs++;
527#endif
528#ifdef Py_TRACE_REFS
529 sv->ob_type = &PyTuple_Type;
530#endif
531 for (i = 0; i < newsize; ++i){
532 sv->ob_item[i] = v->ob_item[i];
533 v->ob_item[i] = NULL;
534 }
535 sv->ob_size = v->ob_size;
536 tupledealloc(v);
537 *pv = (PyObject *) sv;
538 } else
539#endif
540 {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000541#ifdef WITH_CYCLE_GC
542 PyGC_Head *g = PyObject_AS_GC((PyObject *)v);
543 PyObject_GC_Fini((PyObject *)v);
544 sv = (PyTupleObject *)
545 PyObject_REALLOC((char *)g, sizeof(PyTupleObject)
546 + PyGC_HEAD_SIZE
547 + newsize * sizeof(PyObject *));
548 if (g == NULL) {
549 sv = NULL;
550 } else {
551 sv = (PyTupleObject *)PyObject_FROM_GC(g);
552 }
553#else
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000554 sv = (PyTupleObject *)
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000555 PyObject_REALLOC((char *)v, sizeof(PyTupleObject)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000556 + PyGC_HEAD_SIZE
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000557 + newsize * sizeof(PyObject *));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000558#endif
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000559 *pv = (PyObject *) sv;
560 if (sv == NULL) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000561 PyObject_GC_Init((PyObject *)v);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000562 PyObject_DEL(v);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000563 PyErr_NoMemory();
564 return -1;
565 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000566 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000567 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000568 for (i = sv->ob_size; i < newsize; i++)
569 sv->ob_item[i] = NULL;
570 if (last_is_sticky && sizediff > 0) {
571 /* growing: move entries to the end and zero moved entries */
572 for (i = newsize - 1; i >= sizediff; i--) {
573 sv->ob_item[i] = sv->ob_item[i - sizediff];
574 sv->ob_item[i - sizediff] = NULL;
575 }
576 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000577 PyObject_GC_Init(sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000578 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000579 return 0;
580}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000581
582void
583PyTuple_Fini()
584{
585#if MAXSAVESIZE > 0
586 int i;
587
588 Py_XDECREF(free_tuples[0]);
589 free_tuples[0] = NULL;
590
591 for (i = 1; i < MAXSAVESIZE; i++) {
592 PyTupleObject *p, *q;
593 p = free_tuples[i];
594 free_tuples[i] = NULL;
595 while (p) {
596 q = p;
597 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000598 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000599 }
600 }
601#endif
602}