tupleobject.c 19.8 KB
Newer Older
1

Guido van Rossum's avatar
Guido van Rossum committed
2 3
/* Tuple object implementation */

4
#include "Python.h"
Guido van Rossum's avatar
Guido van Rossum committed
5

6
/* Speed optimization to avoid frequent malloc/free of small tuples */
7
#ifndef MAXSAVESIZE
8 9 10 11
#define MAXSAVESIZE	20  /* Largest tuple to save on free list */
#endif
#ifndef MAXSAVEDTUPLES 
#define MAXSAVEDTUPLES  2000  /* Maximum number of tuples of each size to save */
12 13 14
#endif

#if MAXSAVESIZE > 0
15
/* Entries 1 up to MAXSAVESIZE are free lists, entry 0 is the empty
16 17
   tuple () of which at most one instance will be allocated.
*/
18
static PyTupleObject *free_tuples[MAXSAVESIZE];
19
static int num_free_tuples[MAXSAVESIZE];
20 21 22 23 24 25
#endif
#ifdef COUNT_ALLOCS
int fast_tuple_allocs;
int tuple_zero_allocs;
#endif

26
PyObject *
Martin v. Löwis's avatar
Martin v. Löwis committed
27
PyTuple_New(register Py_ssize_t size)
Guido van Rossum's avatar
Guido van Rossum committed
28
{
29
	register PyTupleObject *op;
Martin v. Löwis's avatar
Martin v. Löwis committed
30
	Py_ssize_t i;
Guido van Rossum's avatar
Guido van Rossum committed
31
	if (size < 0) {
32
		PyErr_BadInternalCall();
Guido van Rossum's avatar
Guido van Rossum committed
33 34
		return NULL;
	}
35
#if MAXSAVESIZE > 0
36 37
	if (size == 0 && free_tuples[0]) {
		op = free_tuples[0];
38
		Py_INCREF(op);
39 40 41
#ifdef COUNT_ALLOCS
		tuple_zero_allocs++;
#endif
42
		return (PyObject *) op;
43
	}
44
	if (size < MAXSAVESIZE && (op = free_tuples[size]) != NULL) {
45
		free_tuples[size] = (PyTupleObject *) op->ob_item[0];
46
		num_free_tuples[size]--;
47 48
#ifdef COUNT_ALLOCS
		fast_tuple_allocs++;
49
#endif
50
		/* Inline PyObject_InitVar */
51 52
#ifdef Py_TRACE_REFS
		op->ob_size = size;
53
		op->ob_type = &PyTuple_Type;
54
#endif
55
		_Py_NewReference((PyObject *)op);
56 57
	}
	else
58 59
#endif
	{
Martin v. Löwis's avatar
Martin v. Löwis committed
60
		Py_ssize_t nbytes = size * sizeof(PyObject *);
61 62
		/* Check for overflow */
		if (nbytes / sizeof(PyObject *) != (size_t)size ||
Neil Schemenauer's avatar
Neil Schemenauer committed
63
		    (nbytes += sizeof(PyTupleObject) - sizeof(PyObject *))
64 65 66 67
		    <= 0)
		{
			return PyErr_NoMemory();
		}
Neil Schemenauer's avatar
Neil Schemenauer committed
68
		op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
69
		if (op == NULL)
Neil Schemenauer's avatar
Neil Schemenauer committed
70
			return NULL;
71
	}
Armin Rigo's avatar
Armin Rigo committed
72 73
	for (i=0; i < size; i++)
		op->ob_item[i] = NULL;
74 75
#if MAXSAVESIZE > 0
	if (size == 0) {
76
		free_tuples[0] = op;
77
		++num_free_tuples[0];
78
		Py_INCREF(op);	/* extra INCREF so that this is never freed */
79 80
	}
#endif
Neil Schemenauer's avatar
Neil Schemenauer committed
81
	_PyObject_GC_TRACK(op);
82
	return (PyObject *) op;
Guido van Rossum's avatar
Guido van Rossum committed
83 84
}

Martin v. Löwis's avatar
Martin v. Löwis committed
85
Py_ssize_t
86
PyTuple_Size(register PyObject *op)
Guido van Rossum's avatar
Guido van Rossum committed
87
{
88 89
	if (!PyTuple_Check(op)) {
		PyErr_BadInternalCall();
Guido van Rossum's avatar
Guido van Rossum committed
90 91 92
		return -1;
	}
	else
93
		return ((PyTupleObject *)op)->ob_size;
Guido van Rossum's avatar
Guido van Rossum committed
94 95
}

