blob: 18b3315cb0107095be287d417c9660fe96f1d6ec [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 Rossum68055ce1998-12-11 14:56:38 +000077#ifdef Py_TRACE_REFS
78 op->ob_type = &PyTuple_Type;
79 op->ob_size = size;
80#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000081 }
82 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000083#endif
84 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000085 int nbytes = size * sizeof(PyObject *);
86 /* Check for overflow */
87 if (nbytes / sizeof(PyObject *) != (size_t)size ||
88 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
89 <= 0)
90 {
91 return PyErr_NoMemory();
92 }
93 ;
94 op = (PyTupleObject *) malloc(nbytes);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000095 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096 return PyErr_NoMemory();
Guido van Rossum1bb26871998-06-26 15:53:50 +000097
98 op->ob_type = &PyTuple_Type;
99 op->ob_size = size;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000100 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101 for (i = 0; i < size; i++)
102 op->ob_item[i] = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000103 _Py_NewReference(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000104#if MAXSAVESIZE > 0
105 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000106 free_tuples[0] = op;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107 Py_INCREF(op); /* extra INCREF so that this is never freed */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000108 }
109#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000110 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111}
112
113int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114PyTuple_Size(op)
115 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116{
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 -1;
120 }
121 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 return ((PyTupleObject *)op)->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125PyObject *
126PyTuple_GetItem(op, i)
127 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 register int i;
129{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000130 if (!PyTuple_Check(op)) {
131 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132 return NULL;
133 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
135 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136 return NULL;
137 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139}
140
141int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142PyTuple_SetItem(op, i, newitem)
143 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000145 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 register PyObject *olditem;
148 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000149 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 Py_XDECREF(newitem);
151 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000152 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000154 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
155 Py_XDECREF(newitem);
156 PyErr_SetString(PyExc_IndexError,
157 "tuple assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000158 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000161 olditem = *p;
162 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164 return 0;
165}
166
167/* Methods */
168
169static void
170tupledealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172{
173 register int i;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000174
175 if (op->ob_size > 0) {
176 i = op->ob_size;
177 while (--i >= 0)
178 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000179#if MAXSAVESIZE > 0
Guido van Rossum1bb26871998-06-26 15:53:50 +0000180 if (op->ob_size < MAXSAVESIZE) {
181 op->ob_item[0] = (PyObject *) free_tuples[op->ob_size];
182 free_tuples[op->ob_size] = op;
183 return;
184 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000185#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000186 }
187 free((ANY *)op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188}
189
Guido van Rossum49e85141991-06-07 22:59:30 +0000190static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000192 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193 FILE *fp;
194 int flags;
195{
196 int i;
197 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000198 for (i = 0; i < op->ob_size; i++) {
199 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000200 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000202 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 }
204 if (op->ob_size == 1)
205 fprintf(fp, ",");
206 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000207 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208}
209
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000212 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000216 s = PyString_FromString("(");
217 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218 for (i = 0; i < v->ob_size && s != NULL; i++) {
219 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 PyString_Concat(&s, comma);
221 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000224 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 PyString_ConcatAndDel(&s, PyString_FromString(","));
226 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227 return s;
228}
229
230static int
231tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000232 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233{
234 register int len =
235 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
236 register int i;
237 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000238 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239 if (cmp != 0)
240 return cmp;
241 }
242 return v->ob_size - w->ob_size;
243}
244
Guido van Rossum9bfef441993-03-29 10:43:31 +0000245static long
246tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000247 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000248{
249 register long x, y;
250 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000251 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000252 x = 0x345678L;
253 p = v->ob_item;
254 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000255 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000256 if (y == -1)
257 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000258 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000259 }
260 x ^= v->ob_size;
261 if (x == -1)
262 x = -2;
263 return x;
264}
265
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266static int
267tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000268 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269{
270 return a->ob_size;
271}
272
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276 register int i;
277{
278 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280 return NULL;
281 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 return a->ob_item[i];
284}
285
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000286static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000288 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 register int ilow, ihigh;
290{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292 register int i;
293 if (ilow < 0)
294 ilow = 0;
295 if (ihigh > a->ob_size)
296 ihigh = a->ob_size;
297 if (ihigh < ilow)
298 ihigh = ilow;
299 if (ilow == 0 && ihigh == a->ob_size) {
300 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000301 Py_INCREF(a);
302 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305 if (np == NULL)
306 return NULL;
307 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 PyObject *v = a->ob_item[i];
309 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 np->ob_item[i - ilow] = v;
311 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313}
314
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315PyObject *
316PyTuple_GetSlice(op, i, j)
317 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000318 int i, j;
319{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 if (op == NULL || !PyTuple_Check(op)) {
321 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000322 return NULL;
323 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000324 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000325}
326
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 register PyTupleObject *a;
330 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331{
332 register int size;
333 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 PyTupleObject *np;
335 if (!PyTuple_Check(bb)) {
336 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337 return NULL;
338 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000341 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000343 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344 }
345 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 PyObject *v = a->ob_item[i];
347 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348 np->ob_item[i] = v;
349 }
350 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 PyObject *v = b->ob_item[i];
352 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 np->ob_item[i + a->ob_size] = v;
354 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356#undef b
357}
358
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000360tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000362 int n;
363{
364 int i, j;
365 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 PyTupleObject *np;
367 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000368 if (n < 0)
369 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000370 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000371 /* Since tuples are immutable, we can return a shared
372 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 Py_INCREF(a);
374 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000375 }
376 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000377 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000378 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000380 if (np == NULL)
381 return NULL;
382 p = np->ob_item;
383 for (i = 0; i < n; i++) {
384 for (j = 0; j < a->ob_size; j++) {
385 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000387 p++;
388 }
389 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000391}
392
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000394 (inquiry)tuplelength, /*sq_length*/
395 (binaryfunc)tupleconcat, /*sq_concat*/
396 (intargfunc)tuplerepeat, /*sq_repeat*/
397 (intargfunc)tupleitem, /*sq_item*/
398 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399 0, /*sq_ass_item*/
400 0, /*sq_ass_slice*/
401};
402
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403PyTypeObject PyTuple_Type = {
404 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405 0,
406 "tuple",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 sizeof(PyTupleObject) - sizeof(PyObject *),
408 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000409 (destructor)tupledealloc, /*tp_dealloc*/
410 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411 0, /*tp_getattr*/
412 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000413 (cmpfunc)tuplecompare, /*tp_compare*/
414 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415 0, /*tp_as_number*/
416 &tuple_as_sequence, /*tp_as_sequence*/
417 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000418 (hashfunc)tuplehash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000420
421/* The following function breaks the notion that tuples are immutable:
422 it changes the size of a tuple. We get away with this only if there
423 is only one module referencing the object. You can also think of it
424 as creating a new tuple object and destroying the old one, only
425 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000426 already be known to some other part of the code...
427 If last_is_sticky is set, the tuple will grow or shrink at the
428 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000429
430int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000431_PyTuple_Resize(pv, newsize, last_is_sticky)
432 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000433 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000434 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000435{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 register PyTupleObject *v;
437 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000438 int i;
439 int sizediff;
440
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 v = (PyTupleObject *) *pv;
442 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000443 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 Py_DECREF(v);
445 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000446 return -1;
447 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000448 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000449 if (sizediff == 0)
450 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000451 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000452#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000453 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000454#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455 _Py_ForgetReference(v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000456 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457 /* shrinking:
458 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000459 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000461 v->ob_item[i] = v->ob_item[i - sizediff];
462 v->ob_item[i - sizediff] = NULL;
463 }
464 }
465 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000467 v->ob_item[i] = NULL;
468 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 sv = (PyTupleObject *)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000470 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000471 sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
472 *pv = (PyObject *) sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000473 if (sv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 PyMem_DEL(v);
475 PyErr_NoMemory();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000476 return -1;
477 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000478 _Py_NewReference(sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000479 for (i = sv->ob_size; i < newsize; i++)
480 sv->ob_item[i] = NULL;
481 if (last_is_sticky && sizediff > 0) {
482 /* growing: move entries to the end and zero moved entries */
483 for (i = newsize - 1; i >= sizediff; i--) {
484 sv->ob_item[i] = sv->ob_item[i - sizediff];
485 sv->ob_item[i - sizediff] = NULL;
486 }
487 }
488 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000489 return 0;
490}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000491
492void
493PyTuple_Fini()
494{
495#if MAXSAVESIZE > 0
496 int i;
497
498 Py_XDECREF(free_tuples[0]);
499 free_tuples[0] = NULL;
500
501 for (i = 1; i < MAXSAVESIZE; i++) {
502 PyTupleObject *p, *q;
503 p = free_tuples[i];
504 free_tuples[i] = NULL;
505 while (p) {
506 q = p;
507 p = (PyTupleObject *)(p->ob_item[0]);
508 PyMem_DEL(q);
509 }
510 }
511#endif
512}