blob: bbb56b1adc4829433c0dbe946f96bebf0a372d20 [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 ||
96 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
97 <= 0)
98 {
99 return PyErr_NoMemory();
100 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000101 /* PyObject_NewVar is inlined */
102 op = (PyTupleObject *) PyObject_MALLOC(nbytes);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000103 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 return PyErr_NoMemory();
Guido van Rossum1bb26871998-06-26 15:53:50 +0000105
Guido van Rossumb18618d2000-05-03 23:44:39 +0000106 PyObject_INIT_VAR(op, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000107 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108 for (i = 0; i < size; i++)
109 op->ob_item[i] = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000110#if MAXSAVESIZE > 0
111 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000112 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000113 ++num_free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000115 }
116#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118}
119
120int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121PyTuple_Size(op)
122 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 if (!PyTuple_Check(op)) {
125 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 return -1;
127 }
128 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130}
131
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132PyObject *
133PyTuple_GetItem(op, i)
134 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000135 register int i;
136{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137 if (!PyTuple_Check(op)) {
138 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139 return NULL;
140 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
142 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143 return NULL;
144 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146}
147
148int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149PyTuple_SetItem(op, i, newitem)
150 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 register PyObject *olditem;
155 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000156 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 Py_XDECREF(newitem);
158 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000159 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
162 Py_XDECREF(newitem);
163 PyErr_SetString(PyExc_IndexError,
164 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000165 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000168 olditem = *p;
169 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171 return 0;
172}
173
174/* Methods */
175
176static void
177tupledealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179{
180 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000181 register int len = op->ob_size;
Guido van Rossumd724b232000-03-13 16:01:29 +0000182 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000183 if (len > 0) {
184 i = len;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000185 while (--i >= 0)
186 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000187#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000188 if (len < MAXSAVESIZE && num_free_tuples[len] < MAXSAVEDTUPLES) {
189 op->ob_item[0] = (PyObject *) free_tuples[len];
190 num_free_tuples[len]++;
191 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000192 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000193 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000194#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000195 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000196 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000197done:
198 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199}
200
Guido van Rossum49e85141991-06-07 22:59:30 +0000201static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 FILE *fp;
205 int flags;
206{
207 int i;
208 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000209 for (i = 0; i < op->ob_size; i++) {
210 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000213 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214 }
215 if (op->ob_size == 1)
216 fprintf(fp, ",");
217 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000218 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000219}
220
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227 s = PyString_FromString("(");
228 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 for (i = 0; i < v->ob_size && s != NULL; i++) {
230 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 PyString_Concat(&s, comma);
232 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000234 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000235 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 PyString_ConcatAndDel(&s, PyString_FromString(","));
237 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238 return s;
239}
240
241static int
242tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244{
245 register int len =
246 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
247 register int i;
248 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 if (cmp != 0)
251 return cmp;
252 }
253 return v->ob_size - w->ob_size;
254}
255
Guido van Rossum9bfef441993-03-29 10:43:31 +0000256static long
257tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000258 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000259{
260 register long x, y;
261 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000263 x = 0x345678L;
264 p = v->ob_item;
265 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000267 if (y == -1)
268 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000269 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000270 }
271 x ^= v->ob_size;
272 if (x == -1)
273 x = -2;
274 return x;
275}
276
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277static int
278tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280{
281 return a->ob_size;
282}
283
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000284static int
285tuplecontains(a, el)
286 PyTupleObject *a;
287 PyObject *el;
288{
289 int i, cmp;
290
291 for (i = 0; i < a->ob_size; ++i) {
292 cmp = PyObject_Compare(el, PyTuple_GET_ITEM(a, i));
293 if (cmp == 0)
294 return 1;
295 if (PyErr_Occurred())
296 return -1;
297 }
298 return 0;
299}
300
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000302tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 register int i;
305{
306 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 return NULL;
309 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 return a->ob_item[i];
312}
313
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317 register int ilow, ihigh;
318{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320 register int i;
321 if (ilow < 0)
322 ilow = 0;
323 if (ihigh > a->ob_size)
324 ihigh = a->ob_size;
325 if (ihigh < ilow)
326 ihigh = ilow;
327 if (ilow == 0 && ihigh == a->ob_size) {
328 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 Py_INCREF(a);
330 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333 if (np == NULL)
334 return NULL;
335 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 PyObject *v = a->ob_item[i];
337 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338 np->ob_item[i - ilow] = v;
339 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341}
342
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343PyObject *
344PyTuple_GetSlice(op, i, j)
345 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000346 int i, j;
347{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 if (op == NULL || !PyTuple_Check(op)) {
349 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000350 return NULL;
351 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000353}
354
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 register PyTupleObject *a;
358 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359{
360 register int size;
361 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362 PyTupleObject *np;
363 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000364 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000365 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000366 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367 return NULL;
368 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000372 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000373 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374 }
375 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 PyObject *v = a->ob_item[i];
377 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378 np->ob_item[i] = v;
379 }
380 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000381 PyObject *v = b->ob_item[i];
382 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383 np->ob_item[i + a->ob_size] = v;
384 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000385 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386#undef b
387}
388
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000390tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000392 int n;
393{
394 int i, j;
395 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 PyTupleObject *np;
397 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000398 if (n < 0)
399 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000400 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000401 /* Since tuples are immutable, we can return a shared
402 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 Py_INCREF(a);
404 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000405 }
406 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000407 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000408 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000410 if (np == NULL)
411 return NULL;
412 p = np->ob_item;
413 for (i = 0; i < n; i++) {
414 for (j = 0; j < a->ob_size; j++) {
415 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000417 p++;
418 }
419 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000421}
422
Jeremy Hylton8caad492000-06-23 14:18:11 +0000423static int
424tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
425{
426 int i, err;
427 PyObject *x;
428
429 for (i = o->ob_size; --i >= 0; ) {
430 x = o->ob_item[i];
431 if (x != NULL) {
432 err = visit(x, arg);
433 if (err)
434 return err;
435 }
436 }
437 return 0;
438}
439
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000441 (inquiry)tuplelength, /*sq_length*/
442 (binaryfunc)tupleconcat, /*sq_concat*/
443 (intargfunc)tuplerepeat, /*sq_repeat*/
444 (intargfunc)tupleitem, /*sq_item*/
445 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 0, /*sq_ass_item*/
447 0, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000448 (objobjproc)tuplecontains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449};
450
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451PyTypeObject PyTuple_Type = {
452 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453 0,
454 "tuple",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 sizeof(PyTupleObject) - sizeof(PyObject *),
456 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000457 (destructor)tupledealloc, /*tp_dealloc*/
458 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 0, /*tp_getattr*/
460 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000461 (cmpfunc)tuplecompare, /*tp_compare*/
462 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463 0, /*tp_as_number*/
464 &tuple_as_sequence, /*tp_as_sequence*/
465 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000466 (hashfunc)tuplehash, /*tp_hash*/
Fred Drake56780252000-06-15 14:50:20 +0000467 0, /*tp_call*/
468 0, /*tp_str*/
469 0, /*tp_getattro*/
470 0, /*tp_setattro*/
471 0, /*tp_as_buffer*/
472 Py_TPFLAGS_DEFAULT, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000473 0, /*tp_doc*/
474 (traverseproc)tupletraverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000475};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000476
477/* The following function breaks the notion that tuples are immutable:
478 it changes the size of a tuple. We get away with this only if there
479 is only one module referencing the object. You can also think of it
480 as creating a new tuple object and destroying the old one, only
481 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000482 already be known to some other part of the code...
483 If last_is_sticky is set, the tuple will grow or shrink at the
484 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000485
486int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000487_PyTuple_Resize(pv, newsize, last_is_sticky)
488 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000489 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000490 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000491{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000492 register PyTupleObject *v;
493 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000494 int i;
495 int sizediff;
496
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497 v = (PyTupleObject *) *pv;
498 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000499 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500 Py_DECREF(v);
501 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000502 return -1;
503 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000504 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000505 if (sizediff == 0)
506 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000507 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000508#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000509 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000510#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000511 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000512 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 /* shrinking:
514 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000515 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000517 v->ob_item[i] = v->ob_item[i - sizediff];
518 v->ob_item[i - sizediff] = NULL;
519 }
520 }
521 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000523 v->ob_item[i] = NULL;
524 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000525#if MAXSAVESIZE > 0
526 if (newsize == 0 && free_tuples[0]) {
527 num_free_tuples[0]--;
528 sv = free_tuples[0];
529 sv->ob_size = 0;
530 Py_INCREF(sv);
531#ifdef COUNT_ALLOCS
532 tuple_zero_allocs++;
533#endif
534 tupledealloc(v);
535 *pv = (PyObject*) sv;
536 return 0;
537 }
538 if (0 < newsize && newsize < MAXSAVESIZE &&
539 (sv = free_tuples[newsize]) != NULL)
540 {
541 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
542 num_free_tuples[newsize]--;
543#ifdef COUNT_ALLOCS
544 fast_tuple_allocs++;
545#endif
546#ifdef Py_TRACE_REFS
547 sv->ob_type = &PyTuple_Type;
548#endif
549 for (i = 0; i < newsize; ++i){
550 sv->ob_item[i] = v->ob_item[i];
551 v->ob_item[i] = NULL;
552 }
553 sv->ob_size = v->ob_size;
554 tupledealloc(v);
555 *pv = (PyObject *) sv;
556 } else
557#endif
558 {
559 sv = (PyTupleObject *)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000560 PyObject_REALLOC((char *)v,
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000561 sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
562 *pv = (PyObject *) sv;
563 if (sv == NULL) {
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 }
579 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000580 return 0;
581}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000582
583void
584PyTuple_Fini()
585{
586#if MAXSAVESIZE > 0
587 int i;
588
589 Py_XDECREF(free_tuples[0]);
590 free_tuples[0] = NULL;
591
592 for (i = 1; i < MAXSAVESIZE; i++) {
593 PyTupleObject *p, *q;
594 p = free_tuples[i];
595 free_tuples[i] = NULL;
596 while (p) {
597 q = p;
598 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000599 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000600 }
601 }
602#endif
603}