96
PyObject *
Martin v. Löwis's avatar
Martin v. Löwis committed
97
PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
Guido van Rossum's avatar
Guido van Rossum committed
98
{
99 100
	if (!PyTuple_Check(op)) {
		PyErr_BadInternalCall();
Guido van Rossum's avatar
Guido van Rossum committed
101 102
		return NULL;
	}
103 104
	if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
		PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum's avatar
Guido van Rossum committed
105 106
		return NULL;
	}
107
	return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum's avatar
Guido van Rossum committed
108 109 110
}

int
Martin v. Löwis's avatar
Martin v. Löwis committed
111
PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
Guido van Rossum's avatar
Guido van Rossum committed
112
{
113 114
	register PyObject *olditem;
	register PyObject **p;
115
	if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
116 117
		Py_XDECREF(newitem);
		PyErr_BadInternalCall();
Guido van Rossum's avatar
Guido van Rossum committed
118
		return -1;
Guido van Rossum's avatar
Guido van Rossum committed
119
	}
120 121 122 123
	if (i < 0 || i >= ((PyTupleObject *)op) -> ob_size) {
		Py_XDECREF(newitem);
		PyErr_SetString(PyExc_IndexError,
				"tuple assignment index out of range");
Guido van Rossum's avatar
Guido van Rossum committed
124
		return -1;
Guido van Rossum's avatar
Guido van Rossum committed
125
	}
126
	p = ((PyTupleObject *)op) -> ob_item + i;
127 128
	olditem = *p;
	*p = newitem;
129
	Py_XDECREF(olditem);
Guido van Rossum's avatar
Guido van Rossum committed
130 131 132
	return 0;
}

133
PyObject *
Martin v. Löwis's avatar
Martin v. Löwis committed
134
PyTuple_Pack(Py_ssize_t n, ...)
135
{
Martin v. Löwis's avatar
Martin v. Löwis committed
136
	Py_ssize_t i;
137 138
	PyObject *o;
	PyObject *result;
139
	PyObject **items;
140 141 142 143 144 145
	va_list vargs;

	va_start(vargs, n);
	result = PyTuple_New(n);
	if (result == NULL)
		return NULL;
146
	items = ((PyTupleObject *)result)->ob_item;
147 148 149
	for (i = 0; i < n; i++) {
		o = va_arg(vargs, PyObject *);
		Py_INCREF(o);
150
		items[i] = o;
151 152 153 154 155 156
	}
	va_end(vargs);
	return result;
}


Guido van Rossum's avatar
Guido van Rossum committed
157 158 159
/* Methods */

static void
160
tupledealloc(register PyTupleObject *op)
Guido van Rossum's avatar
Guido van Rossum committed
161
{
Martin v. Löwis's avatar
Martin v. Löwis committed
162 163
	register Py_ssize_t i;
	register Py_ssize_t len =  op->ob_size;
164
	PyObject_GC_UnTrack(op);
165
	Py_TRASHCAN_SAFE_BEGIN(op)
166 167
	if (len > 0) {
		i = len;
Armin Rigo's avatar
Armin Rigo committed
168 169
		while (--i >= 0)
			Py_XDECREF(op->ob_item[i]);
170
#if MAXSAVESIZE > 0
171 172 173 174
		if (len < MAXSAVESIZE &&
		    num_free_tuples[len] < MAXSAVEDTUPLES &&
		    op->ob_type == &PyTuple_Type)
		{
175 176 177
			op->ob_item[0] = (PyObject *) free_tuples[len];
			num_free_tuples[len]++;
			free_tuples[len] = op;
178
			goto done; /* return */
179
		}
180
#endif
181
	}
182
	op->ob_type->tp_free((PyObject *)op);
183 184
done:
	Py_TRASHCAN_SAFE_END(op)
Guido van Rossum's avatar
Guido van Rossum committed
185 186
}

187
static int
188
tupleprint(PyTupleObject *op, FILE *fp, int flags)
Guido van Rossum's avatar
Guido van Rossum committed
189
{
Martin v. Löwis's avatar
Martin v. Löwis committed
190
	Py_ssize_t i;
Guido van Rossum's avatar
Guido van Rossum committed
191
	fprintf(fp, "(");
192 193
	for (i = 0; i < op->ob_size; i++) {
		if (i > 0)
Guido van Rossum's avatar
Guido van Rossum committed
194
			fprintf(fp, ", ");
195
		if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
196
			return -1;
Guido van Rossum's avatar
Guido van Rossum committed
197 198 199 200
	}
	if (op->ob_size == 1)
		fprintf(fp, ",");
	fprintf(fp, ")");
201
	return 0;
Guido van Rossum's avatar
Guido van Rossum committed
202 203
}

