blob: be62d0f51cfc31289525b5e2a187c15d0447d2c2 [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 ||
Jeremy Hyltond08b4c42000-06-23 19:37:02 +000065 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000066 + PyGC_HEAD_SIZE)
Guido van Rossum5bc51f21999-07-12 23:06:58 +000067 <= 0)
68 {
69 return PyErr_NoMemory();
70 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000071 /* PyObject_NewVar is inlined */
72 op = (PyTupleObject *) PyObject_MALLOC(nbytes);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000073 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000074 return PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000075 op = (PyTupleObject *) PyObject_FROM_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +000076 PyObject_INIT_VAR(op, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000077 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078 for (i = 0; i < size; i++)
79 op->ob_item[i] = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000080#if MAXSAVESIZE > 0
81 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000082 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +000083 ++num_free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000085 }
86#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000087 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089}
90
91int
Fred Drakeba096332000-07-09 07:04:36 +000092PyTuple_Size(register PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 if (!PyTuple_Check(op)) {
95 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096 return -1;
97 }
98 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100}
101
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000103PyTuple_GetItem(register PyObject *op, register int i)
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 NULL;
108 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
110 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111 return NULL;
112 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114}
115
116int
Fred Drakeba096332000-07-09 07:04:36 +0000117PyTuple_SetItem(register PyObject *op, register int i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 register PyObject *olditem;
120 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000121 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 Py_XDECREF(newitem);
123 PyErr_BadInternalCall();
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 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
127 Py_XDECREF(newitem);
128 PyErr_SetString(PyExc_IndexError,
129 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000130 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000133 olditem = *p;
134 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136 return 0;
137}
138
139/* Methods */
140
141static void
Fred Drakeba096332000-07-09 07:04:36 +0000142tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143{
144 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000145 register int len = op->ob_size;
Guido van Rossumd724b232000-03-13 16:01:29 +0000146 Py_TRASHCAN_SAFE_BEGIN(op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000147 PyObject_GC_Fini(op);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000148 if (len > 0) {
149 i = len;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000150 while (--i >= 0)
151 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000152#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000153 if (len < MAXSAVESIZE && num_free_tuples[len] < MAXSAVEDTUPLES) {
154 op->ob_item[0] = (PyObject *) free_tuples[len];
155 num_free_tuples[len]++;
156 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000157 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000158 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000159#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000160 }
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000161 op = (PyTupleObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000162 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000163done:
164 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165}
166
Guido van Rossum49e85141991-06-07 22:59:30 +0000167static int
Fred Drakeba096332000-07-09 07:04:36 +0000168tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169{
170 int i;
171 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000172 for (i = 0; i < op->ob_size; i++) {
173 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000176 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177 }
178 if (op->ob_size == 1)
179 fprintf(fp, ",");
180 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000181 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182}
183
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000185tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 s = PyString_FromString("(");
190 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191 for (i = 0; i < v->ob_size && s != NULL; i++) {
192 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 PyString_Concat(&s, comma);
194 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000197 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 PyString_ConcatAndDel(&s, PyString_FromString(","));
199 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200 return s;
201}
202
203static int
Fred Drakeba096332000-07-09 07:04:36 +0000204tuplecompare(register PyTupleObject *v, register PyTupleObject *w)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205{
206 register int len =
207 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
208 register int i;
209 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 if (cmp != 0)
212 return cmp;
213 }
214 return v->ob_size - w->ob_size;
215}
216
Guido van Rossum9bfef441993-03-29 10:43:31 +0000217static long
Fred Drakeba096332000-07-09 07:04:36 +0000218tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000219{
220 register long x, y;
221 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000222 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000223 x = 0x345678L;
224 p = v->ob_item;
225 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000227 if (y == -1)
228 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000229 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000230 }
231 x ^= v->ob_size;
232 if (x == -1)
233 x = -2;
234 return x;
235}
236
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237static int
Fred Drakeba096332000-07-09 07:04:36 +0000238tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239{
240 return a->ob_size;
241}
242
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000243static int
Fred Drakeba096332000-07-09 07:04:36 +0000244tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000245{
246 int i, cmp;
247
248 for (i = 0; i < a->ob_size; ++i) {
249 cmp = PyObject_Compare(el, PyTuple_GET_ITEM(a, i));
250 if (cmp == 0)
251 return 1;
252 if (PyErr_Occurred())
253 return -1;
254 }
255 return 0;
256}
257
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000258static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000259tupleitem(register PyTupleObject *a, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260{
261 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263 return NULL;
264 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000265 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266 return a->ob_item[i];
267}
268
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000270tupleslice(register PyTupleObject *a, register int ilow, register int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273 register int i;
274 if (ilow < 0)
275 ilow = 0;
276 if (ihigh > a->ob_size)
277 ihigh = a->ob_size;
278 if (ihigh < ilow)
279 ihigh = ilow;
280 if (ilow == 0 && ihigh == a->ob_size) {
281 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 Py_INCREF(a);
283 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 if (np == NULL)
287 return NULL;
288 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 PyObject *v = a->ob_item[i];
290 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 np->ob_item[i - ilow] = v;
292 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000293 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294}
295
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000297PyTuple_GetSlice(PyObject *op, int i, int j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000298{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 if (op == NULL || !PyTuple_Check(op)) {
300 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000301 return NULL;
302 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000304}
305
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000306static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000307tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308{
309 register int size;
310 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 PyTupleObject *np;
312 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000313 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000314 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000315 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316 return NULL;
317 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000322 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323 }
324 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325 PyObject *v = a->ob_item[i];
326 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327 np->ob_item[i] = v;
328 }
329 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 PyObject *v = b->ob_item[i];
331 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 np->ob_item[i + a->ob_size] = v;
333 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335#undef b
336}
337
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000339tuplerepeat(PyTupleObject *a, int n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000340{
341 int i, j;
342 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 PyTupleObject *np;
344 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000345 if (n < 0)
346 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000347 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000348 /* Since tuples are immutable, we can return a shared
349 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350 Py_INCREF(a);
351 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000352 }
353 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000354 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000355 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000357 if (np == NULL)
358 return NULL;
359 p = np->ob_item;
360 for (i = 0; i < n; i++) {
361 for (j = 0; j < a->ob_size; j++) {
362 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000364 p++;
365 }
366 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000368}
369
Jeremy Hylton8caad492000-06-23 14:18:11 +0000370static int
371tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
372{
373 int i, err;
374 PyObject *x;
375
376 for (i = o->ob_size; --i >= 0; ) {
377 x = o->ob_item[i];
378 if (x != NULL) {
379 err = visit(x, arg);
380 if (err)
381 return err;
382 }
383 }
384 return 0;
385}
386
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000388 (inquiry)tuplelength, /*sq_length*/
389 (binaryfunc)tupleconcat, /*sq_concat*/
390 (intargfunc)tuplerepeat, /*sq_repeat*/
391 (intargfunc)tupleitem, /*sq_item*/
392 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 0, /*sq_ass_item*/
394 0, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000395 (objobjproc)tuplecontains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396};
397
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398PyTypeObject PyTuple_Type = {
399 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000400 0,
401 "tuple",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000402 sizeof(PyTupleObject) - sizeof(PyObject *) + PyGC_HEAD_SIZE,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000404 (destructor)tupledealloc, /*tp_dealloc*/
405 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406 0, /*tp_getattr*/
407 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000408 (cmpfunc)tuplecompare, /*tp_compare*/
409 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410 0, /*tp_as_number*/
411 &tuple_as_sequence, /*tp_as_sequence*/
412 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000413 (hashfunc)tuplehash, /*tp_hash*/
Fred Drake56780252000-06-15 14:50:20 +0000414 0, /*tp_call*/
415 0, /*tp_str*/
416 0, /*tp_getattro*/
417 0, /*tp_setattro*/
418 0, /*tp_as_buffer*/
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000419 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000420 0, /*tp_doc*/
421 (traverseproc)tupletraverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000423
424/* The following function breaks the notion that tuples are immutable:
425 it changes the size of a tuple. We get away with this only if there
426 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000427 as creating a new tuple object and destroying the old one, only more
428 efficiently. In any case, don't use this if the tuple may already be
429 known to some other part of the code. The last_is_sticky is not used
430 and must always be false. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000431
432int
Fred Drakeba096332000-07-09 07:04:36 +0000433_PyTuple_Resize(PyObject **pv, int newsize, int last_is_sticky)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000434{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435 register PyTupleObject *v;
436 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000437 int i;
438 int sizediff;
439
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 v = (PyTupleObject *) *pv;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000441 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1 ||
442 last_is_sticky) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000443 *pv = 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000444 Py_XDECREF(v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000446 return -1;
447 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000448 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000449 if (sizediff == 0)
450 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000451
Guido van Rossum12d12c51993-10-26 17:58:25 +0000452 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000453#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000454 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000455#endif
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000456 _Py_ForgetReference((PyObject *) v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000457 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000459 v->ob_item[i] = NULL;
460 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000461 PyObject_GC_Fini(v);
462 v = (PyTupleObject *) PyObject_AS_GC(v);
463 sv = (PyTupleObject *) PyObject_REALLOC((char *)v,
464 sizeof(PyTupleObject)
465 + PyGC_HEAD_SIZE
466 + newsize * sizeof(PyObject *));
467 if (sv == NULL) {
468 *pv = NULL;
469 PyObject_DEL(v);
470 PyErr_NoMemory();
471 return -1;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000472 }
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000473 sv = (PyTupleObject *) PyObject_FROM_GC(sv);
474 _Py_NewReference((PyObject *) sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000475 for (i = sv->ob_size; i < newsize; i++)
476 sv->ob_item[i] = NULL;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000477 sv->ob_size = newsize;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000478 *pv = (PyObject *) sv;
479 PyObject_GC_Init(sv);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000480 return 0;
481}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000482
483void
Fred Drakeba096332000-07-09 07:04:36 +0000484PyTuple_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000485{
486#if MAXSAVESIZE > 0
487 int i;
488
489 Py_XDECREF(free_tuples[0]);
490 free_tuples[0] = NULL;
491
492 for (i = 1; i < MAXSAVESIZE; i++) {
493 PyTupleObject *p, *q;
494 p = free_tuples[i];
495 free_tuples[i] = NULL;
496 while (p) {
497 q = p;
498 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000499 q = (PyTupleObject *) PyObject_AS_GC(q);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000500 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000501 }
502 }
503#endif
504}