2 /* Tuple object implementation */
6 /* Speed optimization to avoid frequent malloc/free of small tuples */
8 #define MAXSAVESIZE 20 /* Largest tuple to save on free list */
10 #ifndef MAXSAVEDTUPLES
11 #define MAXSAVEDTUPLES 2000 /* Maximum number of tuples of each size to save */
15 /* Entries 1 up to MAXSAVESIZE are free lists, entry 0 is the empty
16 tuple () of which at most one instance will be allocated.
18 static PyTupleObject
*free_tuples
[MAXSAVESIZE
];
19 static int num_free_tuples
[MAXSAVESIZE
];
22 int fast_tuple_allocs
;
23 int tuple_zero_allocs
;
27 PyTuple_New(register int size
)
29 register PyTupleObject
*op
;
32 PyErr_BadInternalCall();
36 if (size
== 0 && free_tuples
[0]) {
42 return (PyObject
*) op
;
44 if (size
< MAXSAVESIZE
&& (op
= free_tuples
[size
]) != NULL
) {
45 free_tuples
[size
] = (PyTupleObject
*) op
->ob_item
[0];
46 num_free_tuples
[size
]--;
50 /* Inline PyObject_InitVar */
53 op
->ob_type
= &PyTuple_Type
;
55 _Py_NewReference((PyObject
*)op
);
60 int 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
;
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();
93 return ((PyTupleObject
*)op
)->ob_size
;
97 PyTuple_GetItem(register PyObject
*op
, register int i
)
99 if (!PyTuple_Check(op
)) {
100 PyErr_BadInternalCall();
103 if (i
< 0 || i
>= ((PyTupleObject
*)op
) -> ob_size
) {
104 PyErr_SetString(PyExc_IndexError
, "tuple index out of range");
107 return ((PyTupleObject
*)op
) -> ob_item
[i
];
111 PyTuple_SetItem(register PyObject
*op
, register int 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
>= ((PyTupleObject
*)op
) -> ob_size
) {
122 PyErr_SetString(PyExc_IndexError
,
123 "tuple assignment index out of range");
126 p
= ((PyTupleObject
*)op
) -> ob_item
+ i
;
134 PyTuple_Pack(int 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
)
163 register int len
= op
->ob_size
;
164 PyObject_GC_UnTrack(op
);
165 Py_TRASHCAN_SAFE_BEGIN(op
)
169 Py_XDECREF(op
->ob_item
[i
]);
171 if (len
< MAXSAVESIZE
&&
172 num_free_tuples
[len
] < MAXSAVEDTUPLES
&&
173 op
->ob_type
== &PyTuple_Type
)
175 op
->ob_item
[0] = (PyObject
*) free_tuples
[len
];
176 num_free_tuples
[len
]++;
177 free_tuples
[len
] = op
;
178 goto done
; /* return */
182 op
->ob_type
->tp_free((PyObject
*)op
);
184 Py_TRASHCAN_SAFE_END(op
)
188 tupleprint(PyTupleObject
*op
, FILE *fp
, int flags
)
192 for (i
= 0; i
< op
->ob_size
; i
++) {
195 if (PyObject_Print(op
->ob_item
[i
], fp
, 0) != 0)
198 if (op
->ob_size
== 1)
205 tuplerepr(PyTupleObject
*v
)
209 PyObject
*pieces
, *result
= NULL
;
213 return PyString_FromString("()");
215 pieces
= PyTuple_New(n
);
219 /* Do repr() on each element. */
220 for (i
= 0; i
< n
; ++i
) {
221 s
= PyObject_Repr(v
->ob_item
[i
]);
224 PyTuple_SET_ITEM(pieces
, i
, s
);
227 /* Add "()" decorations to the first and last items. */
229 s
= PyString_FromString("(");
232 temp
= PyTuple_GET_ITEM(pieces
, 0);
233 PyString_ConcatAndDel(&s
, temp
);
234 PyTuple_SET_ITEM(pieces
, 0, s
);
238 s
= PyString_FromString(n
== 1 ? ",)" : ")");
241 temp
= PyTuple_GET_ITEM(pieces
, n
-1);
242 PyString_ConcatAndDel(&temp
, s
);
243 PyTuple_SET_ITEM(pieces
, n
-1, temp
);
247 /* Paste them all together with ", " between. */
248 s
= PyString_FromString(", ");
251 result
= _PyString_Join(s
, pieces
);
259 /* The addend 82520, was selected from the range(0, 1000000) for
260 generating the greatest number of prime multipliers for tuples
263 1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
264 1330111, 1412633, 1165069, 1247599, 1495177, 1577699
268 tuplehash(PyTupleObject
*v
)
271 register int len
= v
->ob_size
;
272 register PyObject
**p
;
273 long mult
= 1000003L;
277 y
= PyObject_Hash(*p
++);
281 mult
+= 82520L + len
+ len
;
290 tuplelength(PyTupleObject
*a
)
296 tuplecontains(PyTupleObject
*a
, PyObject
*el
)
300 for (i
= 0, cmp
= 0 ; cmp
== 0 && i
< a
->ob_size
; ++i
)
301 cmp
= PyObject_RichCompareBool(el
, PyTuple_GET_ITEM(a
, i
),
307 tupleitem(register PyTupleObject
*a
, register int i
)
309 if (i
< 0 || i
>= a
->ob_size
) {
310 PyErr_SetString(PyExc_IndexError
, "tuple index out of range");
313 Py_INCREF(a
->ob_item
[i
]);
314 return a
->ob_item
[i
];
318 tupleslice(register PyTupleObject
*a
, register int ilow
, register int ihigh
)
320 register PyTupleObject
*np
;
321 PyObject
**src
, **dest
;
326 if (ihigh
> a
->ob_size
)
330 if (ilow
== 0 && ihigh
== a
->ob_size
&& 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
, int i
, int 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
)
363 PyObject
**src
, **dest
;
365 if (!PyTuple_Check(bb
)) {
366 PyErr_Format(PyExc_TypeError
,
367 "can only concatenate tuple (not \"%.200s\") to tuple",
368 bb
->ob_type
->tp_name
);
371 #define b ((PyTupleObject *)bb)
372 size
= a
->ob_size
+ b
->ob_size
;
374 return PyErr_NoMemory();
375 np
= (PyTupleObject
*) PyTuple_New(size
);
381 for (i
= 0; i
< a
->ob_size
; i
++) {
382 PyObject
*v
= src
[i
];
387 dest
= np
->ob_item
+ a
->ob_size
;
388 for (i
= 0; i
< b
->ob_size
; i
++) {
389 PyObject
*v
= src
[i
];
393 return (PyObject
*)np
;
398 tuplerepeat(PyTupleObject
*a
, int n
)
403 PyObject
**p
, **items
;
406 if (a
->ob_size
== 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
= a
->ob_size
* n
;
417 if (size
/a
->ob_size
!= n
)
418 return PyErr_NoMemory();
419 np
= (PyTupleObject
*) PyTuple_New(size
);
424 for (i
= 0; i
< n
; i
++) {
425 for (j
= 0; j
< a
->ob_size
; j
++) {
431 return (PyObject
*) np
;
435 tupletraverse(PyTupleObject
*o
, visitproc visit
, void *arg
)
440 for (i
= o
->ob_size
; --i
>= 0; ) {
452 tuplerichcompare(PyObject
*v
, PyObject
*w
, int op
)
454 PyTupleObject
*vt
, *wt
;
458 if (!PyTuple_Check(v
) || !PyTuple_Check(w
)) {
459 Py_INCREF(Py_NotImplemented
);
460 return Py_NotImplemented
;
463 vt
= (PyTupleObject
*)v
;
464 wt
= (PyTupleObject
*)w
;
469 /* Note: the corresponding code for lists has an "early out" test
470 * here when op is EQ or NE and the lengths differ. That pays there,
471 * but Tim was unable to find any real code where EQ/NE tuple
472 * compares don't have the same length, so testing for it here would
473 * have cost without benefit.
476 /* Search for the first index where items are different.
477 * Note that because tuples are immutable, it's safe to reuse
478 * vlen and wlen across the comparison calls.
480 for (i
= 0; i
< vlen
&& i
< wlen
; i
++) {
481 int k
= PyObject_RichCompareBool(vt
->ob_item
[i
],
482 wt
->ob_item
[i
], Py_EQ
);
489 if (i
>= vlen
|| i
>= wlen
) {
490 /* No more items to compare -- compare sizes */
494 case Py_LT
: cmp
= vlen
< wlen
; break;
495 case Py_LE
: cmp
= vlen
<= wlen
; break;
496 case Py_EQ
: cmp
= vlen
== wlen
; break;
497 case Py_NE
: cmp
= vlen
!= wlen
; break;
498 case Py_GT
: cmp
= vlen
> wlen
; break;
499 case Py_GE
: cmp
= vlen
>= wlen
; break;
500 default: return NULL
; /* cannot happen */
510 /* We have an item that differs -- shortcuts for EQ/NE */
520 /* Compare the final item again using the proper operator */
521 return PyObject_RichCompare(vt
->ob_item
[i
], wt
->ob_item
[i
], op
);
525 tuple_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
);
528 tuple_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
530 PyObject
*arg
= NULL
;
531 static const char *kwlist
[] = {"sequence", 0};
533 if (type
!= &PyTuple_Type
)
534 return tuple_subtype_new(type
, args
, kwds
);
535 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "|O:tuple", kwlist
, &arg
))
539 return PyTuple_New(0);
541 return PySequence_Tuple(arg
);
545 tuple_subtype_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kwds
)
547 PyObject
*tmp
, *new, *item
;
550 assert(PyType_IsSubtype(type
, &PyTuple_Type
));
551 tmp
= tuple_new(&PyTuple_Type
, args
, kwds
);
554 assert(PyTuple_Check(tmp
));
555 new = type
->tp_alloc(type
, n
= PyTuple_GET_SIZE(tmp
));
558 for (i
= 0; i
< n
; i
++) {
559 item
= PyTuple_GET_ITEM(tmp
, i
);
561 PyTuple_SET_ITEM(new, i
, item
);
567 PyDoc_STRVAR(tuple_doc
,
568 "tuple() -> an empty tuple\n"
569 "tuple(sequence) -> tuple initialized from sequence's items\n"
571 "If the argument is a tuple, the return value is the same object.");
573 static PySequenceMethods tuple_as_sequence
= {
574 (inquiry
)tuplelength
, /* sq_length */
575 (binaryfunc
)tupleconcat
, /* sq_concat */
576 (intargfunc
)tuplerepeat
, /* sq_repeat */
577 (intargfunc
)tupleitem
, /* sq_item */
578 (intintargfunc
)tupleslice
, /* sq_slice */
580 0, /* sq_ass_slice */
581 (objobjproc
)tuplecontains
, /* sq_contains */
585 tuplesubscript(PyTupleObject
* self
, PyObject
* item
)
587 if (PyInt_Check(item
)) {
588 long i
= PyInt_AS_LONG(item
);
590 i
+= PyTuple_GET_SIZE(self
);
591 return tupleitem(self
, i
);
593 else if (PyLong_Check(item
)) {
594 long i
= PyLong_AsLong(item
);
595 if (i
== -1 && PyErr_Occurred())
598 i
+= PyTuple_GET_SIZE(self
);
599 return tupleitem(self
, i
);
601 else if (PySlice_Check(item
)) {
602 int start
, stop
, step
, slicelength
, cur
, i
;
605 PyObject
**src
, **dest
;
607 if (PySlice_GetIndicesEx((PySliceObject
*)item
,
608 PyTuple_GET_SIZE(self
),
609 &start
, &stop
, &step
, &slicelength
) < 0) {
613 if (slicelength
<= 0) {
614 return PyTuple_New(0);
617 result
= PyTuple_New(slicelength
);
620 dest
= ((PyTupleObject
*)result
)->ob_item
;
621 for (cur
= start
, i
= 0; i
< slicelength
;
632 PyErr_SetString(PyExc_TypeError
,
633 "tuple indices must be integers");
639 tuple_getnewargs(PyTupleObject
*v
)
641 return Py_BuildValue("(N)", tupleslice(v
, 0, v
->ob_size
));
645 static PyMethodDef tuple_methods
[] = {
646 {"__getnewargs__", (PyCFunction
)tuple_getnewargs
, METH_NOARGS
},
647 {NULL
, NULL
} /* sentinel */
650 static PyMappingMethods tuple_as_mapping
= {
651 (inquiry
)tuplelength
,
652 (binaryfunc
)tuplesubscript
,
656 static PyObject
*tuple_iter(PyObject
*seq
);
658 PyTypeObject PyTuple_Type
= {
659 PyObject_HEAD_INIT(&PyType_Type
)
662 sizeof(PyTupleObject
) - sizeof(PyObject
*),
664 (destructor
)tupledealloc
, /* tp_dealloc */
665 (printfunc
)tupleprint
, /* tp_print */
669 (reprfunc
)tuplerepr
, /* tp_repr */
670 0, /* tp_as_number */
671 &tuple_as_sequence
, /* tp_as_sequence */
672 &tuple_as_mapping
, /* tp_as_mapping */
673 (hashfunc
)tuplehash
, /* tp_hash */
676 PyObject_GenericGetAttr
, /* tp_getattro */
678 0, /* tp_as_buffer */
679 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
680 Py_TPFLAGS_BASETYPE
, /* tp_flags */
681 tuple_doc
, /* tp_doc */
682 (traverseproc
)tupletraverse
, /* tp_traverse */
684 tuplerichcompare
, /* tp_richcompare */
685 0, /* tp_weaklistoffset */
686 tuple_iter
, /* tp_iter */
688 tuple_methods
, /* tp_methods */
693 0, /* tp_descr_get */
694 0, /* tp_descr_set */
695 0, /* tp_dictoffset */
698 tuple_new
, /* tp_new */
699 PyObject_GC_Del
, /* tp_free */
702 /* The following function breaks the notion that tuples are immutable:
703 it changes the size of a tuple. We get away with this only if there
704 is only one module referencing the object. You can also think of it
705 as creating a new tuple object and destroying the old one, only more
706 efficiently. In any case, don't use this if the tuple may already be
707 known to some other part of the code. */
710 _PyTuple_Resize(PyObject
**pv
, int newsize
)
712 register PyTupleObject
*v
;
713 register PyTupleObject
*sv
;
717 v
= (PyTupleObject
*) *pv
;
718 if (v
== NULL
|| v
->ob_type
!= &PyTuple_Type
||
719 (v
->ob_size
!= 0 && v
->ob_refcnt
!= 1)) {
722 PyErr_BadInternalCall();
725 oldsize
= v
->ob_size
;
726 if (oldsize
== newsize
)
730 /* Empty tuples are often shared, so we should never
731 resize them in-place even if we do own the only
732 (current) reference */
734 *pv
= PyTuple_New(newsize
);
735 return *pv
== NULL
? -1 : 0;
738 /* XXX UNREF/NEWREF interface should be more symmetrical */
740 _PyObject_GC_UNTRACK(v
);
741 _Py_ForgetReference((PyObject
*) v
);
742 /* DECREF items deleted by shrinkage */
743 for (i
= newsize
; i
< oldsize
; i
++) {
744 Py_XDECREF(v
->ob_item
[i
]);
745 v
->ob_item
[i
] = NULL
;
747 sv
= PyObject_GC_Resize(PyTupleObject
, v
, newsize
);
753 _Py_NewReference((PyObject
*) sv
);
754 /* Zero out items added by growing */
755 if (newsize
> oldsize
)
756 memset(&sv
->ob_item
[oldsize
], 0,
757 sizeof(*sv
->ob_item
) * (newsize
- oldsize
));
758 *pv
= (PyObject
*) sv
;
759 _PyObject_GC_TRACK(sv
);
769 Py_XDECREF(free_tuples
[0]);
770 free_tuples
[0] = NULL
;
772 for (i
= 1; i
< MAXSAVESIZE
; i
++) {
773 PyTupleObject
*p
, *q
;
775 free_tuples
[i
] = NULL
;
778 p
= (PyTupleObject
*)(p
->ob_item
[0]);
785 /*********************** Tuple Iterator **************************/
790 PyTupleObject
*it_seq
; /* Set to NULL when iterator is exhausted */
793 PyTypeObject PyTupleIter_Type
;
796 tuple_iter(PyObject
*seq
)
800 if (!PyTuple_Check(seq
)) {
801 PyErr_BadInternalCall();
804 it
= PyObject_GC_New(tupleiterobject
, &PyTupleIter_Type
);
809 it
->it_seq
= (PyTupleObject
*)seq
;
810 _PyObject_GC_TRACK(it
);
811 return (PyObject
*)it
;
815 tupleiter_dealloc(tupleiterobject
*it
)
817 _PyObject_GC_UNTRACK(it
);
818 Py_XDECREF(it
->it_seq
);
823 tupleiter_traverse(tupleiterobject
*it
, visitproc visit
, void *arg
)
825 if (it
->it_seq
== NULL
)
827 return visit((PyObject
*)it
->it_seq
, arg
);
831 tupleiter_next(tupleiterobject
*it
)
840 assert(PyTuple_Check(seq
));
842 if (it
->it_index
< PyTuple_GET_SIZE(seq
)) {
843 item
= PyTuple_GET_ITEM(seq
, it
->it_index
);
855 tupleiter_len(tupleiterobject
*it
)
859 len
= PyTuple_GET_SIZE(it
->it_seq
) - it
->it_index
;
860 return PyInt_FromLong(len
);
863 PyDoc_STRVAR(length_cue_doc
, "Private method returning an estimate of len(list(it)).");
865 static PyMethodDef tupleiter_methods
[] = {
866 {"_length_cue", (PyCFunction
)tupleiter_len
, METH_NOARGS
, length_cue_doc
},
867 {NULL
, NULL
} /* sentinel */
870 PyTypeObject PyTupleIter_Type
= {
871 PyObject_HEAD_INIT(&PyType_Type
)
873 "tupleiterator", /* tp_name */
874 sizeof(tupleiterobject
), /* tp_basicsize */
877 (destructor
)tupleiter_dealloc
, /* tp_dealloc */
883 0, /* tp_as_number */
884 0, /* tp_as_sequence */
885 0, /* tp_as_mapping */
889 PyObject_GenericGetAttr
, /* tp_getattro */
891 0, /* tp_as_buffer */
892 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
,/* tp_flags */
894 (traverseproc
)tupleiter_traverse
, /* tp_traverse */
896 0, /* tp_richcompare */
897 0, /* tp_weaklistoffset */
898 PyObject_SelfIter
, /* tp_iter */
899 (iternextfunc
)tupleiter_next
, /* tp_iternext */
900 tupleiter_methods
, /* tp_methods */