blob: 98448bd5e0a6f922933332fd7ffd87a6738989ce [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 Rossum68055ce1998-12-11 14:56:38 +000083#ifdef Py_TRACE_REFS
84 op->ob_type = &PyTuple_Type;
85 op->ob_size = size;
86#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000087 }
88 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000089#endif
90 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000091 int nbytes = size * sizeof(PyObject *);
92 /* Check for overflow */
93 if (nbytes / sizeof(PyObject *) != (size_t)size ||
94 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
95 <= 0)
96 {
97 return PyErr_NoMemory();
98 }
99 ;
100 op = (PyTupleObject *) malloc(nbytes);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000101 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102 return PyErr_NoMemory();
Guido van Rossum1bb26871998-06-26 15:53:50 +0000103
104 op->ob_type = &PyTuple_Type;
105 op->ob_size = size;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000106 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107 for (i = 0; i < size; i++)
108 op->ob_item[i] = NULL;
Guido van Rossumbffd6832000-01-20 22:32:56 +0000109 _Py_NewReference((PyObject *)op);
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 }
196 free((ANY *)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
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 register int i;
288{
289 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000290 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 return NULL;
292 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000293 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 return a->ob_item[i];
295}
296
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 register int ilow, ihigh;
301{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 register int i;
304 if (ilow < 0)
305 ilow = 0;
306 if (ihigh > a->ob_size)
307 ihigh = a->ob_size;
308 if (ihigh < ilow)
309 ihigh = ilow;
310 if (ilow == 0 && ihigh == a->ob_size) {
311 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 Py_INCREF(a);
313 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316 if (np == NULL)
317 return NULL;
318 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319 PyObject *v = a->ob_item[i];
320 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 np->ob_item[i - ilow] = v;
322 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324}
325
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000326PyObject *
327PyTuple_GetSlice(op, i, j)
328 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000329 int i, j;
330{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000331 if (op == NULL || !PyTuple_Check(op)) {
332 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000333 return NULL;
334 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000336}
337
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 register PyTupleObject *a;
341 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342{
343 register int size;
344 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345 PyTupleObject *np;
346 if (!PyTuple_Check(bb)) {
347 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348 return NULL;
349 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000350#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000354 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 }
356 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357 PyObject *v = a->ob_item[i];
358 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359 np->ob_item[i] = v;
360 }
361 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362 PyObject *v = b->ob_item[i];
363 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364 np->ob_item[i + a->ob_size] = v;
365 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367#undef b
368}
369
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000371tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000373 int n;
374{
375 int i, j;
376 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377 PyTupleObject *np;
378 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000379 if (n < 0)
380 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000381 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000382 /* Since tuples are immutable, we can return a shared
383 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 Py_INCREF(a);
385 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000386 }
387 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000388 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000389 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000391 if (np == NULL)
392 return NULL;
393 p = np->ob_item;
394 for (i = 0; i < n; i++) {
395 for (j = 0; j < a->ob_size; j++) {
396 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000398 p++;
399 }
400 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000402}
403
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000405 (inquiry)tuplelength, /*sq_length*/
406 (binaryfunc)tupleconcat, /*sq_concat*/
407 (intargfunc)tuplerepeat, /*sq_repeat*/
408 (intargfunc)tupleitem, /*sq_item*/
409 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410 0, /*sq_ass_item*/
411 0, /*sq_ass_slice*/
412};
413
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414PyTypeObject PyTuple_Type = {
415 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416 0,
417 "tuple",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 sizeof(PyTupleObject) - sizeof(PyObject *),
419 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000420 (destructor)tupledealloc, /*tp_dealloc*/
421 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422 0, /*tp_getattr*/
423 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000424 (cmpfunc)tuplecompare, /*tp_compare*/
425 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426 0, /*tp_as_number*/
427 &tuple_as_sequence, /*tp_as_sequence*/
428 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000429 (hashfunc)tuplehash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000431
432/* The following function breaks the notion that tuples are immutable:
433 it changes the size of a tuple. We get away with this only if there
434 is only one module referencing the object. You can also think of it
435 as creating a new tuple object and destroying the old one, only
436 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000437 already be known to some other part of the code...
438 If last_is_sticky is set, the tuple will grow or shrink at the
439 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000440
441int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442_PyTuple_Resize(pv, newsize, last_is_sticky)
443 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000444 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000445 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000446{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 register PyTupleObject *v;
448 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000449 int i;
450 int sizediff;
451
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 v = (PyTupleObject *) *pv;
453 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000454 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 Py_DECREF(v);
456 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000457 return -1;
458 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000459 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000460 if (sizediff == 0)
461 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000462 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000463#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000464 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000465#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000466 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000467 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000468 /* shrinking:
469 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000470 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000472 v->ob_item[i] = v->ob_item[i - sizediff];
473 v->ob_item[i - sizediff] = NULL;
474 }
475 }
476 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000478 v->ob_item[i] = NULL;
479 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000480#if MAXSAVESIZE > 0
481 if (newsize == 0 && free_tuples[0]) {
482 num_free_tuples[0]--;
483 sv = free_tuples[0];
484 sv->ob_size = 0;
485 Py_INCREF(sv);
486#ifdef COUNT_ALLOCS
487 tuple_zero_allocs++;
488#endif
489 tupledealloc(v);
490 *pv = (PyObject*) sv;
491 return 0;
492 }
493 if (0 < newsize && newsize < MAXSAVESIZE &&
494 (sv = free_tuples[newsize]) != NULL)
495 {
496 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
497 num_free_tuples[newsize]--;
498#ifdef COUNT_ALLOCS
499 fast_tuple_allocs++;
500#endif
501#ifdef Py_TRACE_REFS
502 sv->ob_type = &PyTuple_Type;
503#endif
504 for (i = 0; i < newsize; ++i){
505 sv->ob_item[i] = v->ob_item[i];
506 v->ob_item[i] = NULL;
507 }
508 sv->ob_size = v->ob_size;
509 tupledealloc(v);
510 *pv = (PyObject *) sv;
511 } else
512#endif
513 {
514 sv = (PyTupleObject *)
515 realloc((char *)v,
516 sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
517 *pv = (PyObject *) sv;
518 if (sv == NULL) {
519 PyMem_DEL(v);
520 PyErr_NoMemory();
521 return -1;
522 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000523 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000524 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000525 for (i = sv->ob_size; i < newsize; i++)
526 sv->ob_item[i] = NULL;
527 if (last_is_sticky && sizediff > 0) {
528 /* growing: move entries to the end and zero moved entries */
529 for (i = newsize - 1; i >= sizediff; i--) {
530 sv->ob_item[i] = sv->ob_item[i - sizediff];
531 sv->ob_item[i - sizediff] = NULL;
532 }
533 }
534 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000535 return 0;
536}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000537
538void
539PyTuple_Fini()
540{
541#if MAXSAVESIZE > 0
542 int i;
543
544 Py_XDECREF(free_tuples[0]);
545 free_tuples[0] = NULL;
546
547 for (i = 1; i < MAXSAVESIZE; i++) {
548 PyTupleObject *p, *q;
549 p = free_tuples[i];
550 free_tuples[i] = NULL;
551 while (p) {
552 q = p;
553 p = (PyTupleObject *)(p->ob_item[0]);
554 PyMem_DEL(q);
555 }
556 }
557#endif
558}