blob: 9b15a0521526409b15c934526b7845a72f1937bc [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
427 as creating a new tuple object and destroying the old one, only
428 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000429 already be known to some other part of the code...
430 If last_is_sticky is set, the tuple will grow or shrink at the
431 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000432
433int
Fred Drakeba096332000-07-09 07:04:36 +0000434_PyTuple_Resize(PyObject **pv, int newsize, int last_is_sticky)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000435{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 register PyTupleObject *v;
437 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000438 int i;
439 int sizediff;
440
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 v = (PyTupleObject *) *pv;
442 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000443 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 Py_DECREF(v);
445 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;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000451 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000452#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000453 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000454#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000455 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000456 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 /* shrinking:
458 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000459 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000461 v->ob_item[i] = v->ob_item[i - sizediff];
462 v->ob_item[i - sizediff] = NULL;
463 }
464 }
465 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000467 v->ob_item[i] = NULL;
468 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000469#if MAXSAVESIZE > 0
470 if (newsize == 0 && free_tuples[0]) {
471 num_free_tuples[0]--;
472 sv = free_tuples[0];
473 sv->ob_size = 0;
474 Py_INCREF(sv);
475#ifdef COUNT_ALLOCS
476 tuple_zero_allocs++;
477#endif
478 tupledealloc(v);
479 *pv = (PyObject*) sv;
480 return 0;
481 }
482 if (0 < newsize && newsize < MAXSAVESIZE &&
483 (sv = free_tuples[newsize]) != NULL)
484 {
485 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
486 num_free_tuples[newsize]--;
487#ifdef COUNT_ALLOCS
488 fast_tuple_allocs++;
489#endif
490#ifdef Py_TRACE_REFS
491 sv->ob_type = &PyTuple_Type;
492#endif
493 for (i = 0; i < newsize; ++i){
494 sv->ob_item[i] = v->ob_item[i];
495 v->ob_item[i] = NULL;
496 }
497 sv->ob_size = v->ob_size;
498 tupledealloc(v);
499 *pv = (PyObject *) sv;
500 } else
501#endif
502 {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000503#ifdef WITH_CYCLE_GC
504 PyGC_Head *g = PyObject_AS_GC((PyObject *)v);
505 PyObject_GC_Fini((PyObject *)v);
Martin v. Löwis3cd76042000-09-15 07:32:39 +0000506 g = (PyGC_Head *)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000507 PyObject_REALLOC((char *)g, sizeof(PyTupleObject)
508 + PyGC_HEAD_SIZE
509 + newsize * sizeof(PyObject *));
510 if (g == NULL) {
511 sv = NULL;
512 } else {
513 sv = (PyTupleObject *)PyObject_FROM_GC(g);
514 }
515#else
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000516 sv = (PyTupleObject *)
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000517 PyObject_REALLOC((char *)v, sizeof(PyTupleObject)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000518 + PyGC_HEAD_SIZE
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000519 + newsize * sizeof(PyObject *));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000520#endif
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000521 *pv = (PyObject *) sv;
522 if (sv == NULL) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000523 PyObject_GC_Init((PyObject *)v);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000524 v = (PyTupleObject *) PyObject_AS_GC(v);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000525 PyObject_DEL(v);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000526 PyErr_NoMemory();
527 return -1;
528 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000529 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000530 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000531 for (i = sv->ob_size; i < newsize; i++)
532 sv->ob_item[i] = NULL;
533 if (last_is_sticky && sizediff > 0) {
534 /* growing: move entries to the end and zero moved entries */
535 for (i = newsize - 1; i >= sizediff; i--) {
536 sv->ob_item[i] = sv->ob_item[i - sizediff];
537 sv->ob_item[i - sizediff] = NULL;
538 }
539 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000540 PyObject_GC_Init(sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000541 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000542 return 0;
543}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000544
545void
Fred Drakeba096332000-07-09 07:04:36 +0000546PyTuple_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000547{
548#if MAXSAVESIZE > 0
549 int i;
550
551 Py_XDECREF(free_tuples[0]);
552 free_tuples[0] = NULL;
553
554 for (i = 1; i < MAXSAVESIZE; i++) {
555 PyTupleObject *p, *q;
556 p = free_tuples[i];
557 free_tuples[i] = NULL;
558 while (p) {
559 q = p;
560 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000561 q = (PyTupleObject *) PyObject_AS_GC(q);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000562 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000563 }
564 }
565#endif
566}