blob: 7ce941703e8e24b8659da8579fe5220a0075841f [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 Rossum4cc6ac72000-07-01 01:00:38 +0000178 op = (PyTupleObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000179 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000180done:
181 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182}
183
Guido van Rossum49e85141991-06-07 22:59:30 +0000184static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187 FILE *fp;
188 int flags;
189{
190 int i;
191 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000192 for (i = 0; i < op->ob_size; i++) {
193 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000196 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197 }
198 if (op->ob_size == 1)
199 fprintf(fp, ",");
200 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000201 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202}
203
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 s = PyString_FromString("(");
211 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 for (i = 0; i < v->ob_size && s != NULL; i++) {
213 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 PyString_Concat(&s, comma);
215 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000218 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219 PyString_ConcatAndDel(&s, PyString_FromString(","));
220 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221 return s;
222}
223
224static int
225tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227{
228 register int len =
229 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
230 register int i;
231 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233 if (cmp != 0)
234 return cmp;
235 }
236 return v->ob_size - w->ob_size;
237}
238
Guido van Rossum9bfef441993-03-29 10:43:31 +0000239static long
240tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000242{
243 register long x, y;
244 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000245 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000246 x = 0x345678L;
247 p = v->ob_item;
248 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000250 if (y == -1)
251 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000252 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000253 }
254 x ^= v->ob_size;
255 if (x == -1)
256 x = -2;
257 return x;
258}
259
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260static int
261tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263{
264 return a->ob_size;
265}
266
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000267static int
268tuplecontains(a, el)
269 PyTupleObject *a;
270 PyObject *el;
271{
272 int i, cmp;
273
274 for (i = 0; i < a->ob_size; ++i) {
275 cmp = PyObject_Compare(el, PyTuple_GET_ITEM(a, i));
276 if (cmp == 0)
277 return 1;
278 if (PyErr_Occurred())
279 return -1;
280 }
281 return 0;
282}
283
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 register int i;
288{
289 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000290 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 return NULL;
292 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000293 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 return a->ob_item[i];
295}
296
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 register int ilow, ihigh;
301{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 register int i;
304 if (ilow < 0)
305 ilow = 0;
306 if (ihigh > a->ob_size)
307 ihigh = a->ob_size;
308 if (ihigh < ilow)
309 ihigh = ilow;
310 if (ilow == 0 && ihigh == a->ob_size) {
311 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 Py_INCREF(a);
313 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316 if (np == NULL)
317 return NULL;
318 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 PyObject *v = a->ob_item[i];
320 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 np->ob_item[i - ilow] = v;
322 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324}
325
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326PyObject *
327PyTuple_GetSlice(op, i, j)
328 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000329 int i, j;
330{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331 if (op == NULL || !PyTuple_Check(op)) {
332 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000333 return NULL;
334 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000336}
337
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 register PyTupleObject *a;
341 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342{
343 register int size;
344 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 PyTupleObject *np;
346 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000347 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000348 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000349 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350 return NULL;
351 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000356 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357 }
358 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 PyObject *v = a->ob_item[i];
360 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361 np->ob_item[i] = v;
362 }
363 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 PyObject *v = b->ob_item[i];
365 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 np->ob_item[i + a->ob_size] = v;
367 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000368 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369#undef b
370}
371
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000373tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000375 int n;
376{
377 int i, j;
378 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 PyTupleObject *np;
380 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000381 if (n < 0)
382 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000383 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000384 /* Since tuples are immutable, we can return a shared
385 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 Py_INCREF(a);
387 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000388 }
389 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000390 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000391 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000393 if (np == NULL)
394 return NULL;
395 p = np->ob_item;
396 for (i = 0; i < n; i++) {
397 for (j = 0; j < a->ob_size; j++) {
398 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000400 p++;
401 }
402 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000404}
405
Jeremy Hylton8caad492000-06-23 14:18:11 +0000406static int
407tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
408{
409 int i, err;
410 PyObject *x;
411
412 for (i = o->ob_size; --i >= 0; ) {
413 x = o->ob_item[i];
414 if (x != NULL) {
415 err = visit(x, arg);
416 if (err)
417 return err;
418 }
419 }
420 return 0;
421}
422
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000424 (inquiry)tuplelength, /*sq_length*/
425 (binaryfunc)tupleconcat, /*sq_concat*/
426 (intargfunc)tuplerepeat, /*sq_repeat*/
427 (intargfunc)tupleitem, /*sq_item*/
428 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429 0, /*sq_ass_item*/
430 0, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000431 (objobjproc)tuplecontains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432};
433
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434PyTypeObject PyTuple_Type = {
435 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 0,
437 "tuple",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000438 sizeof(PyTupleObject) - sizeof(PyObject *) + PyGC_HEAD_SIZE,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000440 (destructor)tupledealloc, /*tp_dealloc*/
441 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442 0, /*tp_getattr*/
443 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000444 (cmpfunc)tuplecompare, /*tp_compare*/
445 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 0, /*tp_as_number*/
447 &tuple_as_sequence, /*tp_as_sequence*/
448 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000449 (hashfunc)tuplehash, /*tp_hash*/
Fred Drake56780252000-06-15 14:50:20 +0000450 0, /*tp_call*/
451 0, /*tp_str*/
452 0, /*tp_getattro*/
453 0, /*tp_setattro*/
454 0, /*tp_as_buffer*/
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000455 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000456 0, /*tp_doc*/
457 (traverseproc)tupletraverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000459
460/* The following function breaks the notion that tuples are immutable:
461 it changes the size of a tuple. We get away with this only if there
462 is only one module referencing the object. You can also think of it
463 as creating a new tuple object and destroying the old one, only
464 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000465 already be known to some other part of the code...
466 If last_is_sticky is set, the tuple will grow or shrink at the
467 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000468
469int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470_PyTuple_Resize(pv, newsize, last_is_sticky)
471 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000472 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000473 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000474{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 register PyTupleObject *v;
476 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000477 int i;
478 int sizediff;
479
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 v = (PyTupleObject *) *pv;
481 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000482 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000483 Py_DECREF(v);
484 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000485 return -1;
486 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000487 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000488 if (sizediff == 0)
489 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000490 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000491#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000492 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000493#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000494 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000495 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 /* shrinking:
497 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000498 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000500 v->ob_item[i] = v->ob_item[i - sizediff];
501 v->ob_item[i - sizediff] = NULL;
502 }
503 }
504 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000506 v->ob_item[i] = NULL;
507 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000508#if MAXSAVESIZE > 0
509 if (newsize == 0 && free_tuples[0]) {
510 num_free_tuples[0]--;
511 sv = free_tuples[0];
512 sv->ob_size = 0;
513 Py_INCREF(sv);
514#ifdef COUNT_ALLOCS
515 tuple_zero_allocs++;
516#endif
517 tupledealloc(v);
518 *pv = (PyObject*) sv;
519 return 0;
520 }
521 if (0 < newsize && newsize < MAXSAVESIZE &&
522 (sv = free_tuples[newsize]) != NULL)
523 {
524 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
525 num_free_tuples[newsize]--;
526#ifdef COUNT_ALLOCS
527 fast_tuple_allocs++;
528#endif
529#ifdef Py_TRACE_REFS
530 sv->ob_type = &PyTuple_Type;
531#endif
532 for (i = 0; i < newsize; ++i){
533 sv->ob_item[i] = v->ob_item[i];
534 v->ob_item[i] = NULL;
535 }
536 sv->ob_size = v->ob_size;
537 tupledealloc(v);
538 *pv = (PyObject *) sv;
539 } else
540#endif
541 {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000542#ifdef WITH_CYCLE_GC
543 PyGC_Head *g = PyObject_AS_GC((PyObject *)v);
544 PyObject_GC_Fini((PyObject *)v);
545 sv = (PyTupleObject *)
546 PyObject_REALLOC((char *)g, sizeof(PyTupleObject)
547 + PyGC_HEAD_SIZE
548 + newsize * sizeof(PyObject *));
549 if (g == NULL) {
550 sv = NULL;
551 } else {
552 sv = (PyTupleObject *)PyObject_FROM_GC(g);
553 }
554#else
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000555 sv = (PyTupleObject *)
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000556 PyObject_REALLOC((char *)v, sizeof(PyTupleObject)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000557 + PyGC_HEAD_SIZE
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000558 + newsize * sizeof(PyObject *));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000559#endif
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000560 *pv = (PyObject *) sv;
561 if (sv == NULL) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000562 PyObject_GC_Init((PyObject *)v);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000563 v = (PyTupleObject *) PyObject_AS_GC(v);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000564 PyObject_DEL(v);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000565 PyErr_NoMemory();
566 return -1;
567 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000568 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000569 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000570 for (i = sv->ob_size; i < newsize; i++)
571 sv->ob_item[i] = NULL;
572 if (last_is_sticky && sizediff > 0) {
573 /* growing: move entries to the end and zero moved entries */
574 for (i = newsize - 1; i >= sizediff; i--) {
575 sv->ob_item[i] = sv->ob_item[i - sizediff];
576 sv->ob_item[i - sizediff] = NULL;
577 }
578 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000579 PyObject_GC_Init(sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000580 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000581 return 0;
582}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000583
584void
585PyTuple_Fini()
586{
587#if MAXSAVESIZE > 0
588 int i;
589
590 Py_XDECREF(free_tuples[0]);
591 free_tuples[0] = NULL;
592
593 for (i = 1; i < MAXSAVESIZE; i++) {
594 PyTupleObject *p, *q;
595 p = free_tuples[i];
596 free_tuples[i] = NULL;
597 while (p) {
598 q = p;
599 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000600 q = (PyTupleObject *) PyObject_AS_GC(q);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000601 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000602 }
603 }
604#endif
605}