204
static PyObject *
205
tuplerepr(PyTupleObject *v)
Guido van Rossum's avatar
Guido van Rossum committed
206
{
Martin v. Löwis's avatar
Martin v. Löwis committed
207
	Py_ssize_t i, n;
208 209 210 211 212
	PyObject *s, *temp;
	PyObject *pieces, *result = NULL;

	n = v->ob_size;
	if (n == 0)
213
		return PyUnicode_FromString("()");
214 215 216 217 218 219 220 221 222 223 224

	pieces = PyTuple_New(n);
	if (pieces == NULL)
		return NULL;

	/* Do repr() on each element. */
	for (i = 0; i < n; ++i) {
		s = PyObject_Repr(v->ob_item[i]);
		if (s == NULL)
			goto Done;
		PyTuple_SET_ITEM(pieces, i, s);
Guido van Rossum's avatar
Guido van Rossum committed
225
	}
226 227 228

	/* Add "()" decorations to the first and last items. */
	assert(n > 0);
229
	s = PyUnicode_FromString("(");
230 231 232
	if (s == NULL)
		goto Done;
	temp = PyTuple_GET_ITEM(pieces, 0);
233
	PyUnicode_AppendAndDel(&s, temp);
234 235 236 237
	PyTuple_SET_ITEM(pieces, 0, s);
	if (s == NULL)
		goto Done;

238
	s = PyUnicode_FromString(n == 1 ? ",)" : ")");
239 240 241
	if (s == NULL)
		goto Done;
	temp = PyTuple_GET_ITEM(pieces, n-1);
242
	PyUnicode_AppendAndDel(&temp, s);
243 244 245 246 247
	PyTuple_SET_ITEM(pieces, n-1, temp);
	if (temp == NULL)
		goto Done;

	/* Paste them all together with ", " between. */
248
	s = PyUnicode_FromString(", ");
249 250
	if (s == NULL)
		goto Done;
251
	result = PyUnicode_Join(s, pieces);
252 253 254 255 256
	Py_DECREF(s);	

Done:
	Py_DECREF(pieces);
	return result;
Guido van Rossum's avatar
Guido van Rossum committed
257 258
}

259 260 261 262 263 264 265 266
/* The addend 82520, was selected from the range(0, 1000000) for 
   generating the greatest number of prime multipliers for tuples 
   upto length eight:

     1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533, 
     1330111, 1412633, 1165069, 1247599, 1495177, 1577699
*/

267
static long
268
tuplehash(PyTupleObject *v)
269 270
{
	register long x, y;
Martin v. Löwis's avatar
Martin v. Löwis committed
271
	register Py_ssize_t len = v->ob_size;
272
	register PyObject **p;
273
	long mult = 1000003L;
274 275 276
	x = 0x345678L;
	p = v->ob_item;
	while (--len >= 0) {
277
		y = PyObject_Hash(*p++);
278 279
		if (y == -1)
			return -1;
280
		x = (x ^ y) * mult;
281 282
		/* the cast might truncate len; that doesn't change hash stability */
		mult += (long)(82520L + len + len);
283
	}
284
	x += 97531L;
285 286 287 288 289
	if (x == -1)
		x = -2;
	return x;
}

Martin v. Löwis's avatar
Martin v. Löwis committed
290
static Py_ssize_t
291
tuplelength(PyTupleObject *a)
Guido van Rossum's avatar
Guido van Rossum committed
292 293 294 295
{
	return a->ob_size;
}

296
static int
297
tuplecontains(PyTupleObject *a, PyObject *el)
298
{
Martin v. Löwis's avatar
Martin v. Löwis committed
299 300
	Py_ssize_t i;
	int cmp;
301

302
	for (i = 0, cmp = 0 ; cmp == 0 && i < a->ob_size; ++i)
303
		cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
304
						   Py_EQ);
305
	return cmp;
306 307
}

