blob: 46e67a8e032a5f965ca06a9ea3ba509627db0416 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Tuple object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum5ce78f82000-04-21 21:15:05 +000036/* Speed optimization to avoid frequent malloc/free of small tuples */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000037#ifndef MAXSAVESIZE
Guido van Rossum5ce78f82000-04-21 21:15:05 +000038#define MAXSAVESIZE 20 /* Largest tuple to save on free list */
39#endif
40#ifndef MAXSAVEDTUPLES
41#define MAXSAVEDTUPLES 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000042#endif
43
44#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +000045/* Entries 1 up to MAXSAVESIZE are free lists, entry 0 is the empty
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000046 tuple () of which at most one instance will be allocated.
47*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048static PyTupleObject *free_tuples[MAXSAVESIZE];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000049static int num_free_tuples[MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000050#endif
51#ifdef COUNT_ALLOCS
52int fast_tuple_allocs;
53int tuple_zero_allocs;
54#endif
55
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056PyObject *
57PyTuple_New(size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 register int size;
59{
60 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 return NULL;
65 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000066#if MAXSAVESIZE > 0
Sjoerd Mullender615194a1993-11-01 13:46:50 +000067 if (size == 0 && free_tuples[0]) {
68 op = free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000069 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000070#ifdef COUNT_ALLOCS
71 tuple_zero_allocs++;
72#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000074 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 if (0 < size && size < MAXSAVESIZE &&
76 (op = free_tuples[size]) != NULL)
77 {
78 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000079 num_free_tuples[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000080#ifdef COUNT_ALLOCS
81 fast_tuple_allocs++;
82#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000083 /* PyObject_InitVar is inlined */
Guido van Rossum68055ce1998-12-11 14:56:38 +000084#ifdef Py_TRACE_REFS
Guido van Rossum68055ce1998-12-11 14:56:38 +000085 op->ob_size = size;
Guido van Rossumb18618d2000-05-03 23:44:39 +000086 op->ob_type = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000087#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000088 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000089 }
90 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000091#endif
92 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000093 int nbytes = size * sizeof(PyObject *);
94 /* Check for overflow */
95 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Jeremy Hyltond08b4c42000-06-23 19:37:02 +000096 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000097 + PyGC_HEAD_SIZE)
Guido van Rossum5bc51f21999-07-12 23:06:58 +000098 <= 0)
99 {
100 return PyErr_NoMemory();
101 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000102 /* PyObject_NewVar is inlined */
103 op = (PyTupleObject *) PyObject_MALLOC(nbytes);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000104 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 return PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000106 op = (PyTupleObject *) PyObject_FROM_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000107 PyObject_INIT_VAR(op, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000108 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109 for (i = 0; i < size; i++)
110 op->ob_item[i] = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000111#if MAXSAVESIZE > 0
112 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000113 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000114 ++num_free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000116 }
117#endif
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000118 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120}
121
122int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000123PyTuple_Size(op)
124 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 if (!PyTuple_Check(op)) {
127 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 return -1;
129 }
130 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132}
133
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134PyObject *
135PyTuple_GetItem(op, i)
136 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000137 register int i;
138{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000139 if (!PyTuple_Check(op)) {
140 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141 return NULL;
142 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000143 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
144 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145 return NULL;
146 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148}
149
150int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151PyTuple_SetItem(op, i, newitem)
152 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 register PyObject *olditem;
157 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000158 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 Py_XDECREF(newitem);
160 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000161 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
164 Py_XDECREF(newitem);
165 PyErr_SetString(PyExc_IndexError,
166 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000167 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000169 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000170 olditem = *p;
171 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000172 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173 return 0;
174}
175
176/* Methods */
177
178static void
179tupledealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181{
182 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000183 register int len = op->ob_size;
Guido van Rossumd724b232000-03-13 16:01:29 +0000184 Py_TRASHCAN_SAFE_BEGIN(op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000185 PyObject_GC_Fini(op);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000186 if (len > 0) {
187 i = len;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000188 while (--i >= 0)
189 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000190#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000191 if (len < MAXSAVESIZE && num_free_tuples[len] < MAXSAVEDTUPLES) {
192 op->ob_item[0] = (PyObject *) free_tuples[len];
193 num_free_tuples[len]++;
194 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000195 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000196 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000197#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000198 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000199 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000200done:
201 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202}
203
Guido van Rossum49e85141991-06-07 22:59:30 +0000204static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000207 FILE *fp;
208 int flags;
209{
210 int i;
211 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000212 for (i = 0; i < op->ob_size; i++) {
213 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000216 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000217 }
218 if (op->ob_size == 1)
219 fprintf(fp, ",");
220 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000221 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222}
223
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000230 s = PyString_FromString("(");
231 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 for (i = 0; i < v->ob_size && s != NULL; i++) {
233 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 PyString_Concat(&s, comma);
235 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000238 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239 PyString_ConcatAndDel(&s, PyString_FromString(","));
240 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241 return s;
242}
243
244static int
245tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000246 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247{
248 register int len =
249 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
250 register int i;
251 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000252 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253 if (cmp != 0)
254 return cmp;
255 }
256 return v->ob_size - w->ob_size;
257}
258
Guido van Rossum9bfef441993-03-29 10:43:31 +0000259static long
260tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000262{
263 register long x, y;
264 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000265 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000266 x = 0x345678L;
267 p = v->ob_item;
268 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000270 if (y == -1)
271 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000272 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000273 }
274 x ^= v->ob_size;
275 if (x == -1)
276 x = -2;
277 return x;
278}
279
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280static int
281tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283{
284 return a->ob_size;
285}
286
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000287static int
288tuplecontains(a, el)
289 PyTupleObject *a;
290 PyObject *el;
291{
292 int i, cmp;
293
294 for (i = 0; i < a->ob_size; ++i) {
295 cmp = PyObject_Compare(el, PyTuple_GET_ITEM(a, i));
296 if (cmp == 0)
297 return 1;
298 if (PyErr_Occurred())
299 return -1;
300 }
301 return 0;
302}
303
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000306 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307 register int i;
308{
309 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 return NULL;
312 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000313 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314 return a->ob_item[i];
315}
316
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320 register int ilow, ihigh;
321{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323 register int i;
324 if (ilow < 0)
325 ilow = 0;
326 if (ihigh > a->ob_size)
327 ihigh = a->ob_size;
328 if (ihigh < ilow)
329 ihigh = ilow;
330 if (ilow == 0 && ihigh == a->ob_size) {
331 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 Py_INCREF(a);
333 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 if (np == NULL)
337 return NULL;
338 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 PyObject *v = a->ob_item[i];
340 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 np->ob_item[i - ilow] = v;
342 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344}
345
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346PyObject *
347PyTuple_GetSlice(op, i, j)
348 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000349 int i, j;
350{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 if (op == NULL || !PyTuple_Check(op)) {
352 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000353 return NULL;
354 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000356}
357
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 register PyTupleObject *a;
361 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362{
363 register int size;
364 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 PyTupleObject *np;
366 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000367 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000368 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000369 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370 return NULL;
371 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000376 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377 }
378 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 PyObject *v = a->ob_item[i];
380 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000381 np->ob_item[i] = v;
382 }
383 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 PyObject *v = b->ob_item[i];
385 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386 np->ob_item[i + a->ob_size] = v;
387 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000388 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389#undef b
390}
391
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000393tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000394 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000395 int n;
396{
397 int i, j;
398 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399 PyTupleObject *np;
400 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000401 if (n < 0)
402 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000403 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000404 /* Since tuples are immutable, we can return a shared
405 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 Py_INCREF(a);
407 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000408 }
409 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000410 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000411 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000413 if (np == NULL)
414 return NULL;
415 p = np->ob_item;
416 for (i = 0; i < n; i++) {
417 for (j = 0; j < a->ob_size; j++) {
418 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000420 p++;
421 }
422 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000424}
425
Jeremy Hylton8caad492000-06-23 14:18:11 +0000426static int
427tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
428{
429 int i, err;
430 PyObject *x;
431
432 for (i = o->ob_size; --i >= 0; ) {
433 x = o->ob_item[i];
434 if (x != NULL) {
435 err = visit(x, arg);
436 if (err)
437 return err;
438 }
439 }
440 return 0;
441}
442
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000444 (inquiry)tuplelength, /*sq_length*/
445 (binaryfunc)tupleconcat, /*sq_concat*/
446 (intargfunc)tuplerepeat, /*sq_repeat*/
447 (intargfunc)tupleitem, /*sq_item*/
448 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449 0, /*sq_ass_item*/
450 0, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000451 (objobjproc)tuplecontains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452};
453
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454PyTypeObject PyTuple_Type = {
455 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456 0,
457 "tuple",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000458 sizeof(PyTupleObject) - sizeof(PyObject *) + PyGC_HEAD_SIZE,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000459 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000460 (destructor)tupledealloc, /*tp_dealloc*/
461 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000462 0, /*tp_getattr*/
463 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000464 (cmpfunc)tuplecompare, /*tp_compare*/
465 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000466 0, /*tp_as_number*/
467 &tuple_as_sequence, /*tp_as_sequence*/
468 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000469 (hashfunc)tuplehash, /*tp_hash*/
Fred Drake56780252000-06-15 14:50:20 +0000470 0, /*tp_call*/
471 0, /*tp_str*/
472 0, /*tp_getattro*/
473 0, /*tp_setattro*/
474 0, /*tp_as_buffer*/
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000475 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000476 0, /*tp_doc*/
477 (traverseproc)tupletraverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000479
480/* The following function breaks the notion that tuples are immutable:
481 it changes the size of a tuple. We get away with this only if there
482 is only one module referencing the object. You can also think of it
483 as creating a new tuple object and destroying the old one, only
484 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000485 already be known to some other part of the code...
486 If last_is_sticky is set, the tuple will grow or shrink at the
487 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000488
489int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000490_PyTuple_Resize(pv, newsize, last_is_sticky)
491 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000492 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000493 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000494{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 register PyTupleObject *v;
496 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000497 int i;
498 int sizediff;
499
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500 v = (PyTupleObject *) *pv;
501 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000502 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000503 Py_DECREF(v);
504 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000505 return -1;
506 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000507 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000508 if (sizediff == 0)
509 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000510 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000511#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000512 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000513#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000514 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000515 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 /* shrinking:
517 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000518 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000520 v->ob_item[i] = v->ob_item[i - sizediff];
521 v->ob_item[i - sizediff] = NULL;
522 }
523 }
524 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000526 v->ob_item[i] = NULL;
527 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000528#if MAXSAVESIZE > 0
529 if (newsize == 0 && free_tuples[0]) {
530 num_free_tuples[0]--;
531 sv = free_tuples[0];
532 sv->ob_size = 0;
533 Py_INCREF(sv);
534#ifdef COUNT_ALLOCS
535 tuple_zero_allocs++;
536#endif
537 tupledealloc(v);
538 *pv = (PyObject*) sv;
539 return 0;
540 }
541 if (0 < newsize && newsize < MAXSAVESIZE &&
542 (sv = free_tuples[newsize]) != NULL)
543 {
544 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
545 num_free_tuples[newsize]--;
546#ifdef COUNT_ALLOCS
547 fast_tuple_allocs++;
548#endif
549#ifdef Py_TRACE_REFS
550 sv->ob_type = &PyTuple_Type;
551#endif
552 for (i = 0; i < newsize; ++i){
553 sv->ob_item[i] = v->ob_item[i];
554 v->ob_item[i] = NULL;
555 }
556 sv->ob_size = v->ob_size;
557 tupledealloc(v);
558 *pv = (PyObject *) sv;
559 } else
560#endif
561 {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000562#ifdef WITH_CYCLE_GC
563 PyGC_Head *g = PyObject_AS_GC((PyObject *)v);
564 PyObject_GC_Fini((PyObject *)v);
565 sv = (PyTupleObject *)
566 PyObject_REALLOC((char *)g, sizeof(PyTupleObject)
567 + PyGC_HEAD_SIZE
568 + newsize * sizeof(PyObject *));
569 if (g == NULL) {
570 sv = NULL;
571 } else {
572 sv = (PyTupleObject *)PyObject_FROM_GC(g);
573 }
574#else
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000575 sv = (PyTupleObject *)
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000576 PyObject_REALLOC((char *)v, sizeof(PyTupleObject)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000577 + PyGC_HEAD_SIZE
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000578 + newsize * sizeof(PyObject *));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000579#endif
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000580 *pv = (PyObject *) sv;
581 if (sv == NULL) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000582 PyObject_GC_Init((PyObject *)v);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000583 PyObject_DEL(v);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000584 PyErr_NoMemory();
585 return -1;
586 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000587 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000588 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000589 for (i = sv->ob_size; i < newsize; i++)
590 sv->ob_item[i] = NULL;
591 if (last_is_sticky && sizediff > 0) {
592 /* growing: move entries to the end and zero moved entries */
593 for (i = newsize - 1; i >= sizediff; i--) {
594 sv->ob_item[i] = sv->ob_item[i - sizediff];
595 sv->ob_item[i - sizediff] = NULL;
596 }
597 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000598 PyObject_GC_Init(sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000599 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000600 return 0;
601}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000602
603void
604PyTuple_Fini()
605{
606#if MAXSAVESIZE > 0
607 int i;
608
609 Py_XDECREF(free_tuples[0]);
610 free_tuples[0] = NULL;
611
612 for (i = 1; i < MAXSAVESIZE; i++) {
613 PyTupleObject *p, *q;
614 p = free_tuples[i];
615 free_tuples[i] = NULL;
616 while (p) {
617 q = p;
618 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000619 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000620 }
621 }
622#endif
623}