blob: 8e05e865129a8f7838e84771b19319c726d73060 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Tuple object implementation */
12
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
Guido van Rossum5ce78f82000-04-21 21:15:05 +000015/* Speed optimization to avoid frequent malloc/free of small tuples */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000016#ifndef MAXSAVESIZE
Guido van Rossum5ce78f82000-04-21 21:15:05 +000017#define MAXSAVESIZE 20 /* Largest tuple to save on free list */
18#endif
19#ifndef MAXSAVEDTUPLES
20#define MAXSAVEDTUPLES 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000021#endif
22
23#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +000024/* Entries 1 up to MAXSAVESIZE are free lists, entry 0 is the empty
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000025 tuple () of which at most one instance will be allocated.
26*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +000027static PyTupleObject *free_tuples[MAXSAVESIZE];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000028static int num_free_tuples[MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000029#endif
30#ifdef COUNT_ALLOCS
31int fast_tuple_allocs;
32int tuple_zero_allocs;
33#endif
34
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035PyObject *
Fred Drakeba096332000-07-09 07:04:36 +000036PyTuple_New(register int size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037{
38 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000039 register PyTupleObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042 return NULL;
43 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000044#if MAXSAVESIZE > 0
Sjoerd Mullender615194a1993-11-01 13:46:50 +000045 if (size == 0 && free_tuples[0]) {
46 op = free_tuples[0];
Guido van Rossumc0b618a1997-05-02 03:12:38 +000047 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000048#ifdef COUNT_ALLOCS
49 tuple_zero_allocs++;
50#endif
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 return (PyObject *) op;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000052 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000053 if (0 < size && size < MAXSAVESIZE &&
54 (op = free_tuples[size]) != NULL)
55 {
56 free_tuples[size] = (PyTupleObject *) op->ob_item[0];
Guido van Rossum5ce78f82000-04-21 21:15:05 +000057 num_free_tuples[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000058#ifdef COUNT_ALLOCS
59 fast_tuple_allocs++;
60#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000061 /* PyObject_InitVar is inlined */
Guido van Rossum68055ce1998-12-11 14:56:38 +000062#ifdef Py_TRACE_REFS
Guido van Rossum68055ce1998-12-11 14:56:38 +000063 op->ob_size = size;
Guido van Rossumb18618d2000-05-03 23:44:39 +000064 op->ob_type = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +000065#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +000066 _Py_NewReference((PyObject *)op);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +000067 }
68 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000069#endif
70 {
Guido van Rossum5bc51f21999-07-12 23:06:58 +000071 int nbytes = size * sizeof(PyObject *);
72 /* Check for overflow */
73 if (nbytes / sizeof(PyObject *) != (size_t)size ||
Jeremy Hyltond08b4c42000-06-23 19:37:02 +000074 (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000075 + PyGC_HEAD_SIZE)
Guido van Rossum5bc51f21999-07-12 23:06:58 +000076 <= 0)
77 {
78 return PyErr_NoMemory();
79 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000080 /* PyObject_NewVar is inlined */
81 op = (PyTupleObject *) PyObject_MALLOC(nbytes);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000082 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000083 return PyErr_NoMemory();
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000084 op = (PyTupleObject *) PyObject_FROM_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +000085 PyObject_INIT_VAR(op, &PyTuple_Type, size);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000086 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 for (i = 0; i < size; i++)
88 op->ob_item[i] = NULL;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000089#if MAXSAVESIZE > 0
90 if (size == 0) {
Sjoerd Mullender615194a1993-11-01 13:46:50 +000091 free_tuples[0] = op;
Guido van Rossum5ce78f82000-04-21 21:15:05 +000092 ++num_free_tuples[0];
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
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +000096 PyObject_GC_Init(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000097 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098}
99
100int
Fred Drakeba096332000-07-09 07:04:36 +0000101PyTuple_Size(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 *
Fred Drakeba096332000-07-09 07:04:36 +0000112PyTuple_GetItem(register PyObject *op, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000113{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 if (!PyTuple_Check(op)) {
115 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 return NULL;
117 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
119 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 return NULL;
121 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123}
124
125int
Fred Drakeba096332000-07-09 07:04:36 +0000126PyTuple_SetItem(register PyObject *op, register int i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128 register PyObject *olditem;
129 register PyObject **p;
Guido van Rossum787bdd31997-08-17 16:25:45 +0000130 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 Py_XDECREF(newitem);
132 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000133 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000135 if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
136 Py_XDECREF(newitem);
137 PyErr_SetString(PyExc_IndexError,
138 "tuple assignment index out of range");
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 p = ((PyTupleObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000142 olditem = *p;
143 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000144 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145 return 0;
146}
147
148/* Methods */
149
150static void
Fred Drakeba096332000-07-09 07:04:36 +0000151tupledealloc(register PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000152{
153 register int i;
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000154 register int len = op->ob_size;
Guido van Rossumd724b232000-03-13 16:01:29 +0000155 Py_TRASHCAN_SAFE_BEGIN(op)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000156 PyObject_GC_Fini(op);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000157 if (len > 0) {
158 i = len;
Guido van Rossum1bb26871998-06-26 15:53:50 +0000159 while (--i >= 0)
160 Py_XDECREF(op->ob_item[i]);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000161#if MAXSAVESIZE > 0
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000162 if (len < MAXSAVESIZE && num_free_tuples[len] < MAXSAVEDTUPLES) {
163 op->ob_item[0] = (PyObject *) free_tuples[len];
164 num_free_tuples[len]++;
165 free_tuples[len] = op;
Guido van Rossumd724b232000-03-13 16:01:29 +0000166 goto done; /* return */
Guido van Rossum1bb26871998-06-26 15:53:50 +0000167 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000168#endif
Guido van Rossum1bb26871998-06-26 15:53:50 +0000169 }
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000170 op = (PyTupleObject *) PyObject_AS_GC(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000171 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000172done:
173 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174}
175
Guido van Rossum49e85141991-06-07 22:59:30 +0000176static int
Fred Drakeba096332000-07-09 07:04:36 +0000177tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178{
179 int i;
180 fprintf(fp, "(");
Guido van Rossum49e85141991-06-07 22:59:30 +0000181 for (i = 0; i < op->ob_size; i++) {
182 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000183 fprintf(fp, ", ");
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184 if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
Guido van Rossum49e85141991-06-07 22:59:30 +0000185 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186 }
187 if (op->ob_size == 1)
188 fprintf(fp, ",");
189 fprintf(fp, ")");
Guido van Rossum49e85141991-06-07 22:59:30 +0000190 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191}
192
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000193static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000194tuplerepr(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
Fred Drakeba096332000-07-09 07:04:36 +0000213tuplecompare(register PyTupleObject *v, register PyTupleObject *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
Fred Drakeba096332000-07-09 07:04:36 +0000227tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000228{
229 register long x, y;
230 register int len = v->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 register PyObject **p;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000232 x = 0x345678L;
233 p = v->ob_item;
234 while (--len >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 y = PyObject_Hash(*p++);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000236 if (y == -1)
237 return -1;
Guido van Rossum0969ad21996-12-16 17:55:46 +0000238 x = (1000003*x) ^ y;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000239 }
240 x ^= v->ob_size;
241 if (x == -1)
242 x = -2;
243 return x;
244}
245
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246static int
Fred Drakeba096332000-07-09 07:04:36 +0000247tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248{
249 return a->ob_size;
250}
251
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000252static int
Fred Drakeba096332000-07-09 07:04:36 +0000253tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000254{
255 int i, cmp;
256
257 for (i = 0; i < a->ob_size; ++i) {
258 cmp = PyObject_Compare(el, PyTuple_GET_ITEM(a, i));
259 if (cmp == 0)
260 return 1;
261 if (PyErr_Occurred())
262 return -1;
263 }
264 return 0;
265}
266
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000268tupleitem(register PyTupleObject *a, register int i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269{
270 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000271 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272 return NULL;
273 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000274 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 return a->ob_item[i];
276}
277
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000278static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000279tupleslice(register PyTupleObject *a, register int ilow, register int ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000281 register PyTupleObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282 register int i;
283 if (ilow < 0)
284 ilow = 0;
285 if (ihigh > a->ob_size)
286 ihigh = a->ob_size;
287 if (ihigh < ilow)
288 ihigh = ilow;
289 if (ilow == 0 && ihigh == a->ob_size) {
290 /* XXX can only do this if tuples are immutable! */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291 Py_INCREF(a);
292 return (PyObject *)a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 np = (PyTupleObject *)PyTuple_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295 if (np == NULL)
296 return NULL;
297 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000298 PyObject *v = a->ob_item[i];
299 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 np->ob_item[i - ilow] = v;
301 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303}
304
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000306PyTuple_GetSlice(PyObject *op, int i, int j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000307{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000308 if (op == NULL || !PyTuple_Check(op)) {
309 PyErr_BadInternalCall();
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000310 return NULL;
311 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000312 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000313}
314
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000316tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317{
318 register int size;
319 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 PyTupleObject *np;
321 if (!PyTuple_Check(bb)) {
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000322 PyErr_Format(PyExc_TypeError,
Marc-André Lemburg29dc3812000-06-16 17:05:57 +0000323 "can only concatenate tuple (not \"%.200s\") to tuple",
Fred Drakeb6a9ada2000-06-01 03:12:13 +0000324 bb->ob_type->tp_name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325 return NULL;
326 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327#define b ((PyTupleObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 if (np == NULL) {
Guido van Rossum49e85141991-06-07 22:59:30 +0000331 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332 }
333 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000334 PyObject *v = a->ob_item[i];
335 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 np->ob_item[i] = v;
337 }
338 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 PyObject *v = b->ob_item[i];
340 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 np->ob_item[i + a->ob_size] = v;
342 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344#undef b
345}
346
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000348tuplerepeat(PyTupleObject *a, int n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000349{
350 int i, j;
351 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 PyTupleObject *np;
353 PyObject **p;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000354 if (n < 0)
355 n = 0;
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000356 if (a->ob_size == 0 || n == 1) {
Guido van Rossumb8393da1991-06-04 19:35:24 +0000357 /* Since tuples are immutable, we can return a shared
358 copy in this case */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 Py_INCREF(a);
360 return (PyObject *)a;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000361 }
362 size = a->ob_size * n;
Guido van Rossum0eb55ac1999-07-13 05:41:12 +0000363 if (size/a->ob_size != n)
Guido van Rossum5bc51f21999-07-12 23:06:58 +0000364 return PyErr_NoMemory();
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000366 if (np == NULL)
367 return NULL;
368 p = np->ob_item;
369 for (i = 0; i < n; i++) {
370 for (j = 0; j < a->ob_size; j++) {
371 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 Py_INCREF(*p);
Guido van Rossumb8393da1991-06-04 19:35:24 +0000373 p++;
374 }
375 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000376 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000377}
378
Jeremy Hylton8caad492000-06-23 14:18:11 +0000379static int
380tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
381{
382 int i, err;
383 PyObject *x;
384
385 for (i = o->ob_size; --i >= 0; ) {
386 x = o->ob_item[i];
387 if (x != NULL) {
388 err = visit(x, arg);
389 if (err)
390 return err;
391 }
392 }
393 return 0;
394}
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*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000404 (objobjproc)tuplecontains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405};
406
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407PyTypeObject PyTuple_Type = {
408 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000409 0,
410 "tuple",
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000411 sizeof(PyTupleObject) - sizeof(PyObject *) + PyGC_HEAD_SIZE,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412 sizeof(PyObject *),
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000413 (destructor)tupledealloc, /*tp_dealloc*/
414 (printfunc)tupleprint, /*tp_print*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415 0, /*tp_getattr*/
416 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000417 (cmpfunc)tuplecompare, /*tp_compare*/
418 (reprfunc)tuplerepr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419 0, /*tp_as_number*/
420 &tuple_as_sequence, /*tp_as_sequence*/
421 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000422 (hashfunc)tuplehash, /*tp_hash*/
Fred Drake56780252000-06-15 14:50:20 +0000423 0, /*tp_call*/
424 0, /*tp_str*/
425 0, /*tp_getattro*/
426 0, /*tp_setattro*/
427 0, /*tp_as_buffer*/
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000428 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Jeremy Hylton8caad492000-06-23 14:18:11 +0000429 0, /*tp_doc*/
430 (traverseproc)tupletraverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000432
433/* The following function breaks the notion that tuples are immutable:
434 it changes the size of a tuple. We get away with this only if there
435 is only one module referencing the object. You can also think of it
436 as creating a new tuple object and destroying the old one, only
437 more efficiently. In any case, don't use this if the tuple may
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000438 already be known to some other part of the code...
439 If last_is_sticky is set, the tuple will grow or shrink at the
440 front, otherwise it will grow or shrink at the end. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000441
442int
Fred Drakeba096332000-07-09 07:04:36 +0000443_PyTuple_Resize(PyObject **pv, int newsize, int last_is_sticky)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000444{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000445 register PyTupleObject *v;
446 register PyTupleObject *sv;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000447 int i;
448 int sizediff;
449
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000450 v = (PyTupleObject *) *pv;
451 if (v == NULL || !PyTuple_Check(v) || v->ob_refcnt != 1) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000452 *pv = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 Py_DECREF(v);
454 PyErr_BadInternalCall();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000455 return -1;
456 }
Guido van Rossum055968c1995-08-04 04:05:10 +0000457 sizediff = newsize - v->ob_size;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000458 if (sizediff == 0)
459 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000460 /* XXX UNREF/NEWREF interface should be more symmetrical */
Guido van Rossum441e4ab1996-05-23 22:46:51 +0000461#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000462 --_Py_RefTotal;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000463#endif
Guido van Rossumbffd6832000-01-20 22:32:56 +0000464 _Py_ForgetReference((PyObject *)v);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000465 if (last_is_sticky && sizediff < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000466 /* shrinking:
467 move entries to the front and zero moved entries */
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000468 for (i = 0; i < newsize; 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] = v->ob_item[i - sizediff];
471 v->ob_item[i - sizediff] = NULL;
472 }
473 }
474 for (i = newsize; i < v->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 Py_XDECREF(v->ob_item[i]);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000476 v->ob_item[i] = NULL;
477 }
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000478#if MAXSAVESIZE > 0
479 if (newsize == 0 && free_tuples[0]) {
480 num_free_tuples[0]--;
481 sv = free_tuples[0];
482 sv->ob_size = 0;
483 Py_INCREF(sv);
484#ifdef COUNT_ALLOCS
485 tuple_zero_allocs++;
486#endif
487 tupledealloc(v);
488 *pv = (PyObject*) sv;
489 return 0;
490 }
491 if (0 < newsize && newsize < MAXSAVESIZE &&
492 (sv = free_tuples[newsize]) != NULL)
493 {
494 free_tuples[newsize] = (PyTupleObject *) sv->ob_item[0];
495 num_free_tuples[newsize]--;
496#ifdef COUNT_ALLOCS
497 fast_tuple_allocs++;
498#endif
499#ifdef Py_TRACE_REFS
500 sv->ob_type = &PyTuple_Type;
501#endif
502 for (i = 0; i < newsize; ++i){
503 sv->ob_item[i] = v->ob_item[i];
504 v->ob_item[i] = NULL;
505 }
506 sv->ob_size = v->ob_size;
507 tupledealloc(v);
508 *pv = (PyObject *) sv;
509 } else
510#endif
511 {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000512#ifdef WITH_CYCLE_GC
513 PyGC_Head *g = PyObject_AS_GC((PyObject *)v);
514 PyObject_GC_Fini((PyObject *)v);
515 sv = (PyTupleObject *)
516 PyObject_REALLOC((char *)g, sizeof(PyTupleObject)
517 + PyGC_HEAD_SIZE
518 + newsize * sizeof(PyObject *));
519 if (g == NULL) {
520 sv = NULL;
521 } else {
522 sv = (PyTupleObject *)PyObject_FROM_GC(g);
523 }
524#else
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000525 sv = (PyTupleObject *)
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000526 PyObject_REALLOC((char *)v, sizeof(PyTupleObject)
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000527 + PyGC_HEAD_SIZE
Jeremy Hyltond08b4c42000-06-23 19:37:02 +0000528 + newsize * sizeof(PyObject *));
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000529#endif
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000530 *pv = (PyObject *) sv;
531 if (sv == NULL) {
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000532 PyObject_GC_Init((PyObject *)v);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000533 v = (PyTupleObject *) PyObject_AS_GC(v);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000534 PyObject_DEL(v);
Guido van Rossum5ce78f82000-04-21 21:15:05 +0000535 PyErr_NoMemory();
536 return -1;
537 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000538 }
Guido van Rossumbffd6832000-01-20 22:32:56 +0000539 _Py_NewReference((PyObject *)sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000540 for (i = sv->ob_size; i < newsize; i++)
541 sv->ob_item[i] = NULL;
542 if (last_is_sticky && sizediff > 0) {
543 /* growing: move entries to the end and zero moved entries */
544 for (i = newsize - 1; i >= sizediff; i--) {
545 sv->ob_item[i] = sv->ob_item[i - sizediff];
546 sv->ob_item[i - sizediff] = NULL;
547 }
548 }
Jeremy Hyltonc5007aa2000-06-30 05:02:53 +0000549 PyObject_GC_Init(sv);
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000550 sv->ob_size = newsize;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000551 return 0;
552}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000553
554void
Fred Drakeba096332000-07-09 07:04:36 +0000555PyTuple_Fini(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000556{
557#if MAXSAVESIZE > 0
558 int i;
559
560 Py_XDECREF(free_tuples[0]);
561 free_tuples[0] = NULL;
562
563 for (i = 1; i < MAXSAVESIZE; i++) {
564 PyTupleObject *p, *q;
565 p = free_tuples[i];
566 free_tuples[i] = NULL;
567 while (p) {
568 q = p;
569 p = (PyTupleObject *)(p->ob_item[0]);
Guido van Rossum4cc6ac72000-07-01 01:00:38 +0000570 q = (PyTupleObject *) PyObject_AS_GC(q);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000571 PyObject_DEL(q);
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000572 }
573 }
574#endif
575}