blob: 2286b01dbe1aabd320b18e437f964c1c1f9f9b7a [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
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000036#ifndef MAXSAVESIZE
37#define MAXSAVESIZE 20
38#endif
39
40#if MAXSAVESIZE > 0
41/* Entries 1 upto MAXSAVESIZE are free lists, entry 0 is the empty
42 tuple () of which at most one instance will be allocated.
43*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044static PyTupleObject *free_tuples[MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000045#endif
46#ifdef COUNT_ALLOCS
47int fast_tuple_allocs;
48int tuple_zero_allocs;
49#endif
50
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051PyObject *
52PyTuple_New(size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053 register int size;
54{
55 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 return NULL;
60 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000061#if MAXSAVESIZE > 0
Sjoerd Mullender615194a1993-11-01 13:46:50 +000062 if (size == 0 && free_tuples[0]) {
63 op = free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000064 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000065#ifdef COUNT_ALLOCS
66 tuple_zero_allocs++;
67#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000068 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000069 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070 if (0 < size && size < MAXSAVESIZE &&
71 (op = free_tuples[size]) != NULL)
72 {
73 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000074#ifdef COUNT_ALLOCS
75 fast_tuple_allocs++;
76#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000077 }
78 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000079#endif
80 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 op = (PyTupleObject *) malloc(
Guido van Rossum017f7781998-11-16 18:56:03 +000082 sizeof(PyTupleObject) + (size-1) * sizeof(PyObject *));
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000083 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 return PyErr_NoMemory();
Guido van Rossum1bb26871998-06-26 15:53:50 +000085
86 op->ob_type = &PyTuple_Type;
87 op->ob_size = size;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000088 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 for (i = 0; i < size; i++)
90 op->ob_item[i] = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 _Py_NewReference(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000092#if MAXSAVESIZE > 0
93 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000094 free_tuples[0] = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000096 }
97#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099}
100
101int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000102PyTuple_Size(op)
103 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000105 if (!PyTuple_Check(op)) {
106 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107 return -1;
108 }
109 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111}
112
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113PyObject *
114PyTuple_GetItem(op, i)
115 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 register int i;
117{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 if (!PyTuple_Check(op)) {
119 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 return NULL;
121 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
123 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 return NULL;
125 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000126 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127}
128
129int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130PyTuple_SetItem(op, i, newitem)
131 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 register PyObject *olditem;
136 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000137 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 Py_XDECREF(newitem);
139 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000140 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
143 Py_XDECREF(newitem);
144 PyErr_SetString(PyExc_IndexError,
145 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000146 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000148 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000149 olditem = *p;
150 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000151 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152 return 0;
153}
154
155/* Methods */
156
157static void
158tupledealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160{
161 register int i;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000162
163 if (op->ob_size > 0) {
164 i = op->ob_size;
165 while (--i >= 0)
166 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000167#if MAXSAVESIZE > 0
Guido van Rossum1bb26871998-06-26 15:53:50 +0000168 if (op->ob_size < MAXSAVESIZE) {
169 op->ob_item[0] = (PyObject *) free_tuples[op->ob_size];
170 free_tuples[op->ob_size] = op;
171 return;
172 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000173#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000174 }
175 free((ANY *)op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000176}
177
Guido van Rossum49e85141991-06-07 22:59:30 +0000178static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 FILE *fp;
182 int flags;
183{
184 int i;
185 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000186 for (i = 0; i < op->ob_size; i++) {
187 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000190 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191 }
192 if (op->ob_size == 1)
193 fprintf(fp, ",");
194 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000195 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196}
197
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 s = PyString_FromString("(");
205 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206 for (i = 0; i < v->ob_size && s != NULL; i++) {
207 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 PyString_Concat(&s, comma);
209 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000210 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000212 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 PyString_ConcatAndDel(&s, PyString_FromString(","));
214 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215 return s;
216}
217
218static int
219tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221{
222 register int len =
223 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
224 register int i;
225 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 if (cmp != 0)
228 return cmp;
229 }
230 return v->ob_size - w->ob_size;
231}
232
Guido van Rossum9bfef441993-03-29 10:43:31 +0000233static long
234tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000236{
237 register long x, y;
238 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000240 x = 0x345678L;
241 p = v->ob_item;
242 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000244 if (y == -1)
245 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000246 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000247 }
248 x ^= v->ob_size;
249 if (x == -1)
250 x = -2;
251 return x;
252}
253
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254static int
255tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257{
258 return a->ob_size;
259}
260
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000263 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264 register int i;
265{
266 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268 return NULL;
269 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000270 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271 return a->ob_item[i];
272}
273
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000274static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 register int ilow, ihigh;
278{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280 register int i;
281 if (ilow < 0)
282 ilow = 0;
283 if (ihigh > a->ob_size)
284 ihigh = a->ob_size;
285 if (ihigh < ilow)
286 ihigh = ilow;
287 if (ilow == 0 && ihigh == a->ob_size) {
288 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 Py_INCREF(a);
290 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293 if (np == NULL)
294 return NULL;
295 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296 PyObject *v = a->ob_item[i];
297 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298 np->ob_item[i - ilow] = v;
299 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000300 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301}
302
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303PyObject *
304PyTuple_GetSlice(op, i, j)
305 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000306 int i, j;
307{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 if (op == NULL || !PyTuple_Check(op)) {
309 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000310 return NULL;
311 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000313}
314
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000317 register PyTupleObject *a;
318 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319{
320 register int size;
321 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 PyTupleObject *np;
323 if (!PyTuple_Check(bb)) {
324 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325 return NULL;
326 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000331 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 }
333 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 PyObject *v = a->ob_item[i];
335 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 np->ob_item[i] = v;
337 }
338 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 PyObject *v = b->ob_item[i];
340 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 np->ob_item[i + a->ob_size] = v;
342 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344#undef b
345}
346
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000348tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000350 int n;
351{
352 int i, j;
353 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 PyTupleObject *np;
355 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000356 if (n < 0)
357 n = 0;
358 if (a->ob_size*n == a->ob_size) {
359 /* Since tuples are immutable, we can return a shared
360 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 Py_INCREF(a);
362 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000363 }
364 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000366 if (np == NULL)
367 return NULL;
368 p = np->ob_item;
369 for (i = 0; i < n; i++) {
370 for (j = 0; j < a->ob_size; j++) {
371 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000373 p++;
374 }
375 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000377}
378
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000380 (inquiry)tuplelength, /*sq_length*/
381 (binaryfunc)tupleconcat, /*sq_concat*/
382 (intargfunc)tuplerepeat, /*sq_repeat*/
383 (intargfunc)tupleitem, /*sq_item*/
384 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 0, /*sq_ass_item*/
386 0, /*sq_ass_slice*/
387};
388
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389PyTypeObject PyTuple_Type = {
390 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 0,
392 "tuple",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 sizeof(PyTupleObject) - sizeof(PyObject *),
394 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000395 (destructor)tupledealloc, /*tp_dealloc*/
396 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397 0, /*tp_getattr*/
398 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000399 (cmpfunc)tuplecompare, /*tp_compare*/
400 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 0, /*tp_as_number*/
402 &tuple_as_sequence, /*tp_as_sequence*/
403 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000404 (hashfunc)tuplehash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000406
407/* The following function breaks the notion that tuples are immutable:
408 it changes the size of a tuple. We get away with this only if there
409 is only one module referencing the object. You can also think of it
410 as creating a new tuple object and destroying the old one, only
411 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000412 already be known to some other part of the code...
413 If last_is_sticky is set, the tuple will grow or shrink at the
414 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000415
416int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000417_PyTuple_Resize(pv, newsize, last_is_sticky)
418 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000419 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000420 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000421{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000422 register PyTupleObject *v;
423 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000424 int i;
425 int sizediff;
426
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000427 v = (PyTupleObject *) *pv;
428 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000429 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000430 Py_DECREF(v);
431 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000432 return -1;
433 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000434 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000435 if (sizediff == 0)
436 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000437 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000438#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000439 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000440#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 _Py_ForgetReference(v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000442 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 /* shrinking:
444 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000445 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000446 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000447 v->ob_item[i] = v->ob_item[i - sizediff];
448 v->ob_item[i - sizediff] = NULL;
449 }
450 }
451 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000453 v->ob_item[i] = NULL;
454 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 sv = (PyTupleObject *)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000456 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
458 *pv = (PyObject *) sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000459 if (sv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 PyMem_DEL(v);
461 PyErr_NoMemory();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000462 return -1;
463 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 _Py_NewReference(sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000465 for (i = sv->ob_size; i < newsize; i++)
466 sv->ob_item[i] = NULL;
467 if (last_is_sticky && sizediff > 0) {
468 /* growing: move entries to the end and zero moved entries */
469 for (i = newsize - 1; i >= sizediff; i--) {
470 sv->ob_item[i] = sv->ob_item[i - sizediff];
471 sv->ob_item[i - sizediff] = NULL;
472 }
473 }
474 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000475 return 0;
476}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000477
478void
479PyTuple_Fini()
480{
481#if MAXSAVESIZE > 0
482 int i;
483
484 Py_XDECREF(free_tuples[0]);
485 free_tuples[0] = NULL;
486
487 for (i = 1; i < MAXSAVESIZE; i++) {
488 PyTupleObject *p, *q;
489 p = free_tuples[i];
490 free_tuples[i] = NULL;
491 while (p) {
492 q = p;
493 p = (PyTupleObject *)(p->ob_item[0]);
494 PyMem_DEL(q);
495 }
496 }
497#endif
498}