308
static PyObject *
Martin v. Löwis's avatar
Martin v. Löwis committed
309
tupleitem(register PyTupleObject *a, register Py_ssize_t i)
Guido van Rossum's avatar
Guido van Rossum committed
310 311
{
	if (i < 0 || i >= a->ob_size) {
312
		PyErr_SetString(PyExc_IndexError, "tuple index out of range");
Guido van Rossum's avatar
Guido van Rossum committed
313 314
		return NULL;
	}
315
	Py_INCREF(a->ob_item[i]);
Guido van Rossum's avatar
Guido van Rossum committed
316 317 318
	return a->ob_item[i];
}

319
static PyObject *
Martin v. Löwis's avatar
Martin v. Löwis committed
320 321
tupleslice(register PyTupleObject *a, register Py_ssize_t ilow, 
	   register Py_ssize_t ihigh)
Guido van Rossum's avatar
Guido van Rossum committed
322
{
323
	register PyTupleObject *np;
324
	PyObject **src, **dest;
Martin v. Löwis's avatar
Martin v. Löwis committed
325 326
	register Py_ssize_t i;
	Py_ssize_t len;
Guido van Rossum's avatar
Guido van Rossum committed
327 328 329 330 331 332
	if (ilow < 0)
		ilow = 0;
	if (ihigh > a->ob_size)
		ihigh = a->ob_size;
	if (ihigh < ilow)
		ihigh = ilow;
Tim Peters's avatar
Tim Peters committed
333
	if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
334 335
		Py_INCREF(a);
		return (PyObject *)a;
Guido van Rossum's avatar
Guido van Rossum committed
336
	}
337 338
	len = ihigh - ilow;
	np = (PyTupleObject *)PyTuple_New(len);
Guido van Rossum's avatar
Guido van Rossum committed
339 340
	if (np == NULL)
		return NULL;
341 342 343 344
	src = a->ob_item + ilow;
	dest = np->ob_item;
	for (i = 0; i < len; i++) {
		PyObject *v = src[i];
345
		Py_INCREF(v);
346
		dest[i] = v;
Guido van Rossum's avatar
Guido van Rossum committed
347
	}
348
	return (PyObject *)np;
Guido van Rossum's avatar
Guido van Rossum committed
349 350
}

351
PyObject *
Martin v. Löwis's avatar
Martin v. Löwis committed
352
PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
353
{
354 355
	if (op == NULL || !PyTuple_Check(op)) {
		PyErr_BadInternalCall();
356 357
		return NULL;
	}
358
	return tupleslice((PyTupleObject *)op, i, j);
359 360
}

361
static PyObject *
362
tupleconcat(register PyTupleObject *a, register PyObject *bb)
Guido van Rossum's avatar
Guido van Rossum committed
363
{
Martin v. Löwis's avatar
Martin v. Löwis committed
364 365
	register Py_ssize_t size;
	register Py_ssize_t i;
366
	PyObject **src, **dest;
367 368
	PyTupleObject *np;
	if (!PyTuple_Check(bb)) {
369
		PyErr_Format(PyExc_TypeError,
370
       		     "can only concatenate tuple (not \"%.200s\") to tuple",
371
			     bb->ob_type->tp_name);
Guido van Rossum's avatar
Guido van Rossum committed
372 373
		return NULL;
	}
374
#define b ((PyTupleObject *)bb)
Guido van Rossum's avatar
Guido van Rossum committed
375
	size = a->ob_size + b->ob_size;
376 377
	if (size < 0)
		return PyErr_NoMemory();
378
	np = (PyTupleObject *) PyTuple_New(size);
Guido van Rossum's avatar
Guido van Rossum committed
379
	if (np == NULL) {
380
		return NULL;
Guido van Rossum's avatar
Guido van Rossum committed
381
	}
382 383
	src = a->ob_item;
	dest = np->ob_item;
Guido van Rossum's avatar
Guido van Rossum committed
384
	for (i = 0; i < a->ob_size; i++) {
385
		PyObject *v = src[i];
386
		Py_INCREF(v);
387
		dest[i] = v;
Guido van Rossum's avatar
Guido van Rossum committed
388
	}
389 390
	src = b->ob_item;
	dest = np->ob_item + a->ob_size;
Guido van Rossum's avatar
Guido van Rossum committed
391
	for (i = 0; i < b->ob_size; i++) {
392
		PyObject *v = src[i];
393
		Py_INCREF(v);
394
		dest[i] = v;
Guido van Rossum's avatar
Guido van Rossum committed
395
	}
396
	return (PyObject *)np;
Guido van Rossum's avatar
Guido van Rossum committed
397 398 399
#undef b
}

