blob: 73e33045d0ebd5c247e60920e140a4e7ead367e7 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Tuple object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum5ce78f82000-04-21 21:15:05 +000036/* Speed optimization to avoid frequent malloc/free of small tuples */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000037#ifndef MAXSAVESIZE
Guido van Rossum5ce78f82000-04-21 21:15:05 +000038#define MAXSAVESIZE 20 /* Largest tuple to save on free list */
39#endif
40#ifndef MAXSAVEDTUPLES
41#define MAXSAVEDTUPLES 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000042#endif
43
44#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +000045/* Entries 1 up to MAXSAVESIZE are free lists, entry 0 is the empty
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000046 tuple () of which at most one instance will be allocated.
47*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000048static PyTupleObject *free_tuples[MAXSAVESIZE];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000049static int num_free_tuples[MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000050#endif
51#ifdef COUNT_ALLOCS
52int fast_tuple_allocs;
53int tuple_zero_allocs;
54#endif
55
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056PyObject *
57PyTuple_New(size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 register int size;
59{
60 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 return NULL;
65 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000066#if MAXSAVESIZE > 0
Sjoerd Mullender615194a1993-11-01 13:46:50 +000067 if (size == 0 && free_tuples[0]) {
68 op = free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000069 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000070#ifdef COUNT_ALLOCS
71 tuple_zero_allocs++;
72#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000074 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 if (0 < size && size < MAXSAVESIZE &&
76 (op = free_tuples[size]) != NULL)
77 {
78 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000079 num_free_tuples[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000080#ifdef COUNT_ALLOCS
81 fast_tuple_allocs++;
82#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000083 /* PyObject_InitVar is inlined */
Guido van Rossum68055ce1998-12-11 14:56:38 +000084#ifdef Py_TRACE_REFS
Guido van Rossum68055ce1998-12-11 14:56:38 +000085 op->ob_size = size;
Guido van Rossumb18618d2000-05-03 23:44:39 +000086 op->ob_type = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000087#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000088 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000089 }
90 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000091#endif
92 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000093 int nbytes = size * sizeof(PyObject *);
94 /* Check for overflow */
95 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Jeremy Hyltond08b4c42000-06-23 19:37:02 +000096 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *)
97 + PyGC_INFO_SIZE)
Guido van Rossum5bc51f21999-07-12 23:06:58 +000098 <= 0)
99 {
100 return PyErr_NoMemory();
101 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000102 /* PyObject_NewVar is inlined */
103 op = (PyTupleObject *) PyObject_MALLOC(nbytes);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000104 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 return PyErr_NoMemory();
Guido van Rossum1bb26871998-06-26 15:53:50 +0000106
Guido van Rossumb18618d2000-05-03 23:44:39 +0000107 PyObject_INIT_VAR(op, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000108 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109 for (i = 0; i < size; i++)
110 op->ob_item[i] = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000111#if MAXSAVESIZE > 0
112 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000113 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000114 ++num_free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000116 }
117#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119}
120
121int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122PyTuple_Size(op)
123 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 if (!PyTuple_Check(op)) {
126 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127 return -1;
128 }
129 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131}
132
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133PyObject *
134PyTuple_GetItem(op, i)
135 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136 register int i;
137{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 if (!PyTuple_Check(op)) {
139 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140 return NULL;
141 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
143 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144 return NULL;
145 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147}
148
149int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150PyTuple_SetItem(op, i, newitem)
151 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000153 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155 register PyObject *olditem;
156 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000157 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158 Py_XDECREF(newitem);
159 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000160 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
163 Py_XDECREF(newitem);
164 PyErr_SetString(PyExc_IndexError,
165 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000166 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000169 olditem = *p;
170 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172 return 0;
173}
174
175/* Methods */
176
177static void
178tupledealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000179 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000180{
181 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000182 register int len = op->ob_size;
Guido van Rossumd724b232000-03-13 16:01:29 +0000183 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000184 if (len > 0) {
185 i = len;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000186 while (--i >= 0)
187 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000188#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000189 if (len < MAXSAVESIZE && num_free_tuples[len] < MAXSAVEDTUPLES) {
190 op->ob_item[0] = (PyObject *) free_tuples[len];
191 num_free_tuples[len]++;
192 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000193 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000194 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000195#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000196 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000197 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000198done:
199 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200}
201
Guido van Rossum49e85141991-06-07 22:59:30 +0000202static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205 FILE *fp;
206 int flags;
207{
208 int i;
209 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000210 for (i = 0; i < op->ob_size; i++) {
211 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000214 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215 }
216 if (op->ob_size == 1)
217 fprintf(fp, ",");
218 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000219 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220}
221
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000222static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 s = PyString_FromString("(");
229 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 for (i = 0; i < v->ob_size && s != NULL; i++) {
231 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 PyString_Concat(&s, comma);
233 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000236 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 PyString_ConcatAndDel(&s, PyString_FromString(","));
238 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239 return s;
240}
241
242static int
243tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000244 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245{
246 register int len =
247 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
248 register int i;
249 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000250 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 if (cmp != 0)
252 return cmp;
253 }
254 return v->ob_size - w->ob_size;
255}
256
Guido van Rossum9bfef441993-03-29 10:43:31 +0000257static long
258tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000259 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000260{
261 register long x, y;
262 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000263 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000264 x = 0x345678L;
265 p = v->ob_item;
266 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000268 if (y == -1)
269 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000270 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000271 }
272 x ^= v->ob_size;
273 if (x == -1)
274 x = -2;
275 return x;
276}
277
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278static int
279tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000280 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281{
282 return a->ob_size;
283}
284
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000285static int
286tuplecontains(a, el)
287 PyTupleObject *a;
288 PyObject *el;
289{
290 int i, cmp;
291
292 for (i = 0; i < a->ob_size; ++i) {
293 cmp = PyObject_Compare(el, PyTuple_GET_ITEM(a, i));
294 if (cmp == 0)
295 return 1;
296 if (PyErr_Occurred())
297 return -1;
298 }
299 return 0;
300}
301
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305 register int i;
306{
307 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 return NULL;
310 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312 return a->ob_item[i];
313}
314
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 register int ilow, ihigh;
319{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 register int i;
322 if (ilow < 0)
323 ilow = 0;
324 if (ihigh > a->ob_size)
325 ihigh = a->ob_size;
326 if (ihigh < ilow)
327 ihigh = ilow;
328 if (ilow == 0 && ihigh == a->ob_size) {
329 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 Py_INCREF(a);
331 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334 if (np == NULL)
335 return NULL;
336 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 PyObject *v = a->ob_item[i];
338 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339 np->ob_item[i - ilow] = v;
340 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342}
343
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344PyObject *
345PyTuple_GetSlice(op, i, j)
346 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000347 int i, j;
348{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 if (op == NULL || !PyTuple_Check(op)) {
350 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000351 return NULL;
352 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000353 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000354}
355
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 register PyTupleObject *a;
359 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360{
361 register int size;
362 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 PyTupleObject *np;
364 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000365 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000366 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000367 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368 return NULL;
369 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000374 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 }
376 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377 PyObject *v = a->ob_item[i];
378 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379 np->ob_item[i] = v;
380 }
381 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 PyObject *v = b->ob_item[i];
383 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 np->ob_item[i + a->ob_size] = v;
385 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387#undef b
388}
389
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000391tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000393 int n;
394{
395 int i, j;
396 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 PyTupleObject *np;
398 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000399 if (n < 0)
400 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000401 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000402 /* Since tuples are immutable, we can return a shared
403 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000404 Py_INCREF(a);
405 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000406 }
407 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000408 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000409 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000411 if (np == NULL)
412 return NULL;
413 p = np->ob_item;
414 for (i = 0; i < n; i++) {
415 for (j = 0; j < a->ob_size; j++) {
416 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000418 p++;
419 }
420 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000422}
423
Jeremy Hylton8caad492000-06-23 14:18:11 +0000424static int
425tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
426{
427 int i, err;
428 PyObject *x;
429
430 for (i = o->ob_size; --i >= 0; ) {
431 x = o->ob_item[i];
432 if (x != NULL) {
433 err = visit(x, arg);
434 if (err)
435 return err;
436 }
437 }
438 return 0;
439}
440
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000442 (inquiry)tuplelength, /*sq_length*/
443 (binaryfunc)tupleconcat, /*sq_concat*/
444 (intargfunc)tuplerepeat, /*sq_repeat*/
445 (intargfunc)tupleitem, /*sq_item*/
446 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000447 0, /*sq_ass_item*/
448 0, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000449 (objobjproc)tuplecontains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450};
451
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452PyTypeObject PyTuple_Type = {
453 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454 0,
455 "tuple",
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000456 sizeof(PyTupleObject) - sizeof(PyObject *) + PyGC_INFO_SIZE,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000458 (destructor)tupledealloc, /*tp_dealloc*/
459 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460 0, /*tp_getattr*/
461 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000462 (cmpfunc)tuplecompare, /*tp_compare*/
463 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464 0, /*tp_as_number*/
465 &tuple_as_sequence, /*tp_as_sequence*/
466 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000467 (hashfunc)tuplehash, /*tp_hash*/
Fred Drake56780252000-06-15 14:50:20 +0000468 0, /*tp_call*/
469 0, /*tp_str*/
470 0, /*tp_getattro*/
471 0, /*tp_setattro*/
472 0, /*tp_as_buffer*/
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000473 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000474 0, /*tp_doc*/
475 (traverseproc)tupletraverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000476};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000477
478/* The following function breaks the notion that tuples are immutable:
479 it changes the size of a tuple. We get away with this only if there
480 is only one module referencing the object. You can also think of it
481 as creating a new tuple object and destroying the old one, only
482 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000483 already be known to some other part of the code...
484 If last_is_sticky is set, the tuple will grow or shrink at the
485 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000486
487int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000488_PyTuple_Resize(pv, newsize, last_is_sticky)
489 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000490 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000491 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000492{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493 register PyTupleObject *v;
494 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000495 int i;
496 int sizediff;
497
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000498 v = (PyTupleObject *) *pv;
499 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000500 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 Py_DECREF(v);
502 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000503 return -1;
504 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000505 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000506 if (sizediff == 0)
507 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000508 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000509#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000510 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000511#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000512 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000513 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000514 /* shrinking:
515 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000516 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000518 v->ob_item[i] = v->ob_item[i - sizediff];
519 v->ob_item[i - sizediff] = NULL;
520 }
521 }
522 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000524 v->ob_item[i] = NULL;
525 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000526#if MAXSAVESIZE > 0
527 if (newsize == 0 && free_tuples[0]) {
528 num_free_tuples[0]--;
529 sv = free_tuples[0];
530 sv->ob_size = 0;
531 Py_INCREF(sv);
532#ifdef COUNT_ALLOCS
533 tuple_zero_allocs++;
534#endif
535 tupledealloc(v);
536 *pv = (PyObject*) sv;
537 return 0;
538 }
539 if (0 < newsize && newsize < MAXSAVESIZE &&
540 (sv = free_tuples[newsize]) != NULL)
541 {
542 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
543 num_free_tuples[newsize]--;
544#ifdef COUNT_ALLOCS
545 fast_tuple_allocs++;
546#endif
547#ifdef Py_TRACE_REFS
548 sv->ob_type = &PyTuple_Type;
549#endif
550 for (i = 0; i < newsize; ++i){
551 sv->ob_item[i] = v->ob_item[i];
552 v->ob_item[i] = NULL;
553 }
554 sv->ob_size = v->ob_size;
555 tupledealloc(v);
556 *pv = (PyObject *) sv;
557 } else
558#endif
559 {
560 sv = (PyTupleObject *)
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000561 PyObject_REALLOC((char *)v, sizeof(PyTupleObject)
562 + PyGC_INFO_SIZE
563 + newsize * sizeof(PyObject *));
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000564 *pv = (PyObject *) sv;
565 if (sv == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000566 PyObject_DEL(v);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000567 PyErr_NoMemory();
568 return -1;
569 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000570 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000571 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000572 for (i = sv->ob_size; i < newsize; i++)
573 sv->ob_item[i] = NULL;
574 if (last_is_sticky && sizediff > 0) {
575 /* growing: move entries to the end and zero moved entries */
576 for (i = newsize - 1; i >= sizediff; i--) {
577 sv->ob_item[i] = sv->ob_item[i - sizediff];
578 sv->ob_item[i - sizediff] = NULL;
579 }
580 }
581 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000582 return 0;
583}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000584
585void
586PyTuple_Fini()
587{
588#if MAXSAVESIZE > 0
589 int i;
590
591 Py_XDECREF(free_tuples[0]);
592 free_tuples[0] = NULL;
593
594 for (i = 1; i < MAXSAVESIZE; i++) {
595 PyTupleObject *p, *q;
596 p = free_tuples[i];
597 free_tuples[i] = NULL;
598 while (p) {
599 q = p;
600 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000601 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000602 }
603 }
604#endif
605}