blob: 7dc4dc837000781d25274921ccef1bfcb143d1ef [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
77 } else
78#endif
79 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000080 op = (PyTupleObject *) malloc(
81 sizeof(PyTupleObject) + size * sizeof(PyObject *));
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000082 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000083 return PyErr_NoMemory();
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000084 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 op->ob_type = &PyTuple_Type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086 op->ob_size = size;
87 for (i = 0; i < size; i++)
88 op->ob_item[i] = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000089 _Py_NewReference(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000090#if MAXSAVESIZE > 0
91 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000092 free_tuples[0] = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000094 }
95#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097}
98
99int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100PyTuple_Size(op)
101 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000103 if (!PyTuple_Check(op)) {
104 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105 return -1;
106 }
107 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000109}
110
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111PyObject *
112PyTuple_GetItem(op, i)
113 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114 register int i;
115{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000116 if (!PyTuple_Check(op)) {
117 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118 return NULL;
119 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
121 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122 return NULL;
123 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125}
126
127int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128PyTuple_SetItem(op, i, newitem)
129 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 register PyObject *olditem;
134 register PyObject **p;
135 if (!PyTuple_Check(op)) {
136 Py_XDECREF(newitem);
137 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000138 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
141 Py_XDECREF(newitem);
142 PyErr_SetString(PyExc_IndexError,
143 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000144 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000147 olditem = *p;
148 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150 return 0;
151}
152
153/* Methods */
154
155static void
156tupledealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158{
159 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000160 for (i = 0; i < op->ob_size; i++)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000162#if MAXSAVESIZE > 0
163 if (0 < op->ob_size && op->ob_size < MAXSAVESIZE) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 op->ob_item[0] = (PyObject *) free_tuples[op->ob_size];
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000165 free_tuples[op->ob_size] = op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000166 } else
167#endif
168 free((ANY *)op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169}
170
Guido van Rossum49e85141991-06-07 22:59:30 +0000171static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174 FILE *fp;
175 int flags;
176{
177 int i;
178 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000179 for (i = 0; i < op->ob_size; i++) {
180 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000183 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184 }
185 if (op->ob_size == 1)
186 fprintf(fp, ",");
187 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000188 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189}
190
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000197 s = PyString_FromString("(");
198 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199 for (i = 0; i < v->ob_size && s != NULL; i++) {
200 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 PyString_Concat(&s, comma);
202 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000205 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 PyString_ConcatAndDel(&s, PyString_FromString(","));
207 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 return s;
209}
210
211static int
212tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214{
215 register int len =
216 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
217 register int i;
218 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 if (cmp != 0)
221 return cmp;
222 }
223 return v->ob_size - w->ob_size;
224}
225
Guido van Rossum9bfef441993-03-29 10:43:31 +0000226static long
227tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000229{
230 register long x, y;
231 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000233 x = 0x345678L;
234 p = v->ob_item;
235 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000237 if (y == -1)
238 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000239 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000240 }
241 x ^= v->ob_size;
242 if (x == -1)
243 x = -2;
244 return x;
245}
246
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247static int
248tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000249 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250{
251 return a->ob_size;
252}
253
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257 register int i;
258{
259 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000260 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261 return NULL;
262 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000263 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264 return a->ob_item[i];
265}
266
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270 register int ilow, ihigh;
271{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000272 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273 register int i;
274 if (ilow < 0)
275 ilow = 0;
276 if (ihigh > a->ob_size)
277 ihigh = a->ob_size;
278 if (ihigh < ilow)
279 ihigh = ilow;
280 if (ilow == 0 && ihigh == a->ob_size) {
281 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 Py_INCREF(a);
283 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 if (np == NULL)
287 return NULL;
288 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 PyObject *v = a->ob_item[i];
290 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 np->ob_item[i - ilow] = v;
292 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000293 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294}
295
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000296PyObject *
297PyTuple_GetSlice(op, i, j)
298 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000299 int i, j;
300{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 if (op == NULL || !PyTuple_Check(op)) {
302 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000303 return NULL;
304 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000306}
307
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 register PyTupleObject *a;
311 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312{
313 register int size;
314 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 PyTupleObject *np;
316 if (!PyTuple_Check(bb)) {
317 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 return NULL;
319 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000324 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325 }
326 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327 PyObject *v = a->ob_item[i];
328 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329 np->ob_item[i] = v;
330 }
331 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 PyObject *v = b->ob_item[i];
333 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334 np->ob_item[i + a->ob_size] = v;
335 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337#undef b
338}
339
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000341tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000343 int n;
344{
345 int i, j;
346 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347 PyTupleObject *np;
348 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000349 if (n < 0)
350 n = 0;
351 if (a->ob_size*n == a->ob_size) {
352 /* Since tuples are immutable, we can return a shared
353 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 Py_INCREF(a);
355 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000356 }
357 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000359 if (np == NULL)
360 return NULL;
361 p = np->ob_item;
362 for (i = 0; i < n; i++) {
363 for (j = 0; j < a->ob_size; j++) {
364 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000366 p++;
367 }
368 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000370}
371
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000373 (inquiry)tuplelength, /*sq_length*/
374 (binaryfunc)tupleconcat, /*sq_concat*/
375 (intargfunc)tuplerepeat, /*sq_repeat*/
376 (intargfunc)tupleitem, /*sq_item*/
377 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378 0, /*sq_ass_item*/
379 0, /*sq_ass_slice*/
380};
381
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382PyTypeObject PyTuple_Type = {
383 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 0,
385 "tuple",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 sizeof(PyTupleObject) - sizeof(PyObject *),
387 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000388 (destructor)tupledealloc, /*tp_dealloc*/
389 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000390 0, /*tp_getattr*/
391 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000392 (cmpfunc)tuplecompare, /*tp_compare*/
393 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394 0, /*tp_as_number*/
395 &tuple_as_sequence, /*tp_as_sequence*/
396 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000397 (hashfunc)tuplehash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000399
400/* The following function breaks the notion that tuples are immutable:
401 it changes the size of a tuple. We get away with this only if there
402 is only one module referencing the object. You can also think of it
403 as creating a new tuple object and destroying the old one, only
404 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000405 already be known to some other part of the code...
406 If last_is_sticky is set, the tuple will grow or shrink at the
407 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000408
409int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410_PyTuple_Resize(pv, newsize, last_is_sticky)
411 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000412 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000413 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000414{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000415 register PyTupleObject *v;
416 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000417 int i;
418 int sizediff;
419
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 v = (PyTupleObject *) *pv;
421 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000422 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 Py_DECREF(v);
424 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000425 return -1;
426 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000427 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000428 if (sizediff == 0)
429 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000430 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000431#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000432 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000433#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434 _Py_ForgetReference(v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000435 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 /* shrinking:
437 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000438 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000440 v->ob_item[i] = v->ob_item[i - sizediff];
441 v->ob_item[i - sizediff] = NULL;
442 }
443 }
444 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000446 v->ob_item[i] = NULL;
447 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 sv = (PyTupleObject *)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000449 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
451 *pv = (PyObject *) sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000452 if (sv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 PyMem_DEL(v);
454 PyErr_NoMemory();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000455 return -1;
456 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 _Py_NewReference(sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000458 for (i = sv->ob_size; i < newsize; i++)
459 sv->ob_item[i] = NULL;
460 if (last_is_sticky && sizediff > 0) {
461 /* growing: move entries to the end and zero moved entries */
462 for (i = newsize - 1; i >= sizediff; i--) {
463 sv->ob_item[i] = sv->ob_item[i - sizediff];
464 sv->ob_item[i - sizediff] = NULL;
465 }
466 }
467 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000468 return 0;
469}