400
static PyObject *
Martin v. Löwis's avatar
Martin v. Löwis committed
401
tuplerepeat(PyTupleObject *a, Py_ssize_t n)
402
{
Martin v. Löwis's avatar
Martin v. Löwis committed
403 404
	Py_ssize_t i, j;
	Py_ssize_t size;
405
	PyTupleObject *np;
406
	PyObject **p, **items;
407 408
	if (n < 0)
		n = 0;
409
	if (a->ob_size == 0 || n == 1) {
Tim Peters's avatar
Tim Peters committed
410 411 412 413 414 415 416 417
		if (PyTuple_CheckExact(a)) {
			/* Since tuples are immutable, we can return a shared
			   copy in this case */
			Py_INCREF(a);
			return (PyObject *)a;
		}
		if (a->ob_size == 0)
			return PyTuple_New(0);
418 419
	}
	size = a->ob_size * n;
420
	if (size/a->ob_size != n)
421
		return PyErr_NoMemory();
422
	np = (PyTupleObject *) PyTuple_New(size);
423 424 425
	if (np == NULL)
		return NULL;
	p = np->ob_item;
426
	items = a->ob_item;
427 428
	for (i = 0; i < n; i++) {
		for (j = 0; j < a->ob_size; j++) {
429
			*p = items[j];
430
			Py_INCREF(*p);
431 432 433
			p++;
		}
	}
434
	return (PyObject *) np;
435 436
}

437 438 439
static int
tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
{
Martin v. Löwis's avatar
Martin v. Löwis committed
440
	Py_ssize_t i;
441 442 443

	for (i = o->ob_size; --i >= 0; )
		Py_VISIT(o->ob_item[i]);
444 445 446
	return 0;
}

447 448 449 450
static PyObject *
tuplerichcompare(PyObject *v, PyObject *w, int op)
{
	PyTupleObject *vt, *wt;
Martin v. Löwis's avatar
Martin v. Löwis committed
451 452
	Py_ssize_t i;
	Py_ssize_t vlen, wlen;
453 454 455 456 457 458 459 460 461

	if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
		Py_INCREF(Py_NotImplemented);
		return Py_NotImplemented;
	}

	vt = (PyTupleObject *)v;
	wt = (PyTupleObject *)w;

462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
	vlen = vt->ob_size;
	wlen = wt->ob_size;

	/* Note:  the corresponding code for lists has an "early out" test
	 * here when op is EQ or NE and the lengths differ.  That pays there,
	 * but Tim was unable to find any real code where EQ/NE tuple
	 * compares don't have the same length, so testing for it here would
	 * have cost without benefit.
	 */

	/* Search for the first index where items are different.
	 * Note that because tuples are immutable, it's safe to reuse
	 * vlen and wlen across the comparison calls.
	 */
	for (i = 0; i < vlen && i < wlen; i++) {
477 478 479 480 481 482 483 484
		int k = PyObject_RichCompareBool(vt->ob_item[i],
						 wt->ob_item[i], Py_EQ);
		if (k < 0)
			return NULL;
		if (!k)
			break;
	}

485
	if (i >= vlen || i >= wlen) {
486 487 488 489
		/* No more items to compare -- compare sizes */
		int cmp;
		PyObject *res;
		switch (op) {
490 491 492 493 494 495
		case Py_LT: cmp = vlen <  wlen; break;
		case Py_LE: cmp = vlen <= wlen; break;
		case Py_EQ: cmp = vlen == wlen; break;
		case Py_NE: cmp = vlen != wlen; break;
		case Py_GT: cmp = vlen >  wlen; break;
		case Py_GE: cmp = vlen >= wlen; break;
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
		default: return NULL; /* cannot happen */
		}
		if (cmp)
			res = Py_True;
		else
			res = Py_False;
		Py_INCREF(res);
		return res;
	}

	/* We have an item that differs -- shortcuts for EQ/NE */
	if (op == Py_EQ) {
		Py_INCREF(Py_False);
		return Py_False;
	}
	if (op == Py_NE) {
		Py_INCREF(Py_True);
		return Py_True;
	}

	/* Compare the final item again using the proper operator */
	return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
}

520
static PyObject *
521 522
tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);

523 524 525 526
static PyObject *
tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
	PyObject *arg = NULL;
527
	static char *kwlist[] = {"sequence", 0};
528

529 530
	if (type != &PyTuple_Type)
		return tuple_subtype_new(type, args, kwds);
