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
> 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 tupleprint(PyTupleObject
*op
, FILE *fp
, int flags
)
192 Py_BEGIN_ALLOW_THREADS
195 for (i
= 0; i
< Py_SIZE(op
); i
++) {
197 Py_BEGIN_ALLOW_THREADS
201 if (PyObject_Print(op
->ob_item
[i
], fp
, 0) != 0)
205 Py_BEGIN_ALLOW_THREADS
214 tuplerepr(PyTupleObject
*v
)
218 PyObject
*pieces
, *result
= NULL
;
222 return PyString_FromString("()");
224 /* While not mutable, it is still possible to end up with a cycle in a
225 tuple through an object that stores itself within a tuple (and thus
226 infinitely asks for the repr of itself). This should only be
227 possible within a type. */
228 i
= Py_ReprEnter((PyObject
*)v
);
230 return i
> 0 ? PyString_FromString("(...)") : NULL
;
233 pieces
= PyTuple_New(n
);
237 /* Do repr() on each element. */
238 for (i
= 0; i
< n
; ++i
) {
239 if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
241 s
= PyObject_Repr(v
->ob_item
[i
]);
242 Py_LeaveRecursiveCall();
245 PyTuple_SET_ITEM(pieces
, i
, s
);
248 /* Add "()" decorations to the first and last items. */
250 s
= PyString_FromString("(");
253 temp
= PyTuple_GET_ITEM(pieces
, 0);
254 PyString_ConcatAndDel(&s
, temp
);
255 PyTuple_SET_ITEM(pieces
, 0, s
);
259 s
= PyString_FromString(n
== 1 ? ",)" : ")");
262 temp
= PyTuple_GET_ITEM(pieces
, n
-1);
263 PyString_ConcatAndDel(&temp
, s
);
264 PyTuple_SET_ITEM(pieces
, n
-1, temp
);
268 /* Paste them all together with ", " between. */
269 s
= PyString_FromString(", ");
272 result
= _PyString_Join(s
, pieces
);
277 Py_ReprLeave((PyObject
*)v
);
281 /* The addend 82520, was selected from the range(0, 1000000) for
282 generating the greatest number of prime multipliers for tuples
285 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
286 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
290 tuplehash(PyTupleObject
*v
)
293 register Py_ssize_t len
= Py_SIZE(v
);
294 register PyObject
**p
;
295 long mult
= 1000003L;
299 y
= PyObject_Hash(*p
++);
303 /* the cast might truncate len; that doesn't change hash stability */
304 mult
+= (long)(82520L + len
+ len
);
313 tuplelength(PyTupleObject
*a
)
319 tuplecontains(PyTupleObject
*a
, PyObject
*el
)
324 for (i
= 0, cmp
= 0 ; cmp
== 0 && i
< Py_SIZE(a
); ++i
)
325 cmp
= PyObject_RichCompareBool(el
, PyTuple_GET_ITEM(a
, i
),
331 tupleitem(register PyTupleObject
*a
, register Py_ssize_t i
)
333 if (i
< 0 || i
>= Py_SIZE(a
)) {
334 PyErr_SetString(PyExc_IndexError
, "tuple index out of range");
337 Py_INCREF(a
->ob_item
[i
]);
338 return a
->ob_item
[i
];
342 tupleslice(register PyTupleObject
*a
, register Py_ssize_t ilow
,
343 register Py_ssize_t ihigh
)
345 register PyTupleObject
*np
;
346 PyObject
**src
, **dest
;
347 register Py_ssize_t i
;
351 if (ihigh
> Py_SIZE(a
))
355 if (ilow
== 0 && ihigh
== Py_SIZE(a
) && PyTuple_CheckExact(a
)) {
357 return (PyObject
*)a
;
360 np
= (PyTupleObject
*)PyTuple_New(len
);
363 src
= a
->ob_item
+ ilow
;
365 for (i
= 0; i
< len
; i
++) {
366 PyObject
*v
= src
[i
];
370 return (PyObject
*)np
;
374 PyTuple_GetSlice(PyObject
*op
, Py_ssize_t i
, Py_ssize_t j
)
376 if (op
== NULL
|| !PyTuple_Check(op
)) {
377 PyErr_BadInternalCall();
380 return tupleslice((PyTupleObject
*)op
, i
, j
);
384 tupleconcat(register PyTupleObject
*a
, register PyObject
*bb
)
386 register Py_ssize_t size
;
387 register Py_ssize_t i
;
388 PyObject
**src
, **dest
;
390 if (!PyTuple_Check(bb
)) {
391 PyErr_Format(PyExc_TypeError
,
392 "can only concatenate tuple (not \"%.200s\") to tuple",
393 Py_TYPE(bb
)->tp_name
);
396 #define b ((PyTupleObject *)bb)
397 size
= Py_SIZE(a
) + Py_SIZE(b
);
399 return PyErr_NoMemory();
400 np
= (PyTupleObject
*) PyTuple_New(size
);
406 for (i
= 0; i
< Py_SIZE(a
); i
++) {
407 PyObject
*v
= src
[i
];
412 dest
= np
->ob_item
+ Py_SIZE(a
);
413 for (i
= 0; i
< Py_SIZE(b
); i
++) {
414 PyObject
*v
= src
[i
];
418 return (PyObject
*)np
;
423 tuplerepeat(PyTupleObject
*a
, Py_ssize_t n
)
428 PyObject
**p
, **items
;
431 if (Py_SIZE(a
) == 0 || n
== 1) {
432 if (PyTuple_CheckExact(a
)) {
433 /* Since tuples are immutable, we can return a shared
436 return (PyObject
*)a
;
439 return PyTuple_New(0);
441 size
= Py_SIZE(a
) * n
;
442 if (size
/Py_SIZE(a
) != n
)
443 return PyErr_NoMemory();
444 np
= (PyTupleObject
*) PyTuple_New(size
);
449 for (i
= 0; i
< n
; i
++) {
450 for (j
= 0; j
< Py_SIZE(a
); j
++) {
456 return (PyObject
*) np
;
460 tupleindex(PyTupleObject
*self
, PyObject
*args
)
462 Py_ssize_t i
, start
=0, stop
=Py_SIZE(self
);
465 if (!PyArg_ParseTuple(args
, "O|O&O&:index", &v
,
466 _PyEval_SliceIndex
, &start
,
467 _PyEval_SliceIndex
, &stop
))
470 start
+= Py_SIZE(self
);
475 stop
+= Py_SIZE(self
);
479 for (i
= start
; i
< stop
&& i
< Py_SIZE(self
); i
++) {
480 int cmp
= PyObject_RichCompareBool(self
->ob_item
[i
], v
, Py_EQ
);
482 return PyInt_FromSsize_t(i
);
486 PyErr_SetString(PyExc_ValueError
, "tuple.index(x): x not in list");
491 tuplecount(PyTupleObject
*self
, PyObject
*v
)
493 Py_ssize_t count
= 0;
496 for (i
= 0; i
< Py_SIZE(self
); i
++) {
497 int cmp
= PyObject_RichCompareBool(self
->ob_item
[i
], v
, Py_EQ
);
503 return PyInt_FromSsize_t(count
);
507 tupletraverse(PyTupleObject
*o
, visitproc visit
, void *arg
)
511 for (i
= Py_SIZE(o
); --i
>= 0; )
512 Py_VISIT(o
->ob_item
[i
]);
517 tuplerichcompare(PyObject
*v
, PyObject
*w
, int op
)
519 PyTupleObject
*vt
, *wt
;
521 Py_ssize_t vlen
, wlen
;
523 if (!PyTuple_Check(v
) || !PyTuple_Check(w
)) {
524 Py_INCREF(Py_NotImplemented
);
525 return Py_NotImplemented
;
528 vt
= (PyTupleObject
*)v
;
529 wt
= (PyTupleObject
*)w
;
534 /* Note: the corresponding code for lists has an "early out" test
535 * here when op is EQ or NE and the lengths differ. That pays there,
536 * but Tim was unable to find any real code where EQ/NE tuple
537 * compares don't have the same length, so testing for it here would
538 * have cost without benefit.
541 /* Search for the first index where items are different.
542 * Note that because tuples are immutable, it's safe to reuse
543 * vlen and wlen across the comparison calls.
545 for (i
= 0; i
< vlen
&& i
< wlen
; i
++) {
546 int k
= PyObject_RichCompareBool(vt
->ob_item
[i
],
547 wt
->ob_item
[i
], Py_EQ
);
554 if (i
>= vlen
|| i
>= wlen
) {
555 /* No more items to compare -- compare sizes */
559 case Py_LT
: cmp
= vlen
< wlen
; break;
560 case Py_LE
: cmp
= vlen
<= wlen
; break;
561 case Py_EQ
: cmp
= vlen
== wlen
; break;
562 case Py_NE
: cmp
= vlen
!= wlen
; break;
563 case Py_GT
: cmp
= vlen
> wlen
; break;
564 case Py_GE
: cmp
= vlen
>= wlen
; break;
565 default: return NULL
; /* cannot happen */
575 /* We have an item that differs -- shortcuts for EQ/NE */
585 /* Compare the final item again using the proper operator */
586 return PyObject_RichCompare(vt
->ob_item
[i
], wt
->ob_item
[i
], op
);
590 tuple_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
);
593 tuple_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
595 PyObject
*arg
= NULL
;
596 static char *kwlist
[] = {"sequence", 0};
598 if (type
!= &PyTuple_Type
)
599 return tuple_subtype_new(type
, args
, kwds
);
600 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "|O:tuple", kwlist
, &arg
))
604 return PyTuple_New(0);
606 return PySequence_Tuple(arg
);
610 tuple_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
612 PyObject
*tmp
, *newobj
, *item
;
615 assert(PyType_IsSubtype(type
, &PyTuple_Type
));
616 tmp
= tuple_new(&PyTuple_Type
, args
, kwds
);
619 assert(PyTuple_Check(tmp
));
620 newobj
= type
->tp_alloc(type
, n
= PyTuple_GET_SIZE(tmp
));
623 for (i
= 0; i
< n
; i
++) {
624 item
= PyTuple_GET_ITEM(tmp
, i
);
626 PyTuple_SET_ITEM(newobj
, i
, item
);
632 PyDoc_STRVAR(tuple_doc
,
633 "tuple() -> an empty tuple\n"
634 "tuple(sequence) -> tuple initialized from sequence's items\n"
636 "If the argument is a tuple, the return value is the same object.");
638 static PySequenceMethods tuple_as_sequence
= {
639 (lenfunc
)tuplelength
, /* sq_length */
640 (binaryfunc
)tupleconcat
, /* sq_concat */
641 (ssizeargfunc
)tuplerepeat
, /* sq_repeat */
642 (ssizeargfunc
)tupleitem
, /* sq_item */
643 (ssizessizeargfunc
)tupleslice
, /* sq_slice */
645 0, /* sq_ass_slice */
646 (objobjproc
)tuplecontains
, /* sq_contains */
650 tuplesubscript(PyTupleObject
* self
, PyObject
* item
)
652 if (PyIndex_Check(item
)) {
653 Py_ssize_t i
= PyNumber_AsSsize_t(item
, PyExc_IndexError
);
654 if (i
== -1 && PyErr_Occurred())
657 i
+= PyTuple_GET_SIZE(self
);
658 return tupleitem(self
, i
);
660 else if (PySlice_Check(item
)) {
661 Py_ssize_t start
, stop
, step
, slicelength
, cur
, i
;
664 PyObject
**src
, **dest
;
666 if (PySlice_GetIndicesEx((PySliceObject
*)item
,
667 PyTuple_GET_SIZE(self
),
668 &start
, &stop
, &step
, &slicelength
) < 0) {
672 if (slicelength
<= 0) {
673 return PyTuple_New(0);
675 else if (start
== 0 && step
== 1 &&
676 slicelength
== PyTuple_GET_SIZE(self
) &&
677 PyTuple_CheckExact(self
)) {
679 return (PyObject
*)self
;
682 result
= PyTuple_New(slicelength
);
683 if (!result
) return NULL
;
686 dest
= ((PyTupleObject
*)result
)->ob_item
;
687 for (cur
= start
, i
= 0; i
< slicelength
;
698 PyErr_Format(PyExc_TypeError
,
699 "tuple indices must be integers, not %.200s",
700 Py_TYPE(item
)->tp_name
);
706 tuple_getnewargs(PyTupleObject
*v
)
708 return Py_BuildValue("(N)", tupleslice(v
, 0, Py_SIZE(v
)));
713 tuple_sizeof(PyTupleObject
*self
)
717 res
= PyTuple_Type
.tp_basicsize
+ Py_SIZE(self
) * sizeof(PyObject
*);
718 return PyInt_FromSsize_t(res
);
721 PyDoc_STRVAR(index_doc
,
722 "T.index(value, [start, [stop]]) -> integer -- return first index of value");
723 PyDoc_STRVAR(count_doc
,
724 "T.count(value) -> integer -- return number of occurrences of value");
725 PyDoc_STRVAR(sizeof_doc
,
726 "T.__sizeof__() -- size of T in memory, in bytes");
728 static PyMethodDef tuple_methods
[] = {
729 {"__getnewargs__", (PyCFunction
)tuple_getnewargs
, METH_NOARGS
},
730 {"__sizeof__", (PyCFunction
)tuple_sizeof
, METH_NOARGS
, sizeof_doc
},
731 {"index", (PyCFunction
)tupleindex
, METH_VARARGS
, index_doc
},
732 {"count", (PyCFunction
)tuplecount
, METH_O
, count_doc
},
733 {NULL
, NULL
} /* sentinel */
736 static PyMappingMethods tuple_as_mapping
= {
737 (lenfunc
)tuplelength
,
738 (binaryfunc
)tuplesubscript
,
742 static PyObject
*tuple_iter(PyObject
*seq
);
744 PyTypeObject PyTuple_Type
= {
745 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
747 sizeof(PyTupleObject
) - sizeof(PyObject
*),
749 (destructor
)tupledealloc
, /* tp_dealloc */
750 (printfunc
)tupleprint
, /* tp_print */
754 (reprfunc
)tuplerepr
, /* tp_repr */
755 0, /* tp_as_number */
756 &tuple_as_sequence
, /* tp_as_sequence */
757 &tuple_as_mapping
, /* tp_as_mapping */
758 (hashfunc
)tuplehash
, /* tp_hash */
761 PyObject_GenericGetAttr
, /* tp_getattro */
763 0, /* tp_as_buffer */
764 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
765 Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_TUPLE_SUBCLASS
, /* tp_flags */
766 tuple_doc
, /* tp_doc */
767 (traverseproc
)tupletraverse
, /* tp_traverse */
769 tuplerichcompare
, /* tp_richcompare */
770 0, /* tp_weaklistoffset */
771 tuple_iter
, /* tp_iter */
773 tuple_methods
, /* tp_methods */
778 0, /* tp_descr_get */
779 0, /* tp_descr_set */
780 0, /* tp_dictoffset */
783 tuple_new
, /* tp_new */
784 PyObject_GC_Del
, /* tp_free */
787 /* The following function breaks the notion that tuples are immutable:
788 it changes the size of a tuple. We get away with this only if there
789 is only one module referencing the object. You can also think of it
790 as creating a new tuple object and destroying the old one, only more
791 efficiently. In any case, don't use this if the tuple may already be
792 known to some other part of the code. */
795 _PyTuple_Resize(PyObject
**pv
, Py_ssize_t newsize
)
797 register PyTupleObject
*v
;
798 register PyTupleObject
*sv
;
802 v
= (PyTupleObject
*) *pv
;
803 if (v
== NULL
|| Py_TYPE(v
) != &PyTuple_Type
||
804 (Py_SIZE(v
) != 0 && Py_REFCNT(v
) != 1)) {
807 PyErr_BadInternalCall();
810 oldsize
= Py_SIZE(v
);
811 if (oldsize
== newsize
)
815 /* Empty tuples are often shared, so we should never
816 resize them in-place even if we do own the only
817 (current) reference */
819 *pv
= PyTuple_New(newsize
);
820 return *pv
== NULL
? -1 : 0;
823 /* XXX UNREF/NEWREF interface should be more symmetrical */
825 _PyObject_GC_UNTRACK(v
);
826 _Py_ForgetReference((PyObject
*) v
);
827 /* DECREF items deleted by shrinkage */
828 for (i
= newsize
; i
< oldsize
; i
++) {
829 Py_XDECREF(v
->ob_item
[i
]);
830 v
->ob_item
[i
] = NULL
;
832 sv
= PyObject_GC_Resize(PyTupleObject
, v
, newsize
);
838 _Py_NewReference((PyObject
*) sv
);
839 /* Zero out items added by growing */
840 if (newsize
> oldsize
)
841 memset(&sv
->ob_item
[oldsize
], 0,
842 sizeof(*sv
->ob_item
) * (newsize
- oldsize
));
843 *pv
= (PyObject
*) sv
;
844 _PyObject_GC_TRACK(sv
);
849 PyTuple_ClearFreeList(void)
851 int freelist_size
= 0;
852 #if PyTuple_MAXSAVESIZE > 0
854 for (i
= 1; i
< PyTuple_MAXSAVESIZE
; i
++) {
855 PyTupleObject
*p
, *q
;
857 freelist_size
+= numfree
[i
];
862 p
= (PyTupleObject
*)(p
->ob_item
[0]);
867 return freelist_size
;
873 #if PyTuple_MAXSAVESIZE > 0
874 /* empty tuples are used all over the place and applications may
875 * rely on the fact that an empty tuple is a singleton. */
876 Py_XDECREF(free_list
[0]);
879 (void)PyTuple_ClearFreeList();
883 /*********************** Tuple Iterator **************************/
888 PyTupleObject
*it_seq
; /* Set to NULL when iterator is exhausted */
892 tupleiter_dealloc(tupleiterobject
*it
)
894 _PyObject_GC_UNTRACK(it
);
895 Py_XDECREF(it
->it_seq
);
900 tupleiter_traverse(tupleiterobject
*it
, visitproc visit
, void *arg
)
902 Py_VISIT(it
->it_seq
);
907 tupleiter_next(tupleiterobject
*it
)
916 assert(PyTuple_Check(seq
));
918 if (it
->it_index
< PyTuple_GET_SIZE(seq
)) {
919 item
= PyTuple_GET_ITEM(seq
, it
->it_index
);
931 tupleiter_len(tupleiterobject
*it
)
935 len
= PyTuple_GET_SIZE(it
->it_seq
) - it
->it_index
;
936 return PyInt_FromSsize_t(len
);
939 PyDoc_STRVAR(length_hint_doc
, "Private method returning an estimate of len(list(it)).");
941 static PyMethodDef tupleiter_methods
[] = {
942 {"__length_hint__", (PyCFunction
)tupleiter_len
, METH_NOARGS
, length_hint_doc
},
943 {NULL
, NULL
} /* sentinel */
946 PyTypeObject PyTupleIter_Type
= {
947 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
948 "tupleiterator", /* tp_name */
949 sizeof(tupleiterobject
), /* tp_basicsize */
952 (destructor
)tupleiter_dealloc
, /* tp_dealloc */
958 0, /* tp_as_number */
959 0, /* tp_as_sequence */
960 0, /* tp_as_mapping */
964 PyObject_GenericGetAttr
, /* tp_getattro */
966 0, /* tp_as_buffer */
967 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
,/* tp_flags */
969 (traverseproc
)tupleiter_traverse
, /* tp_traverse */
971 0, /* tp_richcompare */
972 0, /* tp_weaklistoffset */
973 PyObject_SelfIter
, /* tp_iter */
974 (iternextfunc
)tupleiter_next
, /* tp_iternext */
975 tupleiter_methods
, /* tp_methods */
980 tuple_iter(PyObject
*seq
)
984 if (!PyTuple_Check(seq
)) {
985 PyErr_BadInternalCall();
988 it
= PyObject_GC_New(tupleiterobject
, &PyTupleIter_Type
);
993 it
->it_seq
= (PyTupleObject
*)seq
;
994 _PyObject_GC_TRACK(it
);
995 return (PyObject
*)it
;