2
/* Tuple object implementation */
6
/* Speed optimization to avoid frequent malloc/free of small tuples */
7
#ifndef PyTuple_MAXSAVESIZE
8
#define PyTuple_MAXSAVESIZE 20 /* Largest tuple to save on free list */
10
#ifndef PyTuple_MAXFREELIST
11
#define PyTuple_MAXFREELIST 2000 /* Maximum number of tuples of each size to save */
14
#if PyTuple_MAXSAVESIZE > 0
15
/* Entries 1 up to PyTuple_MAXSAVESIZE are free lists, entry 0 is the empty
16
tuple () of which at most one instance will be allocated.
18
static PyTupleObject *free_list[PyTuple_MAXSAVESIZE];
19
static int numfree[PyTuple_MAXSAVESIZE];
22
Py_ssize_t fast_tuple_allocs;
23
Py_ssize_t tuple_zero_allocs;
27
PyTuple_New(register Py_ssize_t size)
29
register PyTupleObject *op;
32
PyErr_BadInternalCall();
35
#if PyTuple_MAXSAVESIZE > 0
36
if (size == 0 && free_list[0]) {
42
return (PyObject *) op;
44
if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {
45
free_list[size] = (PyTupleObject *) op->ob_item[0];
50
/* Inline PyObject_InitVar */
53
Py_TYPE(op) = &PyTuple_Type;
55
_Py_NewReference((PyObject *)op);
60
Py_ssize_t nbytes = size * sizeof(PyObject *);
61
/* Check for overflow */
62
if (nbytes / sizeof(PyObject *) != (size_t)size ||
63
(nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)))
65
return PyErr_NoMemory();
67
nbytes += sizeof(PyTupleObject) - sizeof(PyObject *);
69
op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
73
for (i=0; i < size; i++)
74
op->ob_item[i] = NULL;
75
#if PyTuple_MAXSAVESIZE > 0
79
Py_INCREF(op); /* extra INCREF so that this is never freed */
82
_PyObject_GC_TRACK(op);
83
return (PyObject *) op;
87
PyTuple_Size(register PyObject *op)
89
if (!PyTuple_Check(op)) {
90
PyErr_BadInternalCall();
98
PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
100
if (!PyTuple_Check(op)) {
101
PyErr_BadInternalCall();
104
if (i < 0 || i >= Py_SIZE(op)) {
105
PyErr_SetString(PyExc_IndexError, "tuple index out of range");
108
return ((PyTupleObject *)op) -> ob_item[i];
112
PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
114
register PyObject *olditem;
115
register PyObject **p;
116
if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
118
PyErr_BadInternalCall();
121
if (i < 0 || i >= Py_SIZE(op)) {
123
PyErr_SetString(PyExc_IndexError,
124
"tuple assignment index out of range");
127
p = ((PyTupleObject *)op) -> ob_item + i;
135
PyTuple_Pack(Py_ssize_t n, ...)
144
result = PyTuple_New(n);
147
items = ((PyTupleObject *)result)->ob_item;
148
for (i = 0; i < n; i++) {
149
o = va_arg(vargs, PyObject *);
161
tupledealloc(register PyTupleObject *op)
163
register Py_ssize_t i;
164
register Py_ssize_t len = Py_SIZE(op);
165
PyObject_GC_UnTrack(op);
166
Py_TRASHCAN_SAFE_BEGIN(op)
170
Py_XDECREF(op->ob_item[i]);
171
#if PyTuple_MAXSAVESIZE > 0
172
if (len < PyTuple_MAXSAVESIZE &&
173
numfree[len] < PyTuple_MAXFREELIST &&
174
Py_TYPE(op) == &PyTuple_Type)
176
op->ob_item[0] = (PyObject *) free_list[len];
179
goto done; /* return */
183
Py_TYPE(op)->tp_free((PyObject *)op);
185
Py_TRASHCAN_SAFE_END(op)
189
tuplerepr(PyTupleObject *v)
193
PyObject *pieces, *result = NULL;
197
return PyUnicode_FromString("()");
199
/* While not mutable, it is still possible to end up with a cycle in a
200
tuple through an object that stores itself within a tuple (and thus
201
infinitely asks for the repr of itself). This should only be
202
possible within a type. */
203
i = Py_ReprEnter((PyObject *)v);
205
return i > 0 ? PyUnicode_FromString("(...)") : NULL;
208
pieces = PyTuple_New(n);
212
/* Do repr() on each element. */
213
for (i = 0; i < n; ++i) {
214
if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
216
s = PyObject_Repr(v->ob_item[i]);
217
Py_LeaveRecursiveCall();
220
PyTuple_SET_ITEM(pieces, i, s);
223
/* Add "()" decorations to the first and last items. */
225
s = PyUnicode_FromString("(");
228
temp = PyTuple_GET_ITEM(pieces, 0);
229
PyUnicode_AppendAndDel(&s, temp);
230
PyTuple_SET_ITEM(pieces, 0, s);
234
s = PyUnicode_FromString(n == 1 ? ",)" : ")");
237
temp = PyTuple_GET_ITEM(pieces, n-1);
238
PyUnicode_AppendAndDel(&temp, s);
239
PyTuple_SET_ITEM(pieces, n-1, temp);
243
/* Paste them all together with ", " between. */
244
s = PyUnicode_FromString(", ");
247
result = PyUnicode_Join(s, pieces);
252
Py_ReprLeave((PyObject *)v);
256
/* The addend 82520, was selected from the range(0, 1000000) for
257
generating the greatest number of prime multipliers for tuples
260
1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
261
1330111, 1412633, 1165069, 1247599, 1495177, 1577699
265
tuplehash(PyTupleObject *v)
268
register Py_ssize_t len = Py_SIZE(v);
269
register PyObject **p;
270
long mult = 1000003L;
274
y = PyObject_Hash(*p++);
278
/* the cast might truncate len; that doesn't change hash stability */
279
mult += (long)(82520L + len + len);
288
tuplelength(PyTupleObject *a)
294
tuplecontains(PyTupleObject *a, PyObject *el)
299
for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
300
cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
306
tupleitem(register PyTupleObject *a, register Py_ssize_t i)
308
if (i < 0 || i >= Py_SIZE(a)) {
309
PyErr_SetString(PyExc_IndexError, "tuple index out of range");
312
Py_INCREF(a->ob_item[i]);
313
return a->ob_item[i];
317
tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
318
register Py_ssize_t ihigh)
320
register PyTupleObject *np;
321
PyObject **src, **dest;
322
register Py_ssize_t i;
326
if (ihigh > Py_SIZE(a))
330
if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
332
return (PyObject *)a;
335
np = (PyTupleObject *)PyTuple_New(len);
338
src = a->ob_item + ilow;
340
for (i = 0; i < len; i++) {
341
PyObject *v = src[i];
345
return (PyObject *)np;
349
PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
351
if (op == NULL || !PyTuple_Check(op)) {
352
PyErr_BadInternalCall();
355
return tupleslice((PyTupleObject *)op, i, j);
359
tupleconcat(register PyTupleObject *a, register PyObject *bb)
361
register Py_ssize_t size;
362
register Py_ssize_t i;
363
PyObject **src, **dest;
365
if (!PyTuple_Check(bb)) {
366
PyErr_Format(PyExc_TypeError,
367
"can only concatenate tuple (not \"%.200s\") to tuple",
368
Py_TYPE(bb)->tp_name);
371
#define b ((PyTupleObject *)bb)
372
size = Py_SIZE(a) + Py_SIZE(b);
374
return PyErr_NoMemory();
375
np = (PyTupleObject *) PyTuple_New(size);
381
for (i = 0; i < Py_SIZE(a); i++) {
382
PyObject *v = src[i];
387
dest = np->ob_item + Py_SIZE(a);
388
for (i = 0; i < Py_SIZE(b); i++) {
389
PyObject *v = src[i];
393
return (PyObject *)np;
398
tuplerepeat(PyTupleObject *a, Py_ssize_t n)
403
PyObject **p, **items;
406
if (Py_SIZE(a) == 0 || n == 1) {
407
if (PyTuple_CheckExact(a)) {
408
/* Since tuples are immutable, we can return a shared
411
return (PyObject *)a;
414
return PyTuple_New(0);
416
size = Py_SIZE(a) * n;
417
if (size/Py_SIZE(a) != n)
418
return PyErr_NoMemory();
419
np = (PyTupleObject *) PyTuple_New(size);
424
for (i = 0; i < n; i++) {
425
for (j = 0; j < Py_SIZE(a); j++) {
431
return (PyObject *) np;
435
tupleindex(PyTupleObject *self, PyObject *args)
437
Py_ssize_t i, start=0, stop=Py_SIZE(self);
440
if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
441
_PyEval_SliceIndex, &start,
442
_PyEval_SliceIndex, &stop))
445
start += Py_SIZE(self);
450
stop += Py_SIZE(self);
454
for (i = start; i < stop && i < Py_SIZE(self); i++) {
455
int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
457
return PyLong_FromSsize_t(i);
461
PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in tuple");
466
tuplecount(PyTupleObject *self, PyObject *v)
468
Py_ssize_t count = 0;
471
for (i = 0; i < Py_SIZE(self); i++) {
472
int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
478
return PyLong_FromSsize_t(count);
482
tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
486
for (i = Py_SIZE(o); --i >= 0; )
487
Py_VISIT(o->ob_item[i]);
492
tuplerichcompare(PyObject *v, PyObject *w, int op)
494
PyTupleObject *vt, *wt;
496
Py_ssize_t vlen, wlen;
498
if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
499
Py_INCREF(Py_NotImplemented);
500
return Py_NotImplemented;
503
vt = (PyTupleObject *)v;
504
wt = (PyTupleObject *)w;
509
/* Note: the corresponding code for lists has an "early out" test
510
* here when op is EQ or NE and the lengths differ. That pays there,
511
* but Tim was unable to find any real code where EQ/NE tuple
512
* compares don't have the same length, so testing for it here would
513
* have cost without benefit.
516
/* Search for the first index where items are different.
517
* Note that because tuples are immutable, it's safe to reuse
518
* vlen and wlen across the comparison calls.
520
for (i = 0; i < vlen && i < wlen; i++) {
521
int k = PyObject_RichCompareBool(vt->ob_item[i],
522
wt->ob_item[i], Py_EQ);
529
if (i >= vlen || i >= wlen) {
530
/* No more items to compare -- compare sizes */
534
case Py_LT: cmp = vlen < wlen; break;
535
case Py_LE: cmp = vlen <= wlen; break;
536
case Py_EQ: cmp = vlen == wlen; break;
537
case Py_NE: cmp = vlen != wlen; break;
538
case Py_GT: cmp = vlen > wlen; break;
539
case Py_GE: cmp = vlen >= wlen; break;
540
default: return NULL; /* cannot happen */
550
/* We have an item that differs -- shortcuts for EQ/NE */
560
/* Compare the final item again using the proper operator */
561
return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
565
tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
568
tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
570
PyObject *arg = NULL;
571
static char *kwlist[] = {"sequence", 0};
573
if (type != &PyTuple_Type)
574
return tuple_subtype_new(type, args, kwds);
575
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
579
return PyTuple_New(0);
581
return PySequence_Tuple(arg);
585
tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
587
PyObject *tmp, *newobj, *item;
590
assert(PyType_IsSubtype(type, &PyTuple_Type));
591
tmp = tuple_new(&PyTuple_Type, args, kwds);
594
assert(PyTuple_Check(tmp));
595
newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
598
for (i = 0; i < n; i++) {
599
item = PyTuple_GET_ITEM(tmp, i);
601
PyTuple_SET_ITEM(newobj, i, item);
607
PyDoc_STRVAR(tuple_doc,
608
"tuple() -> an empty tuple\n"
609
"tuple(sequence) -> tuple initialized from sequence's items\n"
611
"If the argument is a tuple, the return value is the same object.");
613
static PySequenceMethods tuple_as_sequence = {
614
(lenfunc)tuplelength, /* sq_length */
615
(binaryfunc)tupleconcat, /* sq_concat */
616
(ssizeargfunc)tuplerepeat, /* sq_repeat */
617
(ssizeargfunc)tupleitem, /* sq_item */
620
0, /* sq_ass_slice */
621
(objobjproc)tuplecontains, /* sq_contains */
625
tuplesubscript(PyTupleObject* self, PyObject* item)
627
if (PyIndex_Check(item)) {
628
Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
629
if (i == -1 && PyErr_Occurred())
632
i += PyTuple_GET_SIZE(self);
633
return tupleitem(self, i);
635
else if (PySlice_Check(item)) {
636
Py_ssize_t start, stop, step, slicelength, cur, i;
639
PyObject **src, **dest;
641
if (PySlice_GetIndicesEx((PySliceObject*)item,
642
PyTuple_GET_SIZE(self),
643
&start, &stop, &step, &slicelength) < 0) {
647
if (slicelength <= 0) {
648
return PyTuple_New(0);
650
else if (start == 0 && step == 1 &&
651
slicelength == PyTuple_GET_SIZE(self) &&
652
PyTuple_CheckExact(self)) {
654
return (PyObject *)self;
657
result = PyTuple_New(slicelength);
658
if (!result) return NULL;
661
dest = ((PyTupleObject *)result)->ob_item;
662
for (cur = start, i = 0; i < slicelength;
673
PyErr_Format(PyExc_TypeError,
674
"tuple indices must be integers, not %.200s",
675
Py_TYPE(item)->tp_name);
681
tuple_getnewargs(PyTupleObject *v)
683
return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
688
tuple_sizeof(PyTupleObject *self)
692
res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
693
return PyLong_FromSsize_t(res);
696
PyDoc_STRVAR(index_doc,
697
"T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
698
"Raises ValueError if the value is not present."
700
PyDoc_STRVAR(count_doc,
701
"T.count(value) -> integer -- return number of occurrences of value");
702
PyDoc_STRVAR(sizeof_doc,
703
"T.__sizeof__() -- size of T in memory, in bytes");
705
static PyMethodDef tuple_methods[] = {
706
{"__getnewargs__", (PyCFunction)tuple_getnewargs, METH_NOARGS},
707
{"__sizeof__", (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
708
{"index", (PyCFunction)tupleindex, METH_VARARGS, index_doc},
709
{"count", (PyCFunction)tuplecount, METH_O, count_doc},
710
{NULL, NULL} /* sentinel */
713
static PyMappingMethods tuple_as_mapping = {
714
(lenfunc)tuplelength,
715
(binaryfunc)tuplesubscript,
719
static PyObject *tuple_iter(PyObject *seq);
721
PyTypeObject PyTuple_Type = {
722
PyVarObject_HEAD_INIT(&PyType_Type, 0)
724
sizeof(PyTupleObject) - sizeof(PyObject *),
726
(destructor)tupledealloc, /* tp_dealloc */
731
(reprfunc)tuplerepr, /* tp_repr */
732
0, /* tp_as_number */
733
&tuple_as_sequence, /* tp_as_sequence */
734
&tuple_as_mapping, /* tp_as_mapping */
735
(hashfunc)tuplehash, /* tp_hash */
738
PyObject_GenericGetAttr, /* tp_getattro */
740
0, /* tp_as_buffer */
741
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
742
Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
743
tuple_doc, /* tp_doc */
744
(traverseproc)tupletraverse, /* tp_traverse */
746
tuplerichcompare, /* tp_richcompare */
747
0, /* tp_weaklistoffset */
748
tuple_iter, /* tp_iter */
750
tuple_methods, /* tp_methods */
755
0, /* tp_descr_get */
756
0, /* tp_descr_set */
757
0, /* tp_dictoffset */
760
tuple_new, /* tp_new */
761
PyObject_GC_Del, /* tp_free */
764
/* The following function breaks the notion that tuples are immutable:
765
it changes the size of a tuple. We get away with this only if there
766
is only one module referencing the object. You can also think of it
767
as creating a new tuple object and destroying the old one, only more
768
efficiently. In any case, don't use this if the tuple may already be
769
known to some other part of the code. */
772
_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
774
register PyTupleObject *v;
775
register PyTupleObject *sv;
779
v = (PyTupleObject *) *pv;
780
if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
781
(Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
784
PyErr_BadInternalCall();
787
oldsize = Py_SIZE(v);
788
if (oldsize == newsize)
792
/* Empty tuples are often shared, so we should never
793
resize them in-place even if we do own the only
794
(current) reference */
796
*pv = PyTuple_New(newsize);
797
return *pv == NULL ? -1 : 0;
800
/* XXX UNREF/NEWREF interface should be more symmetrical */
802
_PyObject_GC_UNTRACK(v);
803
_Py_ForgetReference((PyObject *) v);
804
/* DECREF items deleted by shrinkage */
805
for (i = newsize; i < oldsize; i++) {
806
Py_XDECREF(v->ob_item[i]);
807
v->ob_item[i] = NULL;
809
sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
815
_Py_NewReference((PyObject *) sv);
816
/* Zero out items added by growing */
817
if (newsize > oldsize)
818
memset(&sv->ob_item[oldsize], 0,
819
sizeof(*sv->ob_item) * (newsize - oldsize));
820
*pv = (PyObject *) sv;
821
_PyObject_GC_TRACK(sv);
826
PyTuple_ClearFreeList(void)
828
int freelist_size = 0;
829
#if PyTuple_MAXSAVESIZE > 0
831
for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
832
PyTupleObject *p, *q;
834
freelist_size += numfree[i];
839
p = (PyTupleObject *)(p->ob_item[0]);
844
return freelist_size;
850
#if PyTuple_MAXSAVESIZE > 0
851
/* empty tuples are used all over the place and applications may
852
* rely on the fact that an empty tuple is a singleton. */
853
Py_XDECREF(free_list[0]);
856
(void)PyTuple_ClearFreeList();
860
/*********************** Tuple Iterator **************************/
865
PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
869
tupleiter_dealloc(tupleiterobject *it)
871
_PyObject_GC_UNTRACK(it);
872
Py_XDECREF(it->it_seq);
877
tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
879
Py_VISIT(it->it_seq);
884
tupleiter_next(tupleiterobject *it)
893
assert(PyTuple_Check(seq));
895
if (it->it_index < PyTuple_GET_SIZE(seq)) {
896
item = PyTuple_GET_ITEM(seq, it->it_index);
908
tupleiter_len(tupleiterobject *it)
912
len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
913
return PyLong_FromSsize_t(len);
916
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
918
static PyMethodDef tupleiter_methods[] = {
919
{"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
920
{NULL, NULL} /* sentinel */
923
PyTypeObject PyTupleIter_Type = {
924
PyVarObject_HEAD_INIT(&PyType_Type, 0)
925
"tuple_iterator", /* tp_name */
926
sizeof(tupleiterobject), /* tp_basicsize */
929
(destructor)tupleiter_dealloc, /* tp_dealloc */
935
0, /* tp_as_number */
936
0, /* tp_as_sequence */
937
0, /* tp_as_mapping */
941
PyObject_GenericGetAttr, /* tp_getattro */
943
0, /* tp_as_buffer */
944
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
946
(traverseproc)tupleiter_traverse, /* tp_traverse */
948
0, /* tp_richcompare */
949
0, /* tp_weaklistoffset */
950
PyObject_SelfIter, /* tp_iter */
951
(iternextfunc)tupleiter_next, /* tp_iternext */
952
tupleiter_methods, /* tp_methods */
957
tuple_iter(PyObject *seq)
961
if (!PyTuple_Check(seq)) {
962
PyErr_BadInternalCall();
965
it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
970
it->it_seq = (PyTupleObject *)seq;
971
_PyObject_GC_TRACK(it);
972
return (PyObject *)it;