531 532 533 534 535 536 537 538 539
	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
		return NULL;

	if (arg == NULL)
		return PyTuple_New(0);
	else
		return PySequence_Tuple(arg);
}

540 541 542
static PyObject *
tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
543
	PyObject *tmp, *newobj, *item;
Martin v. Löwis's avatar
Martin v. Löwis committed
544
	Py_ssize_t i, n;
545 546 547 548 549 550

	assert(PyType_IsSubtype(type, &PyTuple_Type));
	tmp = tuple_new(&PyTuple_Type, args, kwds);
	if (tmp == NULL)
		return NULL;
	assert(PyTuple_Check(tmp));
551 552
	newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
	if (newobj == NULL)
553 554 555 556
		return NULL;
	for (i = 0; i < n; i++) {
		item = PyTuple_GET_ITEM(tmp, i);
		Py_INCREF(item);
557
		PyTuple_SET_ITEM(newobj, i, item);
558 559
	}
	Py_DECREF(tmp);
560
	return newobj;
561 562
}

563
PyDoc_STRVAR(tuple_doc,
564 565 566
"tuple() -> an empty tuple\n"
"tuple(sequence) -> tuple initialized from sequence's items\n"
"\n"
567
"If the argument is a tuple, the return value is the same object.");
568

569
static PySequenceMethods tuple_as_sequence = {
Martin v. Löwis's avatar
Martin v. Löwis committed
570
	(lenfunc)tuplelength,			/* sq_length */
571
	(binaryfunc)tupleconcat,		/* sq_concat */
Martin v. Löwis's avatar
Martin v. Löwis committed
572 573 574
	(ssizeargfunc)tuplerepeat,		/* sq_repeat */
	(ssizeargfunc)tupleitem,		/* sq_item */
	(ssizessizeargfunc)tupleslice,		/* sq_slice */
575 576 577
	0,					/* sq_ass_item */
	0,					/* sq_ass_slice */
	(objobjproc)tuplecontains,		/* sq_contains */
Guido van Rossum's avatar
Guido van Rossum committed
578 579
};

580 581 582
static PyObject*
tuplesubscript(PyTupleObject* self, PyObject* item)
{
583 584
	if (PyIndex_Check(item)) {
		Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
585 586 587 588 589 590 591
		if (i == -1 && PyErr_Occurred())
			return NULL;
		if (i < 0)
			i += PyTuple_GET_SIZE(self);
		return tupleitem(self, i);
	}
	else if (PySlice_Check(item)) {
Martin v. Löwis's avatar
Martin v. Löwis committed
592
		Py_ssize_t start, stop, step, slicelength, cur, i;
593 594
		PyObject* result;
		PyObject* it;
595
		PyObject **src, **dest;
596 597 598 599 600 601 602 603 604 605 606 607

		if (PySlice_GetIndicesEx((PySliceObject*)item,
				 PyTuple_GET_SIZE(self),
				 &start, &stop, &step, &slicelength) < 0) {
			return NULL;
		}

		if (slicelength <= 0) {
			return PyTuple_New(0);
		}
		else {
			result = PyTuple_New(slicelength);
608
			if (!result) return NULL;
609

610 611
			src = self->ob_item;
			dest = ((PyTupleObject *)result)->ob_item;
612 613
			for (cur = start, i = 0; i < slicelength; 
			     cur += step, i++) {
614
				it = src[cur];
615
				Py_INCREF(it);
616
				dest[i] = it;
617 618 619 620 621 622
			}
			
			return result;
		}
	}
	else {
623 624 625
		PyErr_Format(PyExc_TypeError, 
			     "tuple indices must be integers, not %.200s",
			     item->ob_type->tp_name);
626 627 628 629
		return NULL;
	}
}

630 631 632 633 634 635 636 637 638 639 640 641
static PyObject *
tuple_getnewargs(PyTupleObject *v)
{
	return Py_BuildValue("(N)", tupleslice(v, 0, v->ob_size));
	
}

static PyMethodDef tuple_methods[] = {
	{"__getnewargs__",	(PyCFunction)tuple_getnewargs,	METH_NOARGS},
	{NULL,		NULL}		/* sentinel */
};

642
static PyMappingMethods tuple_as_mapping = {
Martin v. Löwis's avatar
Martin v. Löwis committed
643
	(lenfunc)tuplelength,
644 645 646 647
	(binaryfunc)tuplesubscript,
	0
};

648 649
static PyObject *tuple_iter(PyObject *seq);

