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 int fast_tuple_allocs
;
23 int 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
+= sizeof(PyTupleObject
) - sizeof(PyObject
*))
66 return PyErr_NoMemory();
68 op
= PyObject_GC_NewVar(PyTupleObject
, &PyTuple_Type
, size
);
72 for (i
=0; i
< size
; i
++)
73 op
->ob_item
[i
] = NULL
;
74 #if PyTuple_MAXSAVESIZE > 0
78 Py_INCREF(op
); /* extra INCREF so that this is never freed */
81 _PyObject_GC_TRACK(op
);
82 return (PyObject
*) op
;
86 PyTuple_Size(register PyObject
*op
)
88 if (!PyTuple_Check(op
)) {
89 PyErr_BadInternalCall();
97 PyTuple_GetItem(register PyObject
*op
, register Py_ssize_t i
)
99 if (!PyTuple_Check(op
)) {
100 PyErr_BadInternalCall();
103 if (i
< 0 || i
>= Py_SIZE(op
)) {
104 PyErr_SetString(PyExc_IndexError
, "tuple index out of range");
107 return ((PyTupleObject
*)op
) -> ob_item
[i
];
111 PyTuple_SetItem(register PyObject
*op
, register Py_ssize_t i
, PyObject
*newitem
)
113 register PyObject
*olditem
;
114 register PyObject
**p
;
115 if (!PyTuple_Check(op
) || op
->ob_refcnt
!= 1) {
117 PyErr_BadInternalCall();
120 if (i
< 0 || i
>= Py_SIZE(op
)) {
122 PyErr_SetString(PyExc_IndexError
,
123 "tuple assignment index out of range");
126 p
= ((PyTupleObject
*)op
) -> ob_item
+ i
;
134 PyTuple_Pack(Py_ssize_t n
, ...)
143 result
= PyTuple_New(n
);
146 items
= ((PyTupleObject
*)result
)->ob_item
;
147 for (i
= 0; i
< n
; i
++) {
148 o
= va_arg(vargs
, PyObject
*);
160 tupledealloc(register PyTupleObject
*op
)
162 register Py_ssize_t i
;
163 register Py_ssize_t len
= Py_SIZE(op
);
164 PyObject_GC_UnTrack(op
);
165 Py_TRASHCAN_SAFE_BEGIN(op
)
169 Py_XDECREF(op
->ob_item
[i
]);
170 #if PyTuple_MAXSAVESIZE > 0
171 if (len
< PyTuple_MAXSAVESIZE
&&
172 numfree
[len
] < PyTuple_MAXFREELIST
&&
173 Py_TYPE(op
) == &PyTuple_Type
)
175 op
->ob_item
[0] = (PyObject
*) free_list
[len
];
178 goto done
; /* return */
182 Py_TYPE(op
)->tp_free((PyObject
*)op
);
184 Py_TRASHCAN_SAFE_END(op
)
188 tuplerepr(PyTupleObject
*v
)
192 PyObject
*pieces
, *result
= NULL
;
196 return PyUnicode_FromString("()");
198 /* While not mutable, it is still possible to end up with a cycle in a
199 tuple through an object that stores itself within a tuple (and thus
200 infinitely asks for the repr of itself). This should only be
201 possible within a type. */
202 i
= Py_ReprEnter((PyObject
*)v
);
204 return i
> 0 ? PyString_FromString("(...)") : NULL
;
207 pieces
= PyTuple_New(n
);
211 /* Do repr() on each element. */
212 for (i
= 0; i
< n
; ++i
) {
213 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
215 s
= PyObject_Repr(v
->ob_item
[i
]);
216 Py_LeaveRecursiveCall();
219 PyTuple_SET_ITEM(pieces
, i
, s
);
222 /* Add "()" decorations to the first and last items. */
224 s
= PyUnicode_FromString("(");
227 temp
= PyTuple_GET_ITEM(pieces
, 0);
228 PyUnicode_AppendAndDel(&s
, temp
);
229 PyTuple_SET_ITEM(pieces
, 0, s
);
233 s
= PyUnicode_FromString(n
== 1 ? ",)" : ")");
236 temp
= PyTuple_GET_ITEM(pieces
, n
-1);
237 PyUnicode_AppendAndDel(&temp
, s
);
238 PyTuple_SET_ITEM(pieces
, n
-1, temp
);
242 /* Paste them all together with ", " between. */
243 s
= PyUnicode_FromString(", ");
246 result
= PyUnicode_Join(s
, pieces
);
251 Py_ReprLeave((PyObject
*)v
);
255 /* The addend 82520, was selected from the range(0, 1000000) for
256 generating the greatest number of prime multipliers for tuples
259 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
260 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
264 tuplehash(PyTupleObject
*v
)
267 register Py_ssize_t len
= Py_SIZE(v
);
268 register PyObject
**p
;
269 long mult
= 1000003L;
273 y
= PyObject_Hash(*p
++);
277 /* the cast might truncate len; that doesn't change hash stability */
278 mult
+= (long)(82520L + len
+ len
);
287 tuplelength(PyTupleObject
*a
)
293 tuplecontains(PyTupleObject
*a
, PyObject
*el
)
298 for (i
= 0, cmp
= 0 ; cmp
== 0 && i
< Py_SIZE(a
); ++i
)
299 cmp
= PyObject_RichCompareBool(el
, PyTuple_GET_ITEM(a
, i
),
305 tupleitem(register PyTupleObject
*a
, register Py_ssize_t i
)
307 if (i
< 0 || i
>= Py_SIZE(a
)) {
308 PyErr_SetString(PyExc_IndexError
, "tuple index out of range");
311 Py_INCREF(a
->ob_item
[i
]);
312 return a
->ob_item
[i
];
316 tupleslice(register PyTupleObject
*a
, register Py_ssize_t ilow
,
317 register Py_ssize_t ihigh
)
319 register PyTupleObject
*np
;
320 PyObject
**src
, **dest
;
321 register Py_ssize_t i
;
325 if (ihigh
> Py_SIZE(a
))
329 if (ilow
== 0 && ihigh
== Py_SIZE(a
) && PyTuple_CheckExact(a
)) {
331 return (PyObject
*)a
;
334 np
= (PyTupleObject
*)PyTuple_New(len
);
337 src
= a
->ob_item
+ ilow
;
339 for (i
= 0; i
< len
; i
++) {
340 PyObject
*v
= src
[i
];
344 return (PyObject
*)np
;
348 PyTuple_GetSlice(PyObject
*op
, Py_ssize_t i
, Py_ssize_t j
)
350 if (op
== NULL
|| !PyTuple_Check(op
)) {
351 PyErr_BadInternalCall();
354 return tupleslice((PyTupleObject
*)op
, i
, j
);
358 tupleconcat(register PyTupleObject
*a
, register PyObject
*bb
)
360 register Py_ssize_t size
;
361 register Py_ssize_t i
;
362 PyObject
**src
, **dest
;
364 if (!PyTuple_Check(bb
)) {
365 PyErr_Format(PyExc_TypeError
,
366 "can only concatenate tuple (not \"%.200s\") to tuple",
367 Py_TYPE(bb
)->tp_name
);
370 #define b ((PyTupleObject *)bb)
371 size
= Py_SIZE(a
) + Py_SIZE(b
);
373 return PyErr_NoMemory();
374 np
= (PyTupleObject
*) PyTuple_New(size
);
380 for (i
= 0; i
< Py_SIZE(a
); i
++) {
381 PyObject
*v
= src
[i
];
386 dest
= np
->ob_item
+ Py_SIZE(a
);
387 for (i
= 0; i
< Py_SIZE(b
); i
++) {
388 PyObject
*v
= src
[i
];
392 return (PyObject
*)np
;
397 tuplerepeat(PyTupleObject
*a
, Py_ssize_t n
)
402 PyObject
**p
, **items
;
405 if (Py_SIZE(a
) == 0 || n
== 1) {
406 if (PyTuple_CheckExact(a
)) {
407 /* Since tuples are immutable, we can return a shared
410 return (PyObject
*)a
;
413 return PyTuple_New(0);
415 size
= Py_SIZE(a
) * n
;
416 if (size
/Py_SIZE(a
) != n
)
417 return PyErr_NoMemory();
418 np
= (PyTupleObject
*) PyTuple_New(size
);
423 for (i
= 0; i
< n
; i
++) {
424 for (j
= 0; j
< Py_SIZE(a
); j
++) {
430 return (PyObject
*) np
;
434 tupleindex(PyTupleObject
*self
, PyObject
*args
)
436 Py_ssize_t i
, start
=0, stop
=Py_SIZE(self
);
439 if (!PyArg_ParseTuple(args
, "O|O&O&:index", &v
,
440 _PyEval_SliceIndex
, &start
,
441 _PyEval_SliceIndex
, &stop
))
444 start
+= Py_SIZE(self
);
449 stop
+= Py_SIZE(self
);
453 for (i
= start
; i
< stop
&& i
< Py_SIZE(self
); i
++) {
454 int cmp
= PyObject_RichCompareBool(self
->ob_item
[i
], v
, Py_EQ
);
456 return PyLong_FromSsize_t(i
);
460 PyErr_SetString(PyExc_ValueError
, "tuple.index(x): x not in list");
465 tuplecount(PyTupleObject
*self
, PyObject
*v
)
467 Py_ssize_t count
= 0;
470 for (i
= 0; i
< Py_SIZE(self
); i
++) {
471 int cmp
= PyObject_RichCompareBool(self
->ob_item
[i
], v
, Py_EQ
);
477 return PyLong_FromSsize_t(count
);
481 tupletraverse(PyTupleObject
*o
, visitproc visit
, void *arg
)
485 for (i
= Py_SIZE(o
); --i
>= 0; )
486 Py_VISIT(o
->ob_item
[i
]);
491 tuplerichcompare(PyObject
*v
, PyObject
*w
, int op
)
493 PyTupleObject
*vt
, *wt
;
495 Py_ssize_t vlen
, wlen
;
497 if (!PyTuple_Check(v
) || !PyTuple_Check(w
)) {
498 Py_INCREF(Py_NotImplemented
);
499 return Py_NotImplemented
;
502 vt
= (PyTupleObject
*)v
;
503 wt
= (PyTupleObject
*)w
;
508 /* Note: the corresponding code for lists has an "early out" test
509 * here when op is EQ or NE and the lengths differ. That pays there,
510 * but Tim was unable to find any real code where EQ/NE tuple
511 * compares don't have the same length, so testing for it here would
512 * have cost without benefit.
515 /* Search for the first index where items are different.
516 * Note that because tuples are immutable, it's safe to reuse
517 * vlen and wlen across the comparison calls.
519 for (i
= 0; i
< vlen
&& i
< wlen
; i
++) {
520 int k
= PyObject_RichCompareBool(vt
->ob_item
[i
],
521 wt
->ob_item
[i
], Py_EQ
);
528 if (i
>= vlen
|| i
>= wlen
) {
529 /* No more items to compare -- compare sizes */
533 case Py_LT
: cmp
= vlen
< wlen
; break;
534 case Py_LE
: cmp
= vlen
<= wlen
; break;
535 case Py_EQ
: cmp
= vlen
== wlen
; break;
536 case Py_NE
: cmp
= vlen
!= wlen
; break;
537 case Py_GT
: cmp
= vlen
> wlen
; break;
538 case Py_GE
: cmp
= vlen
>= wlen
; break;
539 default: return NULL
; /* cannot happen */
549 /* We have an item that differs -- shortcuts for EQ/NE */
559 /* Compare the final item again using the proper operator */
560 return PyObject_RichCompare(vt
->ob_item
[i
], wt
->ob_item
[i
], op
);
564 tuple_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
);
567 tuple_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
569 PyObject
*arg
= NULL
;
570 static char *kwlist
[] = {"sequence", 0};
572 if (type
!= &PyTuple_Type
)
573 return tuple_subtype_new(type
, args
, kwds
);
574 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "|O:tuple", kwlist
, &arg
))
578 return PyTuple_New(0);
580 return PySequence_Tuple(arg
);
584 tuple_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
586 PyObject
*tmp
, *newobj
, *item
;
589 assert(PyType_IsSubtype(type
, &PyTuple_Type
));
590 tmp
= tuple_new(&PyTuple_Type
, args
, kwds
);
593 assert(PyTuple_Check(tmp
));
594 newobj
= type
->tp_alloc(type
, n
= PyTuple_GET_SIZE(tmp
));
597 for (i
= 0; i
< n
; i
++) {
598 item
= PyTuple_GET_ITEM(tmp
, i
);
600 PyTuple_SET_ITEM(newobj
, i
, item
);
606 PyDoc_STRVAR(tuple_doc
,
607 "tuple() -> an empty tuple\n"
608 "tuple(sequence) -> tuple initialized from sequence's items\n"
610 "If the argument is a tuple, the return value is the same object.");
612 static PySequenceMethods tuple_as_sequence
= {
613 (lenfunc
)tuplelength
, /* sq_length */
614 (binaryfunc
)tupleconcat
, /* sq_concat */
615 (ssizeargfunc
)tuplerepeat
, /* sq_repeat */
616 (ssizeargfunc
)tupleitem
, /* sq_item */
619 0, /* sq_ass_slice */
620 (objobjproc
)tuplecontains
, /* sq_contains */
624 tuplesubscript(PyTupleObject
* self
, PyObject
* item
)
626 if (PyIndex_Check(item
)) {
627 Py_ssize_t i
= PyNumber_AsSsize_t(item
, PyExc_IndexError
);
628 if (i
== -1 && PyErr_Occurred())
631 i
+= PyTuple_GET_SIZE(self
);
632 return tupleitem(self
, i
);
634 else if (PySlice_Check(item
)) {
635 Py_ssize_t start
, stop
, step
, slicelength
, cur
, i
;
638 PyObject
**src
, **dest
;
640 if (PySlice_GetIndicesEx((PySliceObject
*)item
,
641 PyTuple_GET_SIZE(self
),
642 &start
, &stop
, &step
, &slicelength
) < 0) {
646 if (slicelength
<= 0) {
647 return PyTuple_New(0);
649 else if (start
== 0 && step
== 1 &&
650 slicelength
== PyTuple_GET_SIZE(self
) &&
651 PyTuple_CheckExact(self
)) {
653 return (PyObject
*)self
;
656 result
= PyTuple_New(slicelength
);
657 if (!result
) return NULL
;
660 dest
= ((PyTupleObject
*)result
)->ob_item
;
661 for (cur
= start
, i
= 0; i
< slicelength
;
672 PyErr_Format(PyExc_TypeError
,
673 "tuple indices must be integers, not %.200s",
674 Py_TYPE(item
)->tp_name
);
680 tuple_getnewargs(PyTupleObject
*v
)
682 return Py_BuildValue("(N)", tupleslice(v
, 0, Py_SIZE(v
)));
686 PyDoc_STRVAR(index_doc
,
687 "T.index(value, [start, [stop]]) -> integer -- return first index of value");
688 PyDoc_STRVAR(count_doc
,
689 "T.count(value) -> integer -- return number of occurrences of value");
691 static PyMethodDef tuple_methods
[] = {
692 {"__getnewargs__", (PyCFunction
)tuple_getnewargs
, METH_NOARGS
},
693 {"index", (PyCFunction
)tupleindex
, METH_VARARGS
, index_doc
},
694 {"count", (PyCFunction
)tuplecount
, METH_O
, count_doc
},
695 {NULL
, NULL
} /* sentinel */
698 static PyMappingMethods tuple_as_mapping
= {
699 (lenfunc
)tuplelength
,
700 (binaryfunc
)tuplesubscript
,
704 static PyObject
*tuple_iter(PyObject
*seq
);
706 PyTypeObject PyTuple_Type
= {
707 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
709 sizeof(PyTupleObject
) - sizeof(PyObject
*),
711 (destructor
)tupledealloc
, /* tp_dealloc */
716 (reprfunc
)tuplerepr
, /* tp_repr */
717 0, /* tp_as_number */
718 &tuple_as_sequence
, /* tp_as_sequence */
719 &tuple_as_mapping
, /* tp_as_mapping */
720 (hashfunc
)tuplehash
, /* tp_hash */
723 PyObject_GenericGetAttr
, /* tp_getattro */
725 0, /* tp_as_buffer */
726 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
727 Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_TUPLE_SUBCLASS
, /* tp_flags */
728 tuple_doc
, /* tp_doc */
729 (traverseproc
)tupletraverse
, /* tp_traverse */
731 tuplerichcompare
, /* tp_richcompare */
732 0, /* tp_weaklistoffset */
733 tuple_iter
, /* tp_iter */
735 tuple_methods
, /* tp_methods */
740 0, /* tp_descr_get */
741 0, /* tp_descr_set */
742 0, /* tp_dictoffset */
745 tuple_new
, /* tp_new */
746 PyObject_GC_Del
, /* tp_free */
749 /* The following function breaks the notion that tuples are immutable:
750 it changes the size of a tuple. We get away with this only if there
751 is only one module referencing the object. You can also think of it
752 as creating a new tuple object and destroying the old one, only more
753 efficiently. In any case, don't use this if the tuple may already be
754 known to some other part of the code. */
757 _PyTuple_Resize(PyObject
**pv
, Py_ssize_t newsize
)
759 register PyTupleObject
*v
;
760 register PyTupleObject
*sv
;
764 v
= (PyTupleObject
*) *pv
;
765 if (v
== NULL
|| Py_TYPE(v
) != &PyTuple_Type
||
766 (Py_SIZE(v
) != 0 && Py_REFCNT(v
) != 1)) {
769 PyErr_BadInternalCall();
772 oldsize
= Py_SIZE(v
);
773 if (oldsize
== newsize
)
777 /* Empty tuples are often shared, so we should never
778 resize them in-place even if we do own the only
779 (current) reference */
781 *pv
= PyTuple_New(newsize
);
782 return *pv
== NULL
? -1 : 0;
785 /* XXX UNREF/NEWREF interface should be more symmetrical */
787 _PyObject_GC_UNTRACK(v
);
788 _Py_ForgetReference((PyObject
*) v
);
789 /* DECREF items deleted by shrinkage */
790 for (i
= newsize
; i
< oldsize
; i
++) {
791 Py_XDECREF(v
->ob_item
[i
]);
792 v
->ob_item
[i
] = NULL
;
794 sv
= PyObject_GC_Resize(PyTupleObject
, v
, newsize
);
800 _Py_NewReference((PyObject
*) sv
);
801 /* Zero out items added by growing */
802 if (newsize
> oldsize
)
803 memset(&sv
->ob_item
[oldsize
], 0,
804 sizeof(*sv
->ob_item
) * (newsize
- oldsize
));
805 *pv
= (PyObject
*) sv
;
806 _PyObject_GC_TRACK(sv
);
811 PyTuple_ClearFreeList(void)
813 int freelist_size
= 0;
814 #if PyTuple_MAXSAVESIZE > 0
816 for (i
= 1; i
< PyTuple_MAXSAVESIZE
; i
++) {
817 PyTupleObject
*p
, *q
;
819 freelist_size
+= numfree
[i
];
824 p
= (PyTupleObject
*)(p
->ob_item
[0]);
829 return freelist_size
;
835 #if PyTuple_MAXSAVESIZE > 0
836 /* empty tuples are used all over the place and applications may
837 * rely on the fact that an empty tuple is a singleton. */
838 Py_XDECREF(free_list
[0]);
841 (void)PyTuple_ClearFreeList();
845 /*********************** Tuple Iterator **************************/
850 PyTupleObject
*it_seq
; /* Set to NULL when iterator is exhausted */
854 tupleiter_dealloc(tupleiterobject
*it
)
856 _PyObject_GC_UNTRACK(it
);
857 Py_XDECREF(it
->it_seq
);
862 tupleiter_traverse(tupleiterobject
*it
, visitproc visit
, void *arg
)
864 Py_VISIT(it
->it_seq
);
869 tupleiter_next(tupleiterobject
*it
)
878 assert(PyTuple_Check(seq
));
880 if (it
->it_index
< PyTuple_GET_SIZE(seq
)) {
881 item
= PyTuple_GET_ITEM(seq
, it
->it_index
);
893 tupleiter_len(tupleiterobject
*it
)
897 len
= PyTuple_GET_SIZE(it
->it_seq
) - it
->it_index
;
898 return PyLong_FromSsize_t(len
);
901 PyDoc_STRVAR(length_hint_doc
, "Private method returning an estimate of len(list(it)).");
903 static PyMethodDef tupleiter_methods
[] = {
904 {"__length_hint__", (PyCFunction
)tupleiter_len
, METH_NOARGS
, length_hint_doc
},
905 {NULL
, NULL
} /* sentinel */
908 PyTypeObject PyTupleIter_Type
= {
909 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
910 "tuple_iterator", /* tp_name */
911 sizeof(tupleiterobject
), /* tp_basicsize */
914 (destructor
)tupleiter_dealloc
, /* tp_dealloc */
920 0, /* tp_as_number */
921 0, /* tp_as_sequence */
922 0, /* tp_as_mapping */
926 PyObject_GenericGetAttr
, /* tp_getattro */
928 0, /* tp_as_buffer */
929 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
,/* tp_flags */
931 (traverseproc
)tupleiter_traverse
, /* tp_traverse */
933 0, /* tp_richcompare */
934 0, /* tp_weaklistoffset */
935 PyObject_SelfIter
, /* tp_iter */
936 (iternextfunc
)tupleiter_next
, /* tp_iternext */
937 tupleiter_methods
, /* tp_methods */
942 tuple_iter(PyObject
*seq
)
946 if (!PyTuple_Check(seq
)) {
947 PyErr_BadInternalCall();
950 it
= PyObject_GC_New(tupleiterobject
, &PyTupleIter_Type
);
955 it
->it_seq
= (PyTupleObject
*)seq
;
956 _PyObject_GC_TRACK(it
);
957 return (PyObject
*)it
;