blob: d5d6a079eff39e2fed2ecad2154245fc653bca9a [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)) {
364 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365 return NULL;
366 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000371 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000372 }
373 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 PyObject *v = a->ob_item[i];
375 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376 np->ob_item[i] = v;
377 }
378 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 PyObject *v = b->ob_item[i];
380 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000381 np->ob_item[i + a->ob_size] = v;
382 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384#undef b
385}
386
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000388tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000390 int n;
391{
392 int i, j;
393 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000394 PyTupleObject *np;
395 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000396 if (n < 0)
397 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000398 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000399 /* Since tuples are immutable, we can return a shared
400 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 Py_INCREF(a);
402 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000403 }
404 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000405 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000406 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000408 if (np == NULL)
409 return NULL;
410 p = np->ob_item;
411 for (i = 0; i < n; i++) {
412 for (j = 0; j < a->ob_size; j++) {
413 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000415 p++;
416 }
417 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000419}
420
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000422 (inquiry)tuplelength, /*sq_length*/
423 (binaryfunc)tupleconcat, /*sq_concat*/
424 (intargfunc)tuplerepeat, /*sq_repeat*/
425 (intargfunc)tupleitem, /*sq_item*/
426 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427 0, /*sq_ass_item*/
428 0, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000429 (objobjproc)tuplecontains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430};
431
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000432PyTypeObject PyTuple_Type = {
433 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 0,
435 "tuple",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 sizeof(PyTupleObject) - sizeof(PyObject *),
437 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000438 (destructor)tupledealloc, /*tp_dealloc*/
439 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440 0, /*tp_getattr*/
441 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000442 (cmpfunc)tuplecompare, /*tp_compare*/
443 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444 0, /*tp_as_number*/
445 &tuple_as_sequence, /*tp_as_sequence*/
446 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000447 (hashfunc)tuplehash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000448};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000449
450/* The following function breaks the notion that tuples are immutable:
451 it changes the size of a tuple. We get away with this only if there
452 is only one module referencing the object. You can also think of it
453 as creating a new tuple object and destroying the old one, only
454 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000455 already be known to some other part of the code...
456 If last_is_sticky is set, the tuple will grow or shrink at the
457 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000458
459int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460_PyTuple_Resize(pv, newsize, last_is_sticky)
461 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000462 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000463 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000464{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 register PyTupleObject *v;
466 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000467 int i;
468 int sizediff;
469
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000470 v = (PyTupleObject *) *pv;
471 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000472 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000473 Py_DECREF(v);
474 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000475 return -1;
476 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000477 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000478 if (sizediff == 0)
479 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000480 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000481#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000482 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000483#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000484 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000485 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 /* shrinking:
487 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000488 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000489 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000490 v->ob_item[i] = v->ob_item[i - sizediff];
491 v->ob_item[i - sizediff] = NULL;
492 }
493 }
494 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000495 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000496 v->ob_item[i] = NULL;
497 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000498#if MAXSAVESIZE > 0
499 if (newsize == 0 && free_tuples[0]) {
500 num_free_tuples[0]--;
501 sv = free_tuples[0];
502 sv->ob_size = 0;
503 Py_INCREF(sv);
504#ifdef COUNT_ALLOCS
505 tuple_zero_allocs++;
506#endif
507 tupledealloc(v);
508 *pv = (PyObject*) sv;
509 return 0;
510 }
511 if (0 < newsize && newsize < MAXSAVESIZE &&
512 (sv = free_tuples[newsize]) != NULL)
513 {
514 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
515 num_free_tuples[newsize]--;
516#ifdef COUNT_ALLOCS
517 fast_tuple_allocs++;
518#endif
519#ifdef Py_TRACE_REFS
520 sv->ob_type = &PyTuple_Type;
521#endif
522 for (i = 0; i < newsize; ++i){
523 sv->ob_item[i] = v->ob_item[i];
524 v->ob_item[i] = NULL;
525 }
526 sv->ob_size = v->ob_size;
527 tupledealloc(v);
528 *pv = (PyObject *) sv;
529 } else
530#endif
531 {
532 sv = (PyTupleObject *)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000533 PyObject_REALLOC((char *)v,
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000534 sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
535 *pv = (PyObject *) sv;
536 if (sv == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000537 PyObject_DEL(v);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000538 PyErr_NoMemory();
539 return -1;
540 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000541 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000542 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000543 for (i = sv->ob_size; i < newsize; i++)
544 sv->ob_item[i] = NULL;
545 if (last_is_sticky && sizediff > 0) {
546 /* growing: move entries to the end and zero moved entries */
547 for (i = newsize - 1; i >= sizediff; i--) {
548 sv->ob_item[i] = sv->ob_item[i - sizediff];
549 sv->ob_item[i - sizediff] = NULL;
550 }
551 }
552 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000553 return 0;
554}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000555
556void
557PyTuple_Fini()
558{
559#if MAXSAVESIZE > 0
560 int i;
561
562 Py_XDECREF(free_tuples[0]);
563 free_tuples[0] = NULL;
564
565 for (i = 1; i < MAXSAVESIZE; i++) {
566 PyTupleObject *p, *q;
567 p = free_tuples[i];
568 free_tuples[i] = NULL;
569 while (p) {
570 q = p;
571 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000572 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000573 }
574 }
575#endif
576}