650 651
PyTypeObject PyTuple_Type = {
	PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum's avatar
Guido van Rossum committed
652 653
	0,
	"tuple",
Neil Schemenauer's avatar
Neil Schemenauer committed
654
	sizeof(PyTupleObject) - sizeof(PyObject *),
655
	sizeof(PyObject *),
656 657 658 659 660 661 662 663
	(destructor)tupledealloc,		/* tp_dealloc */
	(printfunc)tupleprint,			/* tp_print */
	0,					/* tp_getattr */
	0,					/* tp_setattr */
	0,					/* tp_compare */
	(reprfunc)tuplerepr,			/* tp_repr */
	0,					/* tp_as_number */
	&tuple_as_sequence,			/* tp_as_sequence */
664
	&tuple_as_mapping,			/* tp_as_mapping */
665 666 667
	(hashfunc)tuplehash,			/* tp_hash */
	0,					/* tp_call */
	0,					/* tp_str */
668
	PyObject_GenericGetAttr,		/* tp_getattro */
669 670
	0,					/* tp_setattro */
	0,					/* tp_as_buffer */
671
	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
672
		Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
673
	tuple_doc,				/* tp_doc */
674 675 676
 	(traverseproc)tupletraverse,		/* tp_traverse */
	0,					/* tp_clear */
	tuplerichcompare,			/* tp_richcompare */
677
	0,					/* tp_weaklistoffset */
678
	tuple_iter,	    			/* tp_iter */
679
	0,					/* tp_iternext */
680
	tuple_methods,				/* tp_methods */
681 682 683 684 685 686 687 688 689 690
	0,					/* tp_members */
	0,					/* tp_getset */
	0,					/* tp_base */
	0,					/* tp_dict */
	0,					/* tp_descr_get */
	0,					/* tp_descr_set */
	0,					/* tp_dictoffset */
	0,					/* tp_init */
	0,					/* tp_alloc */
	tuple_new,				/* tp_new */
691
	PyObject_GC_Del,        		/* tp_free */
Guido van Rossum's avatar
Guido van Rossum committed
692
};
693 694 695 696

/* The following function breaks the notion that tuples are immutable:
   it changes the size of a tuple.  We get away with this only if there
   is only one module referencing the object.  You can also think of it
697 698
   as creating a new tuple object and destroying the old one, only more
   efficiently.  In any case, don't use this if the tuple may already be
699
   known to some other part of the code. */
700 701

int
Martin v. Löwis's avatar
Martin v. Löwis committed
702
_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
703
{
704 705
	register PyTupleObject *v;
	register PyTupleObject *sv;
Martin v. Löwis's avatar
Martin v. Löwis committed
706 707
	Py_ssize_t i;
	Py_ssize_t oldsize;
708

709
	v = (PyTupleObject *) *pv;
710
	if (v == NULL || v->ob_type != &PyTuple_Type ||
711
	    (v->ob_size != 0 && v->ob_refcnt != 1)) {
712
		*pv = 0;
713
		Py_XDECREF(v);
714
		PyErr_BadInternalCall();
715 716
		return -1;
	}
717 718
	oldsize = v->ob_size;
	if (oldsize == newsize)
719
		return 0;
720

721
	if (oldsize == 0) {
722 723 724 725 726
		/* Empty tuples are often shared, so we should never 
		   resize them in-place even if we do own the only
		   (current) reference */
		Py_DECREF(v);
		*pv = PyTuple_New(newsize);
727
		return *pv == NULL ? -1 : 0;
728 729
	}

730
	/* XXX UNREF/NEWREF interface should be more symmetrical */
731
	_Py_DEC_REFTOTAL;
Neil Schemenauer's avatar
Neil Schemenauer committed
732
	_PyObject_GC_UNTRACK(v);
733
	_Py_ForgetReference((PyObject *) v);
734 735
	/* DECREF items deleted by shrinkage */
	for (i = newsize; i < oldsize; i++) {
736
		Py_XDECREF(v->ob_item[i]);
737 738
		v->ob_item[i] = NULL;
	}
Neil Schemenauer's avatar
Neil Schemenauer committed
739
	sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
740 741
	if (sv == NULL) {
		*pv = NULL;
Neil Schemenauer's avatar
Neil Schemenauer committed
742
		PyObject_GC_Del(v);
743
		return -1;
744
	}
745
	_Py_NewReference((PyObject *) sv);
746
	/* Zero out items added by growing */
747
	if (newsize > oldsize)
Jeremy Hylton's avatar
Jeremy Hylton committed
748 749
		memset(&sv->ob_item[oldsize], 0,
		       sizeof(*sv->ob_item) * (newsize - oldsize));
750
	*pv = (PyObject *) sv;
Neil Schemenauer's avatar
Neil Schemenauer committed
751
	_PyObject_GC_TRACK(sv);
752 753
	return 0;
}
754 755

