blob: c26b7dfbf0deefb893d5e276e605180e74e18371 [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,
365 "can only append tuple (not \"%.200s\") to tuple",
366 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
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000424 (inquiry)tuplelength, /*sq_length*/
425 (binaryfunc)tupleconcat, /*sq_concat*/
426 (intargfunc)tuplerepeat, /*sq_repeat*/
427 (intargfunc)tupleitem, /*sq_item*/
428 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429 0, /*sq_ass_item*/
430 0, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000431 (objobjproc)tuplecontains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432};
433
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434PyTypeObject PyTuple_Type = {
435 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436 0,
437 "tuple",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438 sizeof(PyTupleObject) - sizeof(PyObject *),
439 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000440 (destructor)tupledealloc, /*tp_dealloc*/
441 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442 0, /*tp_getattr*/
443 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000444 (cmpfunc)tuplecompare, /*tp_compare*/
445 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 0, /*tp_as_number*/
447 &tuple_as_sequence, /*tp_as_sequence*/
448 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000449 (hashfunc)tuplehash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000451
452/* The following function breaks the notion that tuples are immutable:
453 it changes the size of a tuple. We get away with this only if there
454 is only one module referencing the object. You can also think of it
455 as creating a new tuple object and destroying the old one, only
456 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000457 already be known to some other part of the code...
458 If last_is_sticky is set, the tuple will grow or shrink at the
459 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000460
461int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000462_PyTuple_Resize(pv, newsize, last_is_sticky)
463 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000464 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000465 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000466{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 register PyTupleObject *v;
468 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000469 int i;
470 int sizediff;
471
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472 v = (PyTupleObject *) *pv;
473 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000474 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 Py_DECREF(v);
476 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000477 return -1;
478 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000479 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000480 if (sizediff == 0)
481 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000482 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000483#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000484 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000485#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000486 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000487 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488 /* shrinking:
489 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000490 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000491 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000492 v->ob_item[i] = v->ob_item[i - sizediff];
493 v->ob_item[i - sizediff] = NULL;
494 }
495 }
496 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000497 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000498 v->ob_item[i] = NULL;
499 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000500#if MAXSAVESIZE > 0
501 if (newsize == 0 && free_tuples[0]) {
502 num_free_tuples[0]--;
503 sv = free_tuples[0];
504 sv->ob_size = 0;
505 Py_INCREF(sv);
506#ifdef COUNT_ALLOCS
507 tuple_zero_allocs++;
508#endif
509 tupledealloc(v);
510 *pv = (PyObject*) sv;
511 return 0;
512 }
513 if (0 < newsize && newsize < MAXSAVESIZE &&
514 (sv = free_tuples[newsize]) != NULL)
515 {
516 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
517 num_free_tuples[newsize]--;
518#ifdef COUNT_ALLOCS
519 fast_tuple_allocs++;
520#endif
521#ifdef Py_TRACE_REFS
522 sv->ob_type = &PyTuple_Type;
523#endif
524 for (i = 0; i < newsize; ++i){
525 sv->ob_item[i] = v->ob_item[i];
526 v->ob_item[i] = NULL;
527 }
528 sv->ob_size = v->ob_size;
529 tupledealloc(v);
530 *pv = (PyObject *) sv;
531 } else
532#endif
533 {
534 sv = (PyTupleObject *)
Guido van Rossumb18618d2000-05-03 23:44:39 +0000535 PyObject_REALLOC((char *)v,
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000536 sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
537 *pv = (PyObject *) sv;
538 if (sv == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000539 PyObject_DEL(v);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000540 PyErr_NoMemory();
541 return -1;
542 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000543 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000544 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000545 for (i = sv->ob_size; i < newsize; i++)
546 sv->ob_item[i] = NULL;
547 if (last_is_sticky && sizediff > 0) {
548 /* growing: move entries to the end and zero moved entries */
549 for (i = newsize - 1; i >= sizediff; i--) {
550 sv->ob_item[i] = sv->ob_item[i - sizediff];
551 sv->ob_item[i - sizediff] = NULL;
552 }
553 }
554 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000555 return 0;
556}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000557
558void
559PyTuple_Fini()
560{
561#if MAXSAVESIZE > 0
562 int i;
563
564 Py_XDECREF(free_tuples[0]);
565 free_tuples[0] = NULL;
566
567 for (i = 1; i < MAXSAVESIZE; i++) {
568 PyTupleObject *p, *q;
569 p = free_tuples[i];
570 free_tuples[i] = NULL;
571 while (p) {
572 q = p;
573 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000574 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000575 }
576 }
577#endif
578}