blob: d6fb6b4d6457d18909dc28148d216790e6686b9f [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(
82 sizeof(PyTupleObject) + size * 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();
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000085 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000086 op->ob_type = &PyTuple_Type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 op->ob_size = size;
88 for (i = 0; i < size; i++)
89 op->ob_item[i] = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 _Py_NewReference(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000091#if MAXSAVESIZE > 0
92 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000093 free_tuples[0] = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000094 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000095 }
96#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098}
99
100int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000101PyTuple_Size(op)
102 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 if (!PyTuple_Check(op)) {
105 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000106 return -1;
107 }
108 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110}
111
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000112PyObject *
113PyTuple_GetItem(op, i)
114 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115 register int i;
116{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117 if (!PyTuple_Check(op)) {
118 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000119 return NULL;
120 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000121 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
122 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123 return NULL;
124 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126}
127
128int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129PyTuple_SetItem(op, i, newitem)
130 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 register PyObject *olditem;
135 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000136 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137 Py_XDECREF(newitem);
138 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000139 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
142 Py_XDECREF(newitem);
143 PyErr_SetString(PyExc_IndexError,
144 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000145 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000148 olditem = *p;
149 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151 return 0;
152}
153
154/* Methods */
155
156static void
157tupledealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159{
160 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000161 for (i = 0; i < op->ob_size; i++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000163#if MAXSAVESIZE > 0
164 if (0 < op->ob_size && op->ob_size < MAXSAVESIZE) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000165 op->ob_item[0] = (PyObject *) free_tuples[op->ob_size];
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000166 free_tuples[op->ob_size] = op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000167 } else
168#endif
169 free((ANY *)op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170}
171
Guido van Rossum49e85141991-06-07 22:59:30 +0000172static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000174 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175 FILE *fp;
176 int flags;
177{
178 int i;
179 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000180 for (i = 0; i < op->ob_size; i++) {
181 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000184 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185 }
186 if (op->ob_size == 1)
187 fprintf(fp, ",");
188 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000189 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190}
191
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 s = PyString_FromString("(");
199 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200 for (i = 0; i < v->ob_size && s != NULL; i++) {
201 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202 PyString_Concat(&s, comma);
203 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000205 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000206 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 PyString_ConcatAndDel(&s, PyString_FromString(","));
208 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209 return s;
210}
211
212static int
213tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215{
216 register int len =
217 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
218 register int i;
219 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221 if (cmp != 0)
222 return cmp;
223 }
224 return v->ob_size - w->ob_size;
225}
226
Guido van Rossum9bfef441993-03-29 10:43:31 +0000227static long
228tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000230{
231 register long x, y;
232 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000234 x = 0x345678L;
235 p = v->ob_item;
236 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000237 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 if (y == -1)
239 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000240 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000241 }
242 x ^= v->ob_size;
243 if (x == -1)
244 x = -2;
245 return x;
246}
247
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248static int
249tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000250 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251{
252 return a->ob_size;
253}
254
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000257 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258 register int i;
259{
260 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000261 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262 return NULL;
263 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265 return a->ob_item[i];
266}
267
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000268static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000270 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271 register int ilow, ihigh;
272{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274 register int i;
275 if (ilow < 0)
276 ilow = 0;
277 if (ihigh > a->ob_size)
278 ihigh = a->ob_size;
279 if (ihigh < ilow)
280 ihigh = ilow;
281 if (ilow == 0 && ihigh == a->ob_size) {
282 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283 Py_INCREF(a);
284 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 if (np == NULL)
288 return NULL;
289 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000290 PyObject *v = a->ob_item[i];
291 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292 np->ob_item[i - ilow] = v;
293 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295}
296
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297PyObject *
298PyTuple_GetSlice(op, i, j)
299 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000300 int i, j;
301{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 if (op == NULL || !PyTuple_Check(op)) {
303 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000304 return NULL;
305 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000306 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000307}
308
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 register PyTupleObject *a;
312 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313{
314 register int size;
315 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 PyTupleObject *np;
317 if (!PyTuple_Check(bb)) {
318 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 return NULL;
320 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000325 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326 }
327 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 PyObject *v = a->ob_item[i];
329 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 np->ob_item[i] = v;
331 }
332 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000333 PyObject *v = b->ob_item[i];
334 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335 np->ob_item[i + a->ob_size] = v;
336 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338#undef b
339}
340
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000342tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000344 int n;
345{
346 int i, j;
347 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 PyTupleObject *np;
349 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000350 if (n < 0)
351 n = 0;
352 if (a->ob_size*n == a->ob_size) {
353 /* Since tuples are immutable, we can return a shared
354 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 Py_INCREF(a);
356 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000357 }
358 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000360 if (np == NULL)
361 return NULL;
362 p = np->ob_item;
363 for (i = 0; i < n; i++) {
364 for (j = 0; j < a->ob_size; j++) {
365 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000367 p++;
368 }
369 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000371}
372
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000374 (inquiry)tuplelength, /*sq_length*/
375 (binaryfunc)tupleconcat, /*sq_concat*/
376 (intargfunc)tuplerepeat, /*sq_repeat*/
377 (intargfunc)tupleitem, /*sq_item*/
378 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379 0, /*sq_ass_item*/
380 0, /*sq_ass_slice*/
381};
382
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383PyTypeObject PyTuple_Type = {
384 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 0,
386 "tuple",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 sizeof(PyTupleObject) - sizeof(PyObject *),
388 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000389 (destructor)tupledealloc, /*tp_dealloc*/
390 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391 0, /*tp_getattr*/
392 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000393 (cmpfunc)tuplecompare, /*tp_compare*/
394 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 0, /*tp_as_number*/
396 &tuple_as_sequence, /*tp_as_sequence*/
397 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000398 (hashfunc)tuplehash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000400
401/* The following function breaks the notion that tuples are immutable:
402 it changes the size of a tuple. We get away with this only if there
403 is only one module referencing the object. You can also think of it
404 as creating a new tuple object and destroying the old one, only
405 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000406 already be known to some other part of the code...
407 If last_is_sticky is set, the tuple will grow or shrink at the
408 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000409
410int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411_PyTuple_Resize(pv, newsize, last_is_sticky)
412 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000413 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000414 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000415{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 register PyTupleObject *v;
417 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000418 int i;
419 int sizediff;
420
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 v = (PyTupleObject *) *pv;
422 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000423 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000424 Py_DECREF(v);
425 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000426 return -1;
427 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000428 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000429 if (sizediff == 0)
430 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000431 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000432#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000433 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000434#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000435 _Py_ForgetReference(v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000436 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437 /* shrinking:
438 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000439 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000440 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000441 v->ob_item[i] = v->ob_item[i - sizediff];
442 v->ob_item[i - sizediff] = NULL;
443 }
444 }
445 for (i = newsize; i < v->ob_size; 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] = NULL;
448 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 sv = (PyTupleObject *)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000450 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000451 sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
452 *pv = (PyObject *) sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000453 if (sv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000454 PyMem_DEL(v);
455 PyErr_NoMemory();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000456 return -1;
457 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000458 _Py_NewReference(sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000459 for (i = sv->ob_size; i < newsize; i++)
460 sv->ob_item[i] = NULL;
461 if (last_is_sticky && sizediff > 0) {
462 /* growing: move entries to the end and zero moved entries */
463 for (i = newsize - 1; i >= sizediff; i--) {
464 sv->ob_item[i] = sv->ob_item[i - sizediff];
465 sv->ob_item[i - sizediff] = NULL;
466 }
467 }
468 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000469 return 0;
470}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000471
472void
473PyTuple_Fini()
474{
475#if MAXSAVESIZE > 0
476 int i;
477
478 Py_XDECREF(free_tuples[0]);
479 free_tuples[0] = NULL;
480
481 for (i = 1; i < MAXSAVESIZE; i++) {
482 PyTupleObject *p, *q;
483 p = free_tuples[i];
484 free_tuples[i] = NULL;
485 while (p) {
486 q = p;
487 p = (PyTupleObject *)(p->ob_item[0]);
488 PyMem_DEL(q);
489 }
490 }
491#endif
492}