void
756
PyTuple_Fini(void)
757 758 759 760 761 762 763 764 765 766 767 768 769 770
{
#if MAXSAVESIZE > 0
	int i;

	Py_XDECREF(free_tuples[0]);
	free_tuples[0] = NULL;

	for (i = 1; i < MAXSAVESIZE; i++) {
		PyTupleObject *p, *q;
		p = free_tuples[i];
		free_tuples[i] = NULL;
		while (p) {
			q = p;
			p = (PyTupleObject *)(p->ob_item[0]);
Neil Schemenauer's avatar
Neil Schemenauer committed
771
			PyObject_GC_Del(q);
772 773 774 775
		}
	}
#endif
}
776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795

/*********************** Tuple Iterator **************************/

typedef struct {
	PyObject_HEAD
	long it_index;
	PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
} tupleiterobject;

static void
tupleiter_dealloc(tupleiterobject *it)
{
	_PyObject_GC_UNTRACK(it);
	Py_XDECREF(it->it_seq);
	PyObject_GC_Del(it);
}

static int
tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
{
796 797
	Py_VISIT(it->it_seq);
	return 0;
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823
}

static PyObject *
tupleiter_next(tupleiterobject *it)
{
	PyTupleObject *seq;
	PyObject *item;

	assert(it != NULL);
	seq = it->it_seq;
	if (seq == NULL)
		return NULL;
	assert(PyTuple_Check(seq));

	if (it->it_index < PyTuple_GET_SIZE(seq)) {
		item = PyTuple_GET_ITEM(seq, it->it_index);
		++it->it_index;
		Py_INCREF(item);
		return item;
	}

	Py_DECREF(seq);
	it->it_seq = NULL;
	return NULL;
}

824
static PyObject *
825 826
tupleiter_len(tupleiterobject *it)
{
827
	Py_ssize_t len = 0;
828
	if (it->it_seq)
829
		len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
830
	return PyInt_FromSsize_t(len);
831 832
}

833
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
834 835

static PyMethodDef tupleiter_methods[] = {
836
	{"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
837
 	{NULL,		NULL}		/* sentinel */
838 839
};

840 841 842 843 844 845 846 847 848 849 850 851 852 853
PyTypeObject PyTupleIter_Type = {
	PyObject_HEAD_INIT(&PyType_Type)
	0,					/* ob_size */
	"tupleiterator",			/* tp_name */
	sizeof(tupleiterobject),		/* tp_basicsize */
	0,					/* tp_itemsize */
	/* methods */
	(destructor)tupleiter_dealloc,		/* tp_dealloc */
	0,					/* tp_print */
	0,					/* tp_getattr */
	0,					/* tp_setattr */
	0,					/* tp_compare */
	0,					/* tp_repr */
	0,					/* tp_as_number */
854
	0,					/* tp_as_sequence */
855 856 857 858 859 860 861 862 863 864 865 866 867
	0,					/* tp_as_mapping */
	0,					/* tp_hash */
	0,					/* tp_call */
	0,					/* tp_str */
	PyObject_GenericGetAttr,		/* tp_getattro */
	0,					/* tp_setattro */
	0,					/* tp_as_buffer */
	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
	0,					/* tp_doc */
	(traverseproc)tupleiter_traverse,	/* tp_traverse */
	0,					/* tp_clear */
	0,					/* tp_richcompare */
	0,					/* tp_weaklistoffset */
868
	PyObject_SelfIter,			/* tp_iter */
869
	(iternextfunc)tupleiter_next,		/* tp_iternext */
870 871
	tupleiter_methods,			/* tp_methods */
	0,
872
};
873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891

static PyObject *
tuple_iter(PyObject *seq)
{
	tupleiterobject *it;

	if (!PyTuple_Check(seq)) {
		PyErr_BadInternalCall();
		return NULL;
	}
	it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
	if (it == NULL)
		return NULL;
	it->it_index = 0;
	Py_INCREF(seq);
	it->it_seq = (PyTupleObject *)seq;
	_PyObject_GC_TRACK(it);
	return (PyObject *)it;
}