blob: 5112468d95c0e344d25da45a733c7cfcfe05d2bd [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 Rossumbffd6832000-01-20 22:32:56 +0000103 _Py_NewReference((PyObject *)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
Guido van Rossumd724b232000-03-13 16:01:29 +0000175 Py_TRASHCAN_SAFE_BEGIN(op)
Guido van Rossum1bb26871998-06-26 15:53:50 +0000176 if (op->ob_size > 0) {
177 i = op->ob_size;
178 while (--i >= 0)
179 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000180#if MAXSAVESIZE > 0
Guido van Rossum1bb26871998-06-26 15:53:50 +0000181 if (op->ob_size < MAXSAVESIZE) {
182 op->ob_item[0] = (PyObject *) free_tuples[op->ob_size];
183 free_tuples[op->ob_size] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000184 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000185 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000186#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000187 }
188 free((ANY *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000189done:
190 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191}
192
Guido van Rossum49e85141991-06-07 22:59:30 +0000193static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194tupleprint(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196 FILE *fp;
197 int flags;
198{
199 int i;
200 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000201 for (i = 0; i < op->ob_size; i++) {
202 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000205 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206 }
207 if (op->ob_size == 1)
208 fprintf(fp, ",");
209 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000210 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211}
212
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214tuplerepr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 PyTupleObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219 s = PyString_FromString("(");
220 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000221 for (i = 0; i < v->ob_size && s != NULL; i++) {
222 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223 PyString_Concat(&s, comma);
224 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 Py_DECREF(comma);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000227 if (v->ob_size == 1)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228 PyString_ConcatAndDel(&s, PyString_FromString(","));
229 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 return s;
231}
232
233static int
234tuplecompare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 register PyTupleObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236{
237 register int len =
238 (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
239 register int i;
240 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 if (cmp != 0)
243 return cmp;
244 }
245 return v->ob_size - w->ob_size;
246}
247
Guido van Rossum9bfef441993-03-29 10:43:31 +0000248static long
249tuplehash(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000250 PyTupleObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000251{
252 register long x, y;
253 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000255 x = 0x345678L;
256 p = v->ob_item;
257 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000258 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000259 if (y == -1)
260 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000261 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000262 }
263 x ^= v->ob_size;
264 if (x == -1)
265 x = -2;
266 return x;
267}
268
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269static int
270tuplelength(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000271 PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272{
273 return a->ob_size;
274}
275
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277tupleitem(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000278 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 register int i;
280{
281 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 return NULL;
284 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 return a->ob_item[i];
287}
288
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290tupleslice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291 register PyTupleObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292 register int ilow, ihigh;
293{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295 register int i;
296 if (ilow < 0)
297 ilow = 0;
298 if (ihigh > a->ob_size)
299 ihigh = a->ob_size;
300 if (ihigh < ilow)
301 ihigh = ilow;
302 if (ilow == 0 && ihigh == a->ob_size) {
303 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304 Py_INCREF(a);
305 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000307 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 if (np == NULL)
309 return NULL;
310 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 PyObject *v = a->ob_item[i];
312 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 np->ob_item[i - ilow] = v;
314 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316}
317
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318PyObject *
319PyTuple_GetSlice(op, i, j)
320 PyObject *op;
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000321 int i, j;
322{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 if (op == NULL || !PyTuple_Check(op)) {
324 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000325 return NULL;
326 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000328}
329
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331tupleconcat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332 register PyTupleObject *a;
333 register PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334{
335 register int size;
336 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000337 PyTupleObject *np;
338 if (!PyTuple_Check(bb)) {
339 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340 return NULL;
341 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000342#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000346 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 }
348 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 PyObject *v = a->ob_item[i];
350 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351 np->ob_item[i] = v;
352 }
353 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000354 PyObject *v = b->ob_item[i];
355 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356 np->ob_item[i + a->ob_size] = v;
357 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359#undef b
360}
361
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000362static PyObject *
Guido van Rossumb8393da1991-06-04 19:35:24 +0000363tuplerepeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000364 PyTupleObject *a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000365 int n;
366{
367 int i, j;
368 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000369 PyTupleObject *np;
370 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000371 if (n < 0)
372 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000373 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000374 /* Since tuples are immutable, we can return a shared
375 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 Py_INCREF(a);
377 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000378 }
379 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000380 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000381 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000383 if (np == NULL)
384 return NULL;
385 p = np->ob_item;
386 for (i = 0; i < n; i++) {
387 for (j = 0; j < a->ob_size; j++) {
388 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000390 p++;
391 }
392 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000394}
395
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396static PySequenceMethods tuple_as_sequence = {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000397 (inquiry)tuplelength, /*sq_length*/
398 (binaryfunc)tupleconcat, /*sq_concat*/
399 (intargfunc)tuplerepeat, /*sq_repeat*/
400 (intargfunc)tupleitem, /*sq_item*/
401 (intintargfunc)tupleslice, /*sq_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000402 0, /*sq_ass_item*/
403 0, /*sq_ass_slice*/
404};
405
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406PyTypeObject PyTuple_Type = {
407 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408 0,
409 "tuple",
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 sizeof(PyTupleObject) - sizeof(PyObject *),
411 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000412 (destructor)tupledealloc, /*tp_dealloc*/
413 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414 0, /*tp_getattr*/
415 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000416 (cmpfunc)tuplecompare, /*tp_compare*/
417 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418 0, /*tp_as_number*/
419 &tuple_as_sequence, /*tp_as_sequence*/
420 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000421 (hashfunc)tuplehash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000423
424/* The following function breaks the notion that tuples are immutable:
425 it changes the size of a tuple. We get away with this only if there
426 is only one module referencing the object. You can also think of it
427 as creating a new tuple object and destroying the old one, only
428 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000429 already be known to some other part of the code...
430 If last_is_sticky is set, the tuple will grow or shrink at the
431 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000432
433int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434_PyTuple_Resize(pv, newsize, last_is_sticky)
435 PyObject **pv;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000436 int newsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000437 int last_is_sticky;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000438{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439 register PyTupleObject *v;
440 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000441 int i;
442 int sizediff;
443
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 v = (PyTupleObject *) *pv;
445 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000446 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000447 Py_DECREF(v);
448 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000449 return -1;
450 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000451 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000452 if (sizediff == 0)
453 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000454 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000455#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000456 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000457#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000458 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000459 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 /* shrinking:
461 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000462 for (i = 0; i < newsize; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000463 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000464 v->ob_item[i] = v->ob_item[i - sizediff];
465 v->ob_item[i - sizediff] = NULL;
466 }
467 }
468 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000469 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000470 v->ob_item[i] = NULL;
471 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472 sv = (PyTupleObject *)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000473 realloc((char *)v,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 sizeof(PyTupleObject) + newsize * sizeof(PyObject *));
475 *pv = (PyObject *) sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000476 if (sv == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 PyMem_DEL(v);
478 PyErr_NoMemory();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000479 return -1;
480 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000481 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000482 for (i = sv->ob_size; i < newsize; i++)
483 sv->ob_item[i] = NULL;
484 if (last_is_sticky && sizediff > 0) {
485 /* growing: move entries to the end and zero moved entries */
486 for (i = newsize - 1; i >= sizediff; i--) {
487 sv->ob_item[i] = sv->ob_item[i - sizediff];
488 sv->ob_item[i - sizediff] = NULL;
489 }
490 }
491 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000492 return 0;
493}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000494
495void
496PyTuple_Fini()
497{
498#if MAXSAVESIZE > 0
499 int i;
500
501 Py_XDECREF(free_tuples[0]);
502 free_tuples[0] = NULL;
503
504 for (i = 1; i < MAXSAVESIZE; i++) {
505 PyTupleObject *p, *q;
506 p = free_tuples[i];
507 free_tuples[i] = NULL;
508 while (p) {
509 q = p;
510 p = (PyTupleObject *)(p->ob_item[0]);
511 PyMem_DEL(q);
512 }
513 }
